forked from OSchip/llvm-project
[X86] Add mayLoad flag to FARCALL*m/FARJMP memory instrutions. Add 'm' to the end of FARJMP64/FARCALL64 instruction names.
We never codegen them so this doesn't matter in practice. But sometimes someone comes along and tries to use these flags for something else. LIke the Load Value Inject inline assembly handling.
This commit is contained in:
parent
0cbe713c69
commit
bfd12c76eb
|
@ -193,14 +193,16 @@ let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
|
|||
"ljmp{l}\t$seg, $off", []>,
|
||||
OpSize32, Sched<[WriteJump]>;
|
||||
}
|
||||
def FARJMP64 : RI<0xFF, MRM5m, (outs), (ins opaquemem:$dst),
|
||||
"ljmp{q}\t{*}$dst", []>, Sched<[WriteJump]>, Requires<[In64BitMode]>;
|
||||
let mayLoad = 1 in {
|
||||
def FARJMP64m : RI<0xFF, MRM5m, (outs), (ins opaquemem:$dst),
|
||||
"ljmp{q}\t{*}$dst", []>, Sched<[WriteJump]>, Requires<[In64BitMode]>;
|
||||
|
||||
let AsmVariantName = "att" in
|
||||
def FARJMP16m : I<0xFF, MRM5m, (outs), (ins opaquemem:$dst),
|
||||
"ljmp{w}\t{*}$dst", []>, OpSize16, Sched<[WriteJumpLd]>;
|
||||
def FARJMP32m : I<0xFF, MRM5m, (outs), (ins opaquemem:$dst),
|
||||
"{l}jmp{l}\t{*}$dst", []>, OpSize32, Sched<[WriteJumpLd]>;
|
||||
let AsmVariantName = "att" in
|
||||
def FARJMP16m : I<0xFF, MRM5m, (outs), (ins opaquemem:$dst),
|
||||
"ljmp{w}\t{*}$dst", []>, OpSize16, Sched<[WriteJumpLd]>;
|
||||
def FARJMP32m : I<0xFF, MRM5m, (outs), (ins opaquemem:$dst),
|
||||
"{l}jmp{l}\t{*}$dst", []>, OpSize32, Sched<[WriteJumpLd]>;
|
||||
}
|
||||
}
|
||||
|
||||
// Loop instructions
|
||||
|
@ -275,10 +277,12 @@ let isCall = 1 in
|
|||
OpSize32, Sched<[WriteJump]>;
|
||||
}
|
||||
|
||||
def FARCALL16m : I<0xFF, MRM3m, (outs), (ins opaquemem:$dst),
|
||||
"lcall{w}\t{*}$dst", []>, OpSize16, Sched<[WriteJumpLd]>;
|
||||
def FARCALL32m : I<0xFF, MRM3m, (outs), (ins opaquemem:$dst),
|
||||
"{l}call{l}\t{*}$dst", []>, OpSize32, Sched<[WriteJumpLd]>;
|
||||
let mayLoad = 1 in {
|
||||
def FARCALL16m : I<0xFF, MRM3m, (outs), (ins opaquemem:$dst),
|
||||
"lcall{w}\t{*}$dst", []>, OpSize16, Sched<[WriteJumpLd]>;
|
||||
def FARCALL32m : I<0xFF, MRM3m, (outs), (ins opaquemem:$dst),
|
||||
"{l}call{l}\t{*}$dst", []>, OpSize32, Sched<[WriteJumpLd]>;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -351,7 +355,8 @@ let isCall = 1, Uses = [RSP, SSP], SchedRW = [WriteJump] in {
|
|||
Requires<[In64BitMode,FavorMemIndirectCall]>, NOTRACK;
|
||||
}
|
||||
|
||||
def FARCALL64 : RI<0xFF, MRM3m, (outs), (ins opaquemem:$dst),
|
||||
let mayLoad = 1 in
|
||||
def FARCALL64m : RI<0xFF, MRM3m, (outs), (ins opaquemem:$dst),
|
||||
"lcall{q}\t{*}$dst", []>;
|
||||
}
|
||||
|
||||
|
|
|
@ -989,7 +989,7 @@ def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
|
|||
let NumMicroOps = 2;
|
||||
let ResourceCycles = [1,1];
|
||||
}
|
||||
def: InstRW<[BWWriteResGroup62], (instrs FARJMP64)>;
|
||||
def: InstRW<[BWWriteResGroup62], (instrs FARJMP64m)>;
|
||||
def: InstRW<[BWWriteResGroup62], (instregex "JMP(16|32|64)m")>;
|
||||
|
||||
def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
|
||||
|
@ -1130,7 +1130,7 @@ def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort
|
|||
let ResourceCycles = [1,1,1,1,1];
|
||||
}
|
||||
def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m")>;
|
||||
def: InstRW<[BWWriteResGroup89], (instrs FARCALL64)>;
|
||||
def: InstRW<[BWWriteResGroup89], (instrs FARCALL64m)>;
|
||||
|
||||
def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
|
||||
let Latency = 7;
|
||||
|
|
|
@ -999,7 +999,7 @@ def HWWriteResGroup14 : SchedWriteRes<[HWPort6,HWPort23]> {
|
|||
let NumMicroOps = 2;
|
||||
let ResourceCycles = [1,1];
|
||||
}
|
||||
def: InstRW<[HWWriteResGroup14], (instrs FARJMP64)>;
|
||||
def: InstRW<[HWWriteResGroup14], (instrs FARJMP64m)>;
|
||||
def: InstRW<[HWWriteResGroup14], (instregex "JMP(16|32|64)m")>;
|
||||
|
||||
def HWWriteResGroup16 : SchedWriteRes<[HWPort23,HWPort15]> {
|
||||
|
@ -1208,7 +1208,7 @@ def HWWriteResGroup48 : SchedWriteRes<[HWPort4,HWPort6,HWPort23,HWPort237,HWPort
|
|||
let ResourceCycles = [1,1,1,1,1];
|
||||
}
|
||||
def: InstRW<[HWWriteResGroup48], (instregex "CALL(16|32|64)m")>;
|
||||
def: InstRW<[HWWriteResGroup48], (instrs FARCALL64)>;
|
||||
def: InstRW<[HWWriteResGroup48], (instrs FARCALL64m)>;
|
||||
|
||||
def HWWriteResGroup50 : SchedWriteRes<[HWPort1]> {
|
||||
let Latency = 3;
|
||||
|
|
|
@ -884,7 +884,7 @@ def SBWriteResGroup64 : SchedWriteRes<[SBPort5,SBPort01,SBPort23]> {
|
|||
let NumMicroOps = 3;
|
||||
let ResourceCycles = [1,1,1];
|
||||
}
|
||||
def: InstRW<[SBWriteResGroup64], (instrs FARJMP64)>;
|
||||
def: InstRW<[SBWriteResGroup64], (instrs FARJMP64m)>;
|
||||
|
||||
def SBWriteResGroup66 : SchedWriteRes<[SBPort0,SBPort4,SBPort23]> {
|
||||
let Latency = 7;
|
||||
|
@ -970,7 +970,7 @@ def SBWriteResGroup87 : SchedWriteRes<[SBPort4,SBPort5,SBPort01,SBPort23]> {
|
|||
let NumMicroOps = 5;
|
||||
let ResourceCycles = [1,1,1,2];
|
||||
}
|
||||
def: InstRW<[SBWriteResGroup87], (instrs FARCALL64)>;
|
||||
def: InstRW<[SBWriteResGroup87], (instrs FARCALL64m)>;
|
||||
|
||||
def SBWriteResGroup93 : SchedWriteRes<[SBPort0,SBPort1,SBPort23]> {
|
||||
let Latency = 9;
|
||||
|
|
|
@ -1015,7 +1015,7 @@ def SKLWriteResGroup72 : SchedWriteRes<[SKLPort6,SKLPort23]> {
|
|||
let NumMicroOps = 2;
|
||||
let ResourceCycles = [1,1];
|
||||
}
|
||||
def: InstRW<[SKLWriteResGroup72], (instrs FARJMP64)>;
|
||||
def: InstRW<[SKLWriteResGroup72], (instrs FARJMP64m)>;
|
||||
def: InstRW<[SKLWriteResGroup72], (instregex "JMP(16|32|64)m")>;
|
||||
|
||||
def SKLWriteResGroup75 : SchedWriteRes<[SKLPort23,SKLPort15]> {
|
||||
|
@ -1196,7 +1196,7 @@ def SKLWriteResGroup102 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,
|
|||
let ResourceCycles = [1,1,1,1,1];
|
||||
}
|
||||
def: InstRW<[SKLWriteResGroup102], (instregex "CALL(16|32|64)m")>;
|
||||
def: InstRW<[SKLWriteResGroup102], (instrs FARCALL64)>;
|
||||
def: InstRW<[SKLWriteResGroup102], (instrs FARCALL64m)>;
|
||||
|
||||
def SKLWriteResGroup103 : SchedWriteRes<[SKLPort6,SKLPort06,SKLPort15,SKLPort0156]> {
|
||||
let Latency = 7;
|
||||
|
|
|
@ -1182,7 +1182,7 @@ def SKXWriteResGroup76 : SchedWriteRes<[SKXPort6,SKXPort23]> {
|
|||
let NumMicroOps = 2;
|
||||
let ResourceCycles = [1,1];
|
||||
}
|
||||
def: InstRW<[SKXWriteResGroup76], (instrs FARJMP64)>;
|
||||
def: InstRW<[SKXWriteResGroup76], (instrs FARJMP64m)>;
|
||||
def: InstRW<[SKXWriteResGroup76], (instregex "JMP(16|32|64)m")>;
|
||||
|
||||
def SKXWriteResGroup79 : SchedWriteRes<[SKXPort23,SKXPort15]> {
|
||||
|
@ -1467,7 +1467,7 @@ def SKXWriteResGroup109 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,
|
|||
let ResourceCycles = [1,1,1,1,1];
|
||||
}
|
||||
def: InstRW<[SKXWriteResGroup109], (instregex "CALL(16|32|64)m")>;
|
||||
def: InstRW<[SKXWriteResGroup109], (instrs FARCALL64)>;
|
||||
def: InstRW<[SKXWriteResGroup109], (instrs FARCALL64m)>;
|
||||
|
||||
def SKXWriteResGroup110 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
|
||||
let Latency = 7;
|
||||
|
|
|
@ -873,10 +873,10 @@ void X86SpeculativeLoadHardeningPass::unfoldCallAndJumpLoads(
|
|||
|
||||
case X86::FARCALL16m:
|
||||
case X86::FARCALL32m:
|
||||
case X86::FARCALL64:
|
||||
case X86::FARCALL64m:
|
||||
case X86::FARJMP16m:
|
||||
case X86::FARJMP32m:
|
||||
case X86::FARJMP64:
|
||||
case X86::FARJMP64m:
|
||||
// We cannot mitigate far jumps or calls, but we also don't expect them
|
||||
// to be vulnerable to Spectre v1.2 style attacks.
|
||||
continue;
|
||||
|
@ -999,7 +999,7 @@ X86SpeculativeLoadHardeningPass::tracePredStateThroughIndirectBranches(
|
|||
|
||||
case X86::FARJMP16m:
|
||||
case X86::FARJMP32m:
|
||||
case X86::FARJMP64:
|
||||
case X86::FARJMP64m:
|
||||
// We cannot mitigate far jumps or calls, but we also don't expect them
|
||||
// to be vulnerable to Spectre v1.2 or v2 (self trained) style attacks.
|
||||
continue;
|
||||
|
@ -2221,10 +2221,10 @@ void X86SpeculativeLoadHardeningPass::hardenIndirectCallOrJumpInstr(
|
|||
switch (MI.getOpcode()) {
|
||||
case X86::FARCALL16m:
|
||||
case X86::FARCALL32m:
|
||||
case X86::FARCALL64:
|
||||
case X86::FARCALL64m:
|
||||
case X86::FARJMP16m:
|
||||
case X86::FARJMP32m:
|
||||
case X86::FARJMP64:
|
||||
case X86::FARJMP64m:
|
||||
// We don't need to harden either far calls or far jumps as they are
|
||||
// safe from Spectre.
|
||||
return;
|
||||
|
|
Loading…
Reference in New Issue