From nobody Fri Dec 19 14:22:18 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 58A7D2E173B for ; Sat, 6 Dec 2025 21:42:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765057327; cv=none; b=hCMg1rmC8kVMlFjMcF4xTCTrHXEH743VioZ1OMNzI9aWLDgeu7Ohza1d0mu27dZLFekVURh2GH2RkU8OSZFwWBFpG6Wg9hbP3NFcBOljVdfXYyIeIJicI1XVsEvhgc+IiFv88K52YxDXSe3bv++e8R96RHw29M2suBmeysAcuec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765057327; c=relaxed/simple; bh=2xktyaXuxUeQFy7UbEKrdepYfkra9ijqMI+msvWBMyY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=T0XCwAOlPhG2qQbvyIuzNNofVpClTZaeyba4YRmgJfvIdN1Jo9S6flYQqpUQ4Mo2fbFeT5UT8qAieF1TgLVT5q2Os54icOnv3SS9TjPNmbruV4Xf6mZe0WQfeCqJT8Vbs2O/Olv4hcOR9f6szEGpXiySrrl8e2Cruk8Qi+bfC1o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bWQM05Yb; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bWQM05Yb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3DC5EC4CEF5; Sat, 6 Dec 2025 21:42:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1765057326; bh=2xktyaXuxUeQFy7UbEKrdepYfkra9ijqMI+msvWBMyY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bWQM05Yb5w2Nbocl1vxq28Kd0xapOU1/WpIR3MQPdN5daUSnyi6CAWvyxTfQloMQB a1ZGIG58YvpTWMkswhmrjVmjhsxh8bw18PhGy8nANdGcLp5ME/hiDwGBggRit+mwaS Ndxe3Kn4ba7/CshB/5mKXvtcPVHNFwBDxCkZED7hmrmsZ64gjOPyNJuxrqF/rm2rWP lqhphn2Fl1TdjhHfrsGlRTHpYBF0XoZcYrcQfqgATSjuO16ohM8g8vuY1lf4sl2cUC WkhGl8liC20Tv3kgTkvzuD/pwI69WxagGLaoKFY15JxEndG8pSqd6pQcC/IfT4vVKQ Fi5GpZRF95ASQ== From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, Linus Torvalds , Ingo Molnar , Peter Zijlstra , Borislav Petkov , Thomas Gleixner Subject: [PATCH 5/8] objtool: Convert annotations to assembler macros Date: Sat, 6 Dec 2025 13:41:12 -0800 Message-ID: <28e63e2c890661dc9bcdbe172eba06b26220d455.1765044697.git.jpoimboe@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Improve code generation readability by converting the objtool annotations into assembler macros which are created when annotate.h is included. Before: .pushsection .discard.annotate_insn, "M", @progbits, 8; .long 1b - ., 8; = .popsection After: ANNOTATE_REACHABLE loc=3D1b Signed-off-by: Josh Poimboeuf --- arch/x86/include/asm/asm.h | 8 +- arch/x86/include/asm/jump_label.h | 1 + include/linux/annotate.h | 132 +++++++++++++++--------------- 3 files changed, 72 insertions(+), 69 deletions(-) diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h index 0e8c611bc9e2..770321c908e5 100644 --- a/arch/x86/include/asm/asm.h +++ b/arch/x86/include/asm/asm.h @@ -2,15 +2,15 @@ #ifndef _ASM_X86_ASM_H #define _ASM_X86_ASM_H =20 -#include - #ifdef __ASSEMBLER__ +# define __ASM_C(a,b) a # define __ASM_FORM(x, ...) x,## __VA_ARGS__ # define __ASM_FORM_RAW(x, ...) x,## __VA_ARGS__ # define __ASM_FORM_COMMA(x, ...) x,## __VA_ARGS__, # define __ASM_REGPFX % #else #include +# define __ASM_C(a,b) b # define __ASM_FORM(x, ...) " " __stringify(x,##__VA_ARGS__) " " # define __ASM_FORM_RAW(x, ...) __stringify(x,##__VA_ARGS__) # define __ASM_FORM_COMMA(x, ...) " " __stringify(x,##__VA_ARGS__) "," @@ -115,6 +115,10 @@ =20 #endif =20 +#define DEFINE_MACRO(name) \ + __ASM_C(DEFINE_ ## name, \ + asm(__stringify(DEFINE_ ## name))) + #ifndef __ASSEMBLER__ static __always_inline __pure void *rip_rel_ptr(void *p) { diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_= label.h index 05b16299588d..d34a16a4d305 100644 --- a/arch/x86/include/asm/jump_label.h +++ b/arch/x86/include/asm/jump_label.h @@ -11,6 +11,7 @@ =20 #include #include +#include =20 #define JUMP_TABLE_ENTRY(key, label) \ ".pushsection __jump_table, \"aw\" \n\t" \ diff --git a/include/linux/annotate.h b/include/linux/annotate.h index 1678410efa1b..8b28f1a81ec4 100644 --- a/include/linux/annotate.h +++ b/include/linux/annotate.h @@ -3,53 +3,43 @@ #define _LINUX_ANNOTATE_H =20 #include +#include +#include + +#define DEFINE___ANNOTATE \ + .macro __ANNOTATE sec, type, loc; \ + .pushsection __ASM_C(\sec, \\sec), "M", @progbits, 8; \ + .long __ASM_C(\loc, \\loc) - .; \ + .long __ASM_C(\type, \\type); \ + .popsection; \ + .endm + +#define __DEFINE_ANNOTATE(sec, name, type) \ + .macro name loc=3D910b; \ + 910: __ANNOTATE sec, type, __ASM_C(\loc, \\loc); \ + .endm + +#define DEFINE_ANNOTATE(type) \ + __DEFINE_ANNOTATE(.discard.annotate_insn, \ + ANNOTATE_ ## type, ANNOTYPE_ ## type) + +#define DEFINE_ANNOTATE_DATA(type) \ + __DEFINE_ANNOTATE(.discard.annotate_data, \ + ANNOTATE_ ## type, ANNOTYPE_ ## type) =20 #ifdef CONFIG_OBJTOOL =20 -#define __ASM_ANNOTATE(section, label, type) \ - .pushsection section, "M", @progbits, 8; \ - .long label - ., type; \ - .popsection - -#ifndef __ASSEMBLY__ - -#define ASM_ANNOTATE_LABEL(label, type) \ - __stringify(__ASM_ANNOTATE(.discard.annotate_insn, label, type)) - -#define ASM_ANNOTATE(type) \ - "911: " \ - __stringify(__ASM_ANNOTATE(.discard.annotate_insn, 911b, type)) - -#define ASM_ANNOTATE_DATA(type) \ - "912: " \ - __stringify(__ASM_ANNOTATE(.discard.annotate_data, 912b, type)) - -#else /* __ASSEMBLY__ */ - -.macro ANNOTATE type -.Lhere_\@: - __ASM_ANNOTATE(.discard.annotate_insn, .Lhere_\@, \type) -.endm - -.macro ANNOTATE_DATA type -.Lhere_\@: - __ASM_ANNOTATE(.discard.annotate_data, .Lhere_\@, \type) -.endm - -#endif /* __ASSEMBLY__ */ - -#else /* !CONFIG_OBJTOOL */ -#ifndef __ASSEMBLY__ -#define ASM_ANNOTATE_LABEL(label, type) "" -#define ASM_ANNOTATE(type) -#define ASM_ANNOTATE_DATA(type) -#else /* __ASSEMBLY__ */ -.macro ANNOTATE type -.endm -.macro ANNOTATE_DATA type -.endm -#endif /* __ASSEMBLY__ */ -#endif /* !CONFIG_OBJTOOL */ +DEFINE_MACRO(__ANNOTATE); +DEFINE_MACRO(ANNOTATE(NOENDBR)); +DEFINE_MACRO(ANNOTATE(RETPOLINE_SAFE)); +DEFINE_MACRO(ANNOTATE(INSTR_BEGIN)); +DEFINE_MACRO(ANNOTATE(INSTR_END)); +DEFINE_MACRO(ANNOTATE(IGNORE_ALTERNATIVE)); +DEFINE_MACRO(ANNOTATE(INTRA_FUNCTION_CALL)); +DEFINE_MACRO(ANNOTATE(UNRET_BEGIN)); +DEFINE_MACRO(ANNOTATE(REACHABLE)); +DEFINE_MACRO(ANNOTATE(NOCFI)); +DEFINE_MACRO(ANNOTATE_DATA(DATA_SPECIAL)); =20 #ifndef __ASSEMBLY__ =20 @@ -57,30 +47,30 @@ * Annotate away the various 'relocation to !ENDBR` complaints; knowing th= at * these relocations will never be used for indirect calls. */ -#define ANNOTATE_NOENDBR ASM_ANNOTATE(ANNOTYPE_NOENDBR) -#define ANNOTATE_NOENDBR_SYM(sym) asm(ASM_ANNOTATE_LABEL(sym, ANNOTYPE_NOE= NDBR)) +#define ANNOTATE_NOENDBR "ANNOTATE_NOENDBR" +#define ANNOTATE_NOENDBR_SYM(sym) asm("ANNOTATE_NOENDBR loc=3D" __stringif= y(sym)) =20 /* * This should be used immediately before an indirect jump/call. It tells * objtool the subsequent indirect jump/call is vouched safe for retpoline * builds. */ -#define ANNOTATE_RETPOLINE_SAFE ASM_ANNOTATE(ANNOTYPE_RETPOLINE_SAFE) +#define ANNOTATE_RETPOLINE_SAFE "ANNOTATE_RETPOLINE_SAFE" /* * See linux/instrumentation.h */ -#define ANNOTATE_INSTR_BEGIN(label) ASM_ANNOTATE_LABEL(label, ANNOTYPE_INS= TR_BEGIN) -#define ANNOTATE_INSTR_END(label) ASM_ANNOTATE_LABEL(label, ANNOTYPE_INSTR= _END) +#define ANNOTATE_INSTR_BEGIN(label) "ANNOTATE_INSTR_BEGIN loc=3D" __string= ify(label) +#define ANNOTATE_INSTR_END(label) "ANNOTATE_INSTR_END loc=3D" __stringify(= label) /* * objtool annotation to ignore the alternatives and only consider the ori= ginal * instruction(s). */ -#define ANNOTATE_IGNORE_ALTERNATIVE ASM_ANNOTATE(ANNOTYPE_IGNORE_ALTERNATI= VE) +#define ANNOTATE_IGNORE_ALTERNATIVE "ANNOTATE_IGNORE_ALTERNATIVE" /* * This macro indicates that the following intra-function call is valid. * Any non-annotated intra-function call will cause objtool to issue a war= ning. */ -#define ANNOTATE_INTRA_FUNCTION_CALL ASM_ANNOTATE(ANNOTYPE_INTRA_FUNCTION_= CALL) +#define ANNOTATE_INTRA_FUNCTION_CALL "ANNOTATE_INTRA_FUNCTION_CALL" /* * Use objtool to validate the entry requirement that all code paths do * VALIDATE_UNRET_END before RET. @@ -88,13 +78,13 @@ * NOTE: The macro must be used at the beginning of a global symbol, other= wise * it will be ignored. */ -#define ANNOTATE_UNRET_BEGIN ASM_ANNOTATE(ANNOTYPE_UNRET_BEGIN) +#define ANNOTATE_UNRET_BEGIN "ANNOTATE_UNRET_BEGIN" /* * This should be used to refer to an instruction that is considered * terminating, like a noreturn CALL or UD2 when we know they are not -- eg * WARN using UD2. */ -#define ANNOTATE_REACHABLE_LABEL(label) ASM_ANNOTATE_LABEL(label, ANNOTYPE= _REACHABLE) +#define ANNOTATE_REACHABLE_LABEL(label) "ANNOTATE_REACHABLE loc=3D" __stri= ngify(label) /* * This should not be used; it annotates away CFI violations. There are a = few * valid use cases like kexec handover to the next kernel image, and there= is @@ -103,25 +93,33 @@ * There are also a few real issues annotated away, like EFI because we ca= n't * control the EFI code. */ -#define ANNOTATE_NOCFI_SYM(sym) asm(ASM_ANNOTATE_LABEL(sym, ANNOTYPE_NOCF= I)) +#define ANNOTATE_NOCFI_SYM(sym) asm("ANNOTATE_NOCFI loc=3D" __stringify(s= ym)) =20 /* * Annotate a special section entry. This emables livepatch module genera= tion * to find and extract individual special section entries as needed. */ -#define ANNOTATE_DATA_SPECIAL ASM_ANNOTATE_DATA(ANNOTYPE_DATA_SPECIAL) +#define ANNOTATE_DATA_SPECIAL "ANNOTATE_DATA_SPECIAL" =20 -#else /* __ASSEMBLY__ */ -#define ANNOTATE_NOENDBR ANNOTATE type=3DANNOTYPE_NOENDBR -#define ANNOTATE_RETPOLINE_SAFE ANNOTATE type=3DANNOTYPE_RETPOLINE_SAFE -/* ANNOTATE_INSTR_BEGIN ANNOTATE type=3DANNOTYPE_INSTR_BEGIN */ -/* ANNOTATE_INSTR_END ANNOTATE type=3DANNOTYPE_INSTR_END */ -#define ANNOTATE_IGNORE_ALTERNATIVE ANNOTATE type=3DANNOTYPE_IGNORE_ALTERN= ATIVE -#define ANNOTATE_INTRA_FUNCTION_CALL ANNOTATE type=3DANNOTYPE_INTRA_FUNCTI= ON_CALL -#define ANNOTATE_UNRET_BEGIN ANNOTATE type=3DANNOTYPE_UNRET_BEGIN -#define ANNOTATE_REACHABLE ANNOTATE type=3DANNOTYPE_REACHABLE -#define ANNOTATE_NOCFI ANNOTATE type=3DANNOTYPE_NOCFI -#define ANNOTATE_DATA_SPECIAL ANNOTATE_DATA type=3DANNOTYPE_DATA_SPECIAL -#endif /* __ASSEMBLY__ */ +#endif /* !__ASSEMBLY__ */ + +#else /* !OBJTOOL */ + +#define ANNOTATE_NOENDBR +#define ANNOTATE_NOENDBR_SYM(sym) +#define ANNOTATE_RETPOLINE_SAFE +#define ANNOTATE_INSTR_BEGIN(label) +#define ANNOTATE_INSTR_END(label) +#define ANNOTATE_IGNORE_ALTERNATIVE +#define ANNOTATE_INTRA_FUNCTION_CALL +#define ANNOTATE_UNRET_BEGIN +#define ANNOTATE_REACHABLE +#define ANNOTATE_REACHABLE_LABEL(label) +#define ANNOTATE_NOCFI +#define ANNOTATE_NOCFI_SYM(sym) +#define ANNOTATE_DATA_SPECIAL +#define __ANNOTATE_DATA_SPECIAL(l) + +#endif /* !OBJTOOL */ =20 #endif /* _LINUX_ANNOTATE_H */ --=20 2.52.0