diff options
| author | 2019-04-02 03:02:47 +0000 | |
|---|---|---|
| committer | 2019-04-02 03:02:47 +0000 | |
| commit | d42b47acf41881ef484aed8ff0999ed80cf161e7 (patch) | |
| tree | e7f664e223fd679b2df60fc5c617d7acd4d8c4e7 | |
| parent | Add human readable parsing/display of RFC1035 data in domain-search (diff) | |
| download | wireguard-openbsd-d42b47acf41881ef484aed8ff0999ed80cf161e7.tar.xz wireguard-openbsd-d42b47acf41881ef484aed8ff0999ed80cf161e7.zip | |
Emit variable length trap padding in retguard epilogue.
This adds more trap padding before the return while ensuring that the
return is still in the same cache line.
ok deraadt@
| -rw-r--r-- | gnu/llvm/lib/Target/X86/X86MCInstLower.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/gnu/llvm/lib/Target/X86/X86MCInstLower.cpp b/gnu/llvm/lib/Target/X86/X86MCInstLower.cpp index bcb5a788f08..73d99c08052 100644 --- a/gnu/llvm/lib/Target/X86/X86MCInstLower.cpp +++ b/gnu/llvm/lib/Target/X86/X86MCInstLower.cpp @@ -1832,11 +1832,32 @@ void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) { return; case X86::RETGUARD_JMP_TRAP: { + // Make a symbol for the end of the trapsled and emit a jump to it MCSymbol *RGSuccSym = OutContext.createTempSymbol(); const MCExpr *RGSuccExpr = MCSymbolRefExpr::create(RGSuccSym, OutContext); EmitAndCountInstruction(MCInstBuilder(X86::JE_1).addExpr(RGSuccExpr)); + + // Emit at least two trap instructions EmitAndCountInstruction(MCInstBuilder(X86::INT3)); EmitAndCountInstruction(MCInstBuilder(X86::INT3)); + + // Now .fill up to 0xe byte, so the ret happens on 0xf + MCSymbol *Dot = OutContext.createTempSymbol(); + OutStreamer->EmitLabel(Dot); + const MCExpr *DotE = MCSymbolRefExpr::create(Dot, OutContext); + const MCExpr *BaseE = MCSymbolRefExpr::create( + TM.getSymbol(&MF->getFunction()), OutContext); + // .fill (0xf - ((DotE - BaseE) & 0xf)), 1, 0xcc + const MCExpr *FillE = MCBinaryExpr::createSub( + MCConstantExpr::create(0xf, OutContext), + MCBinaryExpr::createAnd( + MCBinaryExpr::createSub(DotE, BaseE, OutContext), + MCConstantExpr::create(0xf, OutContext), + OutContext), + OutContext); + OutStreamer->emitFill(*FillE, 0xCC); + + // And finally emit the jump target symbol OutStreamer->EmitLabel(RGSuccSym); return; } |
