Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/arch/x86/include/asm/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 2 kB image not shown  

Quelle  ibt.h   Sprache: C

 
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _ASM_X86_IBT_H
#define _ASM_X86_IBT_H

#include <linux/types.h>

/*
 * 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.
 */

#if defined(CONFIG_X86_KERNEL_IBT) && !defined(__DISABLE_EXPORTS)

#define HAS_KERNEL_IBT 1

#ifndef __ASSEMBLER__

#ifdef CONFIG_X86_64
#define ASM_ENDBR "endbr64\n\t"
#else
#define ASM_ENDBR "endbr32\n\t"
#endif

#define __noendbr __attribute__((nocf_check))

/*
 * 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"

static __always_inline __attribute_const__ u32 gen_endbr(void)
{
 u32 endbr;

 /*
 * 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) */
}

static inline bool __is_endbr(u32 val)
{
 if (val == gen_endbr_poison())
  return true;

 /* See cfi_fineibt_bhi_preamble() */
 if (IS_ENABLED(CONFIG_FINEIBT_BHI) && val == 0x001f0ff5)
  return true;

 val &= ~0x01000000U; /* ENDBR32 -> ENDBR64 */
 return val == gen_endbr();
}

extern __noendbr bool is_endbr(u32 *val);
extern __noendbr u64 ibt_save(bool disable);
extern __noendbr void ibt_restore(u64 save);

#else /* __ASSEMBLER__ */

#ifdef CONFIG_X86_64
#define ENDBR endbr64
#else
#define ENDBR endbr32
#endif

#endif /* __ASSEMBLER__ */

#else /* !IBT */

#define HAS_KERNEL_IBT 0

#ifndef __ASSEMBLER__

#define ASM_ENDBR
#define IBT_NOSEAL(name)

#define __noendbr

static inline bool is_endbr(u32 *val) { return false; }

static inline u64 ibt_save(bool disable) { return 0; }
static inline void ibt_restore(u64 save) { }

#else /* __ASSEMBLER__ */

#define ENDBR

#endif /* __ASSEMBLER__ */

#endif /* CONFIG_X86_KERNEL_IBT */

#define ENDBR_INSN_SIZE  (4*HAS_KERNEL_IBT)

#endif /* _ASM_X86_IBT_H */

Messung V0.5
C=85 H=89 G=86

¤ Dauer der Verarbeitung: 0.4 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

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.