/* * The rules for enabling IBT are: * * - CC_HAS_IBT: the toolchain supports it * - X86_KERNEL_IBT: it is selected in Kconfig * - !__DISABLE_EXPORTS: this is regular kernel code * * Esp. that latter one is a bit non-obvious, but some code like compressed, * purgatory, realmode etc.. is built with custom CFLAGS that do not include * -fcf-protection=branch and things will go *bang*. * * When all the above are satisfied, HAS_KERNEL_IBT will be 1, otherwise 0.
*/ #ifdefined(CONFIG_X86_KERNEL_IBT) && !defined(__DISABLE_EXPORTS)
/* * Create a dummy function pointer reference to prevent objtool from marking * the function as needing to be "sealed" (i.e. ENDBR converted to NOP by * apply_seal_endbr()).
*/ #define IBT_NOSEAL(fname) \ ".pushsection .discard.ibt_endbr_noseal\n\t" \
_ASM_PTR fname "\n\t" \ ".popsection\n\t"
/* * Generate ENDBR64 in a way that is sure to not result in * an ENDBR64 instruction as immediate.
*/ asm ( "mov $~0xfa1e0ff3, %[endbr]\n\t" "not %[endbr]\n\t"
: [endbr] "=&r" (endbr) );
return endbr;
}
static __always_inline __attribute_const__ u32 gen_endbr_poison(void)
{ /* * 4 byte NOP that isn't NOP4 (in fact it is OSP NOP3), such that it * will be unique to (former) ENDBR sites.
*/ return 0x001f0f66; /* osp nopl (%rax) */
}
staticinlinebool __is_endbr(u32 val)
{ if (val == gen_endbr_poison()) returntrue;
/* See cfi_fineibt_bhi_preamble() */ if (IS_ENABLED(CONFIG_FINEIBT_BHI) && val == 0x001f0ff5) returntrue;
val &= ~0x01000000U; /* ENDBR32 -> ENDBR64 */ return val == gen_endbr();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.