* [PATCH 0/4] objtool: Improve code generation for annotation macros
@ 2025-11-26 6:06 Josh Poimboeuf
2025-11-26 6:06 ` [PATCH 1/4] x86/alternative: Remove ANNOTATE_DATA_SPECIAL usage Josh Poimboeuf
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Josh Poimboeuf @ 2025-11-26 6:06 UTC (permalink / raw)
To: x86; +Cc: linux-kernel, Peter Zijlstra
For tip/objtool/core.
As much as possible, undo the code generation damage introduced by
ANNOTATE_DATA_SPECIAL:
- Remove its usage in favor of SHF_MERGE + sh_entsize, where possible
- Print the annotation on a single line:
912: .pushsection ".discard.annotate_data", "M", @progbits, 8; .long 912b - .; .long 1; .popsection
- Remove the trailing newline/tab; let the invoking code decide on the
appropriate separator for the given context
Josh Poimboeuf (4):
x86/alternative: Remove ANNOTATE_DATA_SPECIAL usage
x86/asm: Remove ANNOTATE_DATA_SPECIAL usage
objtool: Consolidate annotation macros
objtool: Remove newlines and tabs from annotation macros
arch/um/include/asm/Kbuild | 1 -
arch/um/include/shared/common-offsets.h | 3 ++
arch/x86/include/asm/alternative.h | 9 +++---
arch/x86/include/asm/asm.h | 25 ++++++++-------
arch/x86/include/asm/bug.h | 2 +-
arch/x86/include/asm/cpufeature.h | 2 +-
arch/x86/include/asm/irq_stack.h | 2 +-
arch/x86/include/asm/jump_label.h | 2 +-
arch/x86/include/asm/nospec-branch.h | 4 +--
arch/x86/include/asm/paravirt_types.h | 2 +-
arch/x86/include/asm/smap.h | 8 ++---
arch/x86/include/asm/static_call.h | 2 +-
arch/x86/kernel/alternative.c | 4 +--
arch/x86/kernel/asm-offsets.c | 3 ++
arch/x86/kernel/rethook.c | 2 +-
arch/x86/kernel/static_call.c | 4 +--
arch/x86/lib/error-inject.c | 2 +-
arch/x86/um/shared/sysdep/kernel-offsets.h | 2 ++
include/linux/annotate.h | 36 +++++++++-------------
include/linux/objtool.h | 2 +-
kernel/bounds.c | 1 +
scripts/mod/devicetable-offsets.c | 1 +
22 files changed, 62 insertions(+), 57 deletions(-)
--
2.51.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/4] x86/alternative: Remove ANNOTATE_DATA_SPECIAL usage
2025-11-26 6:06 [PATCH 0/4] objtool: Improve code generation for annotation macros Josh Poimboeuf
@ 2025-11-26 6:06 ` Josh Poimboeuf
2025-11-26 6:06 ` [PATCH 2/4] x86/asm: " Josh Poimboeuf
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Josh Poimboeuf @ 2025-11-26 6:06 UTC (permalink / raw)
To: x86; +Cc: linux-kernel, Peter Zijlstra
Instead of manually annotating each .altinstructions entry, just make
the section mergeable and store the entry size in the ELF section
header.
Either way works for objtool create_fake_symbols(), this way produces
cleaner code generation.
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
---
arch/um/include/shared/common-offsets.h | 2 ++
arch/x86/include/asm/alternative.h | 7 +++----
arch/x86/kernel/asm-offsets.c | 2 ++
3 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/arch/um/include/shared/common-offsets.h b/arch/um/include/shared/common-offsets.h
index 8ca66a1918c3..4e19103afd71 100644
--- a/arch/um/include/shared/common-offsets.h
+++ b/arch/um/include/shared/common-offsets.h
@@ -18,3 +18,5 @@ DEFINE(UM_NSEC_PER_USEC, NSEC_PER_USEC);
DEFINE(UM_KERN_GDT_ENTRY_TLS_ENTRIES, GDT_ENTRY_TLS_ENTRIES);
DEFINE(UM_SECCOMP_ARCH_NATIVE, SECCOMP_ARCH_NATIVE);
+
+DEFINE(ALT_INSTR_SIZE, sizeof(struct alt_instr));
diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h
index b14c045679e1..df2c8705e17b 100644
--- a/arch/x86/include/asm/alternative.h
+++ b/arch/x86/include/asm/alternative.h
@@ -197,8 +197,8 @@ static inline int alternatives_text_reserved(void *start, void *end)
"773:\n"
#define ALTINSTR_ENTRY(ft_flags) \
- ".pushsection .altinstructions,\"a\"\n" \
- ANNOTATE_DATA_SPECIAL \
+ ".pushsection .altinstructions, \"aM\", @progbits, " \
+ __stringify(ALT_INSTR_SIZE) "\n" \
" .long 771b - .\n" /* label */ \
" .long 774f - .\n" /* new instruction */ \
" .4byte " __stringify(ft_flags) "\n" /* feature + flags */ \
@@ -339,7 +339,6 @@ void nop_func(void);
* instruction. See apply_alternatives().
*/
.macro altinstr_entry orig alt ft_flags orig_len alt_len
- ANNOTATE_DATA_SPECIAL
.long \orig - .
.long \alt - .
.4byte \ft_flags
@@ -363,7 +362,7 @@ void nop_func(void);
741: \
.skip -(((744f-743f)-(741b-740b)) > 0) * ((744f-743f)-(741b-740b)),0x90 ;\
742: \
- .pushsection .altinstructions,"a" ; \
+ .pushsection .altinstructions, "aM", @progbits, ALT_INSTR_SIZE ;\
altinstr_entry 740b,743f,flag,742b-740b,744f-743f ; \
.popsection ; \
.pushsection .altinstr_replacement,"ax" ; \
diff --git a/arch/x86/kernel/asm-offsets.c b/arch/x86/kernel/asm-offsets.c
index 32ba599a51f8..db3bb5143329 100644
--- a/arch/x86/kernel/asm-offsets.c
+++ b/arch/x86/kernel/asm-offsets.c
@@ -124,4 +124,6 @@ static void __used common(void)
OFFSET(ARIA_CTX_rounds, aria_ctx, rounds);
#endif
+ BLANK();
+ DEFINE(ALT_INSTR_SIZE, sizeof(struct alt_instr));
}
--
2.51.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/4] x86/asm: Remove ANNOTATE_DATA_SPECIAL usage
2025-11-26 6:06 [PATCH 0/4] objtool: Improve code generation for annotation macros Josh Poimboeuf
2025-11-26 6:06 ` [PATCH 1/4] x86/alternative: Remove ANNOTATE_DATA_SPECIAL usage Josh Poimboeuf
@ 2025-11-26 6:06 ` Josh Poimboeuf
2025-11-26 6:06 ` [PATCH 3/4] objtool: Consolidate annotation macros Josh Poimboeuf
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Josh Poimboeuf @ 2025-11-26 6:06 UTC (permalink / raw)
To: x86; +Cc: linux-kernel, Peter Zijlstra
Instead of manually annotating each __ex_table entry, just make the
section mergeable and store the entry size in the ELF section header.
Either way works for objtool create_fake_symbols(), this way produces
cleaner code generation.
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
---
arch/um/include/asm/Kbuild | 1 -
arch/um/include/shared/common-offsets.h | 1 +
arch/x86/include/asm/asm.h | 25 ++++++++++++----------
arch/x86/kernel/asm-offsets.c | 1 +
arch/x86/um/shared/sysdep/kernel-offsets.h | 2 ++
kernel/bounds.c | 1 +
scripts/mod/devicetable-offsets.c | 1 +
7 files changed, 20 insertions(+), 12 deletions(-)
diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild
index b6810db24ca4..1b9b82bbe322 100644
--- a/arch/um/include/asm/Kbuild
+++ b/arch/um/include/asm/Kbuild
@@ -5,7 +5,6 @@ generic-y += device.h
generic-y += dma-mapping.h
generic-y += emergency-restart.h
generic-y += exec.h
-generic-y += extable.h
generic-y += ftrace.h
generic-y += hw_irq.h
generic-y += irq_regs.h
diff --git a/arch/um/include/shared/common-offsets.h b/arch/um/include/shared/common-offsets.h
index 4e19103afd71..a6f77cb6aa7e 100644
--- a/arch/um/include/shared/common-offsets.h
+++ b/arch/um/include/shared/common-offsets.h
@@ -20,3 +20,4 @@ DEFINE(UM_KERN_GDT_ENTRY_TLS_ENTRIES, GDT_ENTRY_TLS_ENTRIES);
DEFINE(UM_SECCOMP_ARCH_NATIVE, SECCOMP_ARCH_NATIVE);
DEFINE(ALT_INSTR_SIZE, sizeof(struct alt_instr));
+DEFINE(EXTABLE_SIZE, sizeof(struct exception_table_entry));
diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h
index bd62bd87a841..0e8c611bc9e2 100644
--- a/arch/x86/include/asm/asm.h
+++ b/arch/x86/include/asm/asm.h
@@ -126,18 +126,21 @@ static __always_inline __pure void *rip_rel_ptr(void *p)
#ifdef __KERNEL__
+#ifndef COMPILE_OFFSETS
+#include <asm/asm-offsets.h>
+#endif
+
# include <asm/extable_fixup_types.h>
/* Exception table entry */
#ifdef __ASSEMBLER__
-# define _ASM_EXTABLE_TYPE(from, to, type) \
- .pushsection "__ex_table","a" ; \
- .balign 4 ; \
- ANNOTATE_DATA_SPECIAL ; \
- .long (from) - . ; \
- .long (to) - . ; \
- .long type ; \
+# define _ASM_EXTABLE_TYPE(from, to, type) \
+ .pushsection "__ex_table", "aM", @progbits, EXTABLE_SIZE ; \
+ .balign 4 ; \
+ .long (from) - . ; \
+ .long (to) - . ; \
+ .long type ; \
.popsection
# ifdef CONFIG_KPROBES
@@ -180,18 +183,18 @@ static __always_inline __pure void *rip_rel_ptr(void *p)
".purgem extable_type_reg\n"
# define _ASM_EXTABLE_TYPE(from, to, type) \
- " .pushsection \"__ex_table\",\"a\"\n" \
+ " .pushsection __ex_table, \"aM\", @progbits, " \
+ __stringify(EXTABLE_SIZE) "\n" \
" .balign 4\n" \
- ANNOTATE_DATA_SPECIAL \
" .long (" #from ") - .\n" \
" .long (" #to ") - .\n" \
" .long " __stringify(type) " \n" \
" .popsection\n"
# define _ASM_EXTABLE_TYPE_REG(from, to, type, reg) \
- " .pushsection \"__ex_table\",\"a\"\n" \
+ " .pushsection __ex_table, \"aM\", @progbits, " \
+ __stringify(EXTABLE_SIZE) "\n" \
" .balign 4\n" \
- ANNOTATE_DATA_SPECIAL \
" .long (" #from ") - .\n" \
" .long (" #to ") - .\n" \
DEFINE_EXTABLE_TYPE_REG \
diff --git a/arch/x86/kernel/asm-offsets.c b/arch/x86/kernel/asm-offsets.c
index db3bb5143329..25fcde525c68 100644
--- a/arch/x86/kernel/asm-offsets.c
+++ b/arch/x86/kernel/asm-offsets.c
@@ -126,4 +126,5 @@ static void __used common(void)
BLANK();
DEFINE(ALT_INSTR_SIZE, sizeof(struct alt_instr));
+ DEFINE(EXTABLE_SIZE, sizeof(struct exception_table_entry));
}
diff --git a/arch/x86/um/shared/sysdep/kernel-offsets.h b/arch/x86/um/shared/sysdep/kernel-offsets.h
index 6fd1ed400399..8215a0200ddd 100644
--- a/arch/x86/um/shared/sysdep/kernel-offsets.h
+++ b/arch/x86/um/shared/sysdep/kernel-offsets.h
@@ -1,4 +1,5 @@
/* SPDX-License-Identifier: GPL-2.0 */
+#define COMPILE_OFFSETS
#include <linux/stddef.h>
#include <linux/sched.h>
#include <linux/elf.h>
@@ -7,6 +8,7 @@
#include <linux/audit.h>
#include <asm/mman.h>
#include <asm/seccomp.h>
+#include <asm/extable.h>
/* workaround for a warning with -Wmissing-prototypes */
void foo(void);
diff --git a/kernel/bounds.c b/kernel/bounds.c
index 29b2cd00df2c..02b619eb6106 100644
--- a/kernel/bounds.c
+++ b/kernel/bounds.c
@@ -6,6 +6,7 @@
*/
#define __GENERATING_BOUNDS_H
+#define COMPILE_OFFSETS
/* Include headers that define the enum constants of interest */
#include <linux/page-flags.h>
#include <linux/mmzone.h>
diff --git a/scripts/mod/devicetable-offsets.c b/scripts/mod/devicetable-offsets.c
index d3d00e85edf7..ef2ffb68f69d 100644
--- a/scripts/mod/devicetable-offsets.c
+++ b/scripts/mod/devicetable-offsets.c
@@ -1,4 +1,5 @@
// SPDX-License-Identifier: GPL-2.0
+#define COMPILE_OFFSETS
#include <linux/kbuild.h>
#include <linux/mod_devicetable.h>
--
2.51.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/4] objtool: Consolidate annotation macros
2025-11-26 6:06 [PATCH 0/4] objtool: Improve code generation for annotation macros Josh Poimboeuf
2025-11-26 6:06 ` [PATCH 1/4] x86/alternative: Remove ANNOTATE_DATA_SPECIAL usage Josh Poimboeuf
2025-11-26 6:06 ` [PATCH 2/4] x86/asm: " Josh Poimboeuf
@ 2025-11-26 6:06 ` Josh Poimboeuf
2025-11-26 6:07 ` [PATCH 4/4] objtool: Remove newlines and tabs from " Josh Poimboeuf
2025-11-26 10:00 ` [PATCH 0/4] objtool: Improve code generation for " Peter Zijlstra
4 siblings, 0 replies; 7+ messages in thread
From: Josh Poimboeuf @ 2025-11-26 6:06 UTC (permalink / raw)
To: x86; +Cc: linux-kernel, Peter Zijlstra
Consolidate __ASM_ANNOTATE into a single macro which is used by both C
and asm. This also makes the code generation a bit more palatable by
putting it all on a single line.
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
---
include/linux/annotate.h | 36 +++++++++++++++---------------------
1 file changed, 15 insertions(+), 21 deletions(-)
diff --git a/include/linux/annotate.h b/include/linux/annotate.h
index 7c10d34d198c..996126f5f9ec 100644
--- a/include/linux/annotate.h
+++ b/include/linux/annotate.h
@@ -6,41 +6,35 @@
#ifdef CONFIG_OBJTOOL
+#define __ASM_ANNOTATE(section, label, type) \
+ .pushsection section, "M", @progbits, 8; \
+ .long label - .; \
+ .long type; \
+ .popsection
+
#ifndef __ASSEMBLY__
-#define __ASM_ANNOTATE(section, label, type) \
- ".pushsection " section ",\"M\", @progbits, 8\n\t" \
- ".long " __stringify(label) " - .\n\t" \
- ".long " __stringify(type) "\n\t" \
- ".popsection\n\t"
-
#define ASM_ANNOTATE_LABEL(label, type) \
- __ASM_ANNOTATE(".discard.annotate_insn", label, type)
+ __stringify(__ASM_ANNOTATE(".discard.annotate_insn", label, type)) "\n\t"
#define ASM_ANNOTATE(type) \
- "911:\n\t" \
- ASM_ANNOTATE_LABEL(911b, type)
+ "911: " \
+ __stringify(__ASM_ANNOTATE(".discard.annotate_insn", 911b, type)) "\n\t"
#define ASM_ANNOTATE_DATA(type) \
- "912:\n\t" \
- __ASM_ANNOTATE(".discard.annotate_data", 912b, type)
+ "912: " \
+ __stringify(__ASM_ANNOTATE(".discard.annotate_data", 912b, type)) "\n\t"
#else /* __ASSEMBLY__ */
-.macro __ANNOTATE section, type
-.Lhere_\@:
- .pushsection \section, "M", @progbits, 8
- .long .Lhere_\@ - .
- .long \type
- .popsection
-.endm
-
.macro ANNOTATE type
- __ANNOTATE ".discard.annotate_insn", \type
+.Lhere_\@:
+ __ASM_ANNOTATE(".discard.annotate_insn", .Lhere_\@, \type)
.endm
.macro ANNOTATE_DATA type
- __ANNOTATE ".discard.annotate_data", \type
+.Lhere_\@:
+ __ASM_ANNOTATE(".discard.annotate_data", .Lhere_\@, \type)
.endm
#endif /* __ASSEMBLY__ */
--
2.51.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 4/4] objtool: Remove newlines and tabs from annotation macros
2025-11-26 6:06 [PATCH 0/4] objtool: Improve code generation for annotation macros Josh Poimboeuf
` (2 preceding siblings ...)
2025-11-26 6:06 ` [PATCH 3/4] objtool: Consolidate annotation macros Josh Poimboeuf
@ 2025-11-26 6:07 ` Josh Poimboeuf
2025-11-26 10:00 ` [PATCH 0/4] objtool: Improve code generation for " Peter Zijlstra
4 siblings, 0 replies; 7+ messages in thread
From: Josh Poimboeuf @ 2025-11-26 6:07 UTC (permalink / raw)
To: x86; +Cc: linux-kernel, Peter Zijlstra
Remove newlines and tabs from the annotation macros so the invoking code
can insert them as needed to match the style of the surrounding code.
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
---
arch/x86/include/asm/alternative.h | 2 +-
arch/x86/include/asm/bug.h | 2 +-
arch/x86/include/asm/cpufeature.h | 2 +-
arch/x86/include/asm/irq_stack.h | 2 +-
arch/x86/include/asm/jump_label.h | 2 +-
arch/x86/include/asm/nospec-branch.h | 4 ++--
arch/x86/include/asm/paravirt_types.h | 2 +-
arch/x86/include/asm/smap.h | 8 ++++----
arch/x86/include/asm/static_call.h | 2 +-
arch/x86/kernel/alternative.c | 4 ++--
arch/x86/kernel/rethook.c | 2 +-
arch/x86/kernel/static_call.c | 4 ++--
arch/x86/lib/error-inject.c | 2 +-
include/linux/annotate.h | 6 +++---
include/linux/objtool.h | 2 +-
15 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h
index df2c8705e17b..03364510d5fe 100644
--- a/arch/x86/include/asm/alternative.h
+++ b/arch/x86/include/asm/alternative.h
@@ -208,7 +208,7 @@ static inline int alternatives_text_reserved(void *start, void *end)
#define ALTINSTR_REPLACEMENT(newinstr) /* replacement */ \
".pushsection .altinstr_replacement, \"ax\"\n" \
- ANNOTATE_DATA_SPECIAL \
+ ANNOTATE_DATA_SPECIAL "\n" \
"# ALT: replacement\n" \
"774:\n\t" newinstr "\n775:\n" \
".popsection\n"
diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h
index 372f4018880c..2134e64911e1 100644
--- a/arch/x86/include/asm/bug.h
+++ b/arch/x86/include/asm/bug.h
@@ -57,7 +57,7 @@
#define _BUG_FLAGS_ASM(ins, file, line, flags, size, extra) \
"1:\t" ins "\n" \
".pushsection __bug_table,\"aw\"\n" \
- ANNOTATE_DATA_SPECIAL \
+ ANNOTATE_DATA_SPECIAL "\n" \
__BUG_ENTRY(file, line, flags) \
"\t.org 2b + " size "\n" \
".popsection\n" \
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index fc5f32d4da6e..d8bc614f92fa 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -101,7 +101,7 @@ static __always_inline bool _static_cpu_has(u16 bit)
asm goto(ALTERNATIVE_TERNARY("jmp 6f", %c[feature], "", "jmp %l[t_no]")
".pushsection .altinstr_aux,\"ax\"\n"
"6:\n"
- ANNOTATE_DATA_SPECIAL
+ ANNOTATE_DATA_SPECIAL "\n"
" testb %[bitnum], %a[cap_byte]\n"
" jnz %l[t_yes]\n"
" jmp %l[t_no]\n"
diff --git a/arch/x86/include/asm/irq_stack.h b/arch/x86/include/asm/irq_stack.h
index 735c3a491f60..8325b79f2ac6 100644
--- a/arch/x86/include/asm/irq_stack.h
+++ b/arch/x86/include/asm/irq_stack.h
@@ -101,7 +101,7 @@
#define ASM_CALL_ARG0 \
"1: call %c[__func] \n" \
- ANNOTATE_REACHABLE(1b)
+ ANNOTATE_REACHABLE(1b) " \n"
#define ASM_CALL_ARG1 \
"movq %[arg1], %%rdi \n" \
diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h
index e0a6930a4029..05b16299588d 100644
--- a/arch/x86/include/asm/jump_label.h
+++ b/arch/x86/include/asm/jump_label.h
@@ -15,7 +15,7 @@
#define JUMP_TABLE_ENTRY(key, label) \
".pushsection __jump_table, \"aw\" \n\t" \
_ASM_ALIGN "\n\t" \
- ANNOTATE_DATA_SPECIAL \
+ ANNOTATE_DATA_SPECIAL "\n" \
".long 1b - . \n\t" \
".long " label " - . \n\t" \
_ASM_PTR " " key " - . \n\t" \
diff --git a/arch/x86/include/asm/nospec-branch.h b/arch/x86/include/asm/nospec-branch.h
index 08ed5a2e46a5..a5d41d8cd70a 100644
--- a/arch/x86/include/asm/nospec-branch.h
+++ b/arch/x86/include/asm/nospec-branch.h
@@ -464,7 +464,7 @@ static inline void call_depth_return_thunk(void) {}
*/
# define CALL_NOSPEC \
ALTERNATIVE_2( \
- ANNOTATE_RETPOLINE_SAFE \
+ ANNOTATE_RETPOLINE_SAFE "\n" \
"call *%[thunk_target]\n", \
" jmp 904f;\n" \
" .align 16\n" \
@@ -480,7 +480,7 @@ static inline void call_depth_return_thunk(void) {}
"904: call 901b;\n", \
X86_FEATURE_RETPOLINE, \
"lfence;\n" \
- ANNOTATE_RETPOLINE_SAFE \
+ ANNOTATE_RETPOLINE_SAFE "\n" \
"call *%[thunk_target]\n", \
X86_FEATURE_RETPOLINE_LFENCE)
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 37a8627d8277..3502939415ad 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -249,7 +249,7 @@ extern struct paravirt_patch_template pv_ops;
* don't need to bother with CFI prefixes.
*/
#define PARAVIRT_CALL \
- ANNOTATE_RETPOLINE_SAFE \
+ ANNOTATE_RETPOLINE_SAFE "\n\t" \
"call *%[paravirt_opptr];"
/*
diff --git a/arch/x86/include/asm/smap.h b/arch/x86/include/asm/smap.h
index 4f84d421d1cf..cd173facecd2 100644
--- a/arch/x86/include/asm/smap.h
+++ b/arch/x86/include/asm/smap.h
@@ -40,7 +40,7 @@ static __always_inline unsigned long smap_save(void)
unsigned long flags;
asm volatile ("# smap_save\n\t"
- ALTERNATIVE(ANNOTATE_IGNORE_ALTERNATIVE
+ ALTERNATIVE(ANNOTATE_IGNORE_ALTERNATIVE "\n\t"
"", "pushf; pop %0; clac",
X86_FEATURE_SMAP)
: "=rm" (flags) : : "memory", "cc");
@@ -51,7 +51,7 @@ static __always_inline unsigned long smap_save(void)
static __always_inline void smap_restore(unsigned long flags)
{
asm volatile ("# smap_restore\n\t"
- ALTERNATIVE(ANNOTATE_IGNORE_ALTERNATIVE
+ ALTERNATIVE(ANNOTATE_IGNORE_ALTERNATIVE "\n\t"
"", "push %0; popf",
X86_FEATURE_SMAP)
: : "g" (flags) : "memory", "cc");
@@ -64,9 +64,9 @@ static __always_inline void smap_restore(unsigned long flags)
ALTERNATIVE("", "stac", X86_FEATURE_SMAP)
#define ASM_CLAC_UNSAFE \
- ALTERNATIVE("", ANNOTATE_IGNORE_ALTERNATIVE "clac", X86_FEATURE_SMAP)
+ ALTERNATIVE("", ANNOTATE_IGNORE_ALTERNATIVE "\n\t" "clac", X86_FEATURE_SMAP)
#define ASM_STAC_UNSAFE \
- ALTERNATIVE("", ANNOTATE_IGNORE_ALTERNATIVE "stac", X86_FEATURE_SMAP)
+ ALTERNATIVE("", ANNOTATE_IGNORE_ALTERNATIVE "\n\t" "stac", X86_FEATURE_SMAP)
#endif /* __ASSEMBLER__ */
diff --git a/arch/x86/include/asm/static_call.h b/arch/x86/include/asm/static_call.h
index 41502bd2afd6..4cd725a8fe91 100644
--- a/arch/x86/include/asm/static_call.h
+++ b/arch/x86/include/asm/static_call.h
@@ -36,7 +36,7 @@
".align 4 \n" \
".globl " STATIC_CALL_TRAMP_STR(name) " \n" \
STATIC_CALL_TRAMP_STR(name) ": \n" \
- ANNOTATE_NOENDBR \
+ ANNOTATE_NOENDBR " \n" \
insns " \n" \
".byte 0x0f, 0xb9, 0xcc \n" \
".type " STATIC_CALL_TRAMP_STR(name) ", @function \n" \
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
index d19a3fd7cf04..ddde9c33d974 100644
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -2250,7 +2250,7 @@ asm (
" .pushsection .init.text, \"ax\", @progbits\n"
" .type int3_selftest_asm, @function\n"
"int3_selftest_asm:\n"
- ANNOTATE_NOENDBR
+ ANNOTATE_NOENDBR "\n"
/*
* INT3 padded with NOP to CALL_INSN_SIZE. The INT3 triggers an
* exception, then the int3_exception_nb notifier emulates a call to
@@ -2268,7 +2268,7 @@ asm (
" .pushsection .init.text, \"ax\", @progbits\n"
" .type int3_selftest_callee, @function\n"
"int3_selftest_callee:\n"
- ANNOTATE_NOENDBR
+ ANNOTATE_NOENDBR "\n"
" movl $0x1234, (%" _ASM_ARG1 ")\n"
ASM_RET
" .size int3_selftest_callee, . - int3_selftest_callee\n"
diff --git a/arch/x86/kernel/rethook.c b/arch/x86/kernel/rethook.c
index 8a1c0111ae79..85e2f2d16a90 100644
--- a/arch/x86/kernel/rethook.c
+++ b/arch/x86/kernel/rethook.c
@@ -25,7 +25,7 @@ asm(
".type arch_rethook_trampoline, @function\n"
"arch_rethook_trampoline:\n"
#ifdef CONFIG_X86_64
- ANNOTATE_NOENDBR /* This is only jumped from ret instruction */
+ ANNOTATE_NOENDBR "\n" /* This is only jumped from ret instruction */
/* Push a fake return address to tell the unwinder it's a rethook. */
" pushq $arch_rethook_trampoline\n"
UNWIND_HINT_FUNC
diff --git a/arch/x86/kernel/static_call.c b/arch/x86/kernel/static_call.c
index 378c388d1b31..66ca75301891 100644
--- a/arch/x86/kernel/static_call.c
+++ b/arch/x86/kernel/static_call.c
@@ -45,8 +45,8 @@ asm (".global __static_call_return\n\t"
".type __static_call_return, @function\n\t"
ASM_FUNC_ALIGN "\n\t"
"__static_call_return:\n\t"
- ANNOTATE_NOENDBR
- ANNOTATE_RETPOLINE_SAFE
+ ANNOTATE_NOENDBR "\n\t"
+ ANNOTATE_RETPOLINE_SAFE "\n\t"
"ret; int3\n\t"
".size __static_call_return, . - __static_call_return \n\t");
diff --git a/arch/x86/lib/error-inject.c b/arch/x86/lib/error-inject.c
index b5a6d83106bc..512a2538596f 100644
--- a/arch/x86/lib/error-inject.c
+++ b/arch/x86/lib/error-inject.c
@@ -13,7 +13,7 @@ asm(
".globl just_return_func\n"
ASM_FUNC_ALIGN
"just_return_func:\n"
- ANNOTATE_NOENDBR
+ ANNOTATE_NOENDBR "\n"
ASM_RET
".size just_return_func, .-just_return_func\n"
);
diff --git a/include/linux/annotate.h b/include/linux/annotate.h
index 996126f5f9ec..5efac5d4f9cf 100644
--- a/include/linux/annotate.h
+++ b/include/linux/annotate.h
@@ -15,15 +15,15 @@
#ifndef __ASSEMBLY__
#define ASM_ANNOTATE_LABEL(label, type) \
- __stringify(__ASM_ANNOTATE(".discard.annotate_insn", label, type)) "\n\t"
+ __stringify(__ASM_ANNOTATE(".discard.annotate_insn", label, type))
#define ASM_ANNOTATE(type) \
"911: " \
- __stringify(__ASM_ANNOTATE(".discard.annotate_insn", 911b, type)) "\n\t"
+ __stringify(__ASM_ANNOTATE(".discard.annotate_insn", 911b, type))
#define ASM_ANNOTATE_DATA(type) \
"912: " \
- __stringify(__ASM_ANNOTATE(".discard.annotate_data", 912b, type)) "\n\t"
+ __stringify(__ASM_ANNOTATE(".discard.annotate_data", 912b, type))
#else /* __ASSEMBLY__ */
diff --git a/include/linux/objtool.h b/include/linux/objtool.h
index b18ab53561c9..9a00e701454c 100644
--- a/include/linux/objtool.h
+++ b/include/linux/objtool.h
@@ -12,7 +12,7 @@
#define UNWIND_HINT(type, sp_reg, sp_offset, signal) \
"987: \n\t" \
".pushsection .discard.unwind_hints\n\t" \
- ANNOTATE_DATA_SPECIAL \
+ ANNOTATE_DATA_SPECIAL "\n\t" \
/* struct unwind_hint */ \
".long 987b - .\n\t" \
".short " __stringify(sp_offset) "\n\t" \
--
2.51.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 0/4] objtool: Improve code generation for annotation macros
2025-11-26 6:06 [PATCH 0/4] objtool: Improve code generation for annotation macros Josh Poimboeuf
` (3 preceding siblings ...)
2025-11-26 6:07 ` [PATCH 4/4] objtool: Remove newlines and tabs from " Josh Poimboeuf
@ 2025-11-26 10:00 ` Peter Zijlstra
2025-12-03 15:59 ` Ingo Molnar
4 siblings, 1 reply; 7+ messages in thread
From: Peter Zijlstra @ 2025-11-26 10:00 UTC (permalink / raw)
To: Josh Poimboeuf; +Cc: x86, linux-kernel
On Tue, Nov 25, 2025 at 10:06:56PM -0800, Josh Poimboeuf wrote:
> For tip/objtool/core.
>
> As much as possible, undo the code generation damage introduced by
> ANNOTATE_DATA_SPECIAL:
>
> - Remove its usage in favor of SHF_MERGE + sh_entsize, where possible
>
> - Print the annotation on a single line:
>
> 912: .pushsection ".discard.annotate_data", "M", @progbits, 8; .long 912b - .; .long 1; .popsection
>
> - Remove the trailing newline/tab; let the invoking code decide on the
> appropriate separator for the given context
>
> Josh Poimboeuf (4):
> x86/alternative: Remove ANNOTATE_DATA_SPECIAL usage
> x86/asm: Remove ANNOTATE_DATA_SPECIAL usage
> objtool: Consolidate annotation macros
> objtool: Remove newlines and tabs from annotation macros
Durr, this will conflict with tip/core/bugs. Let me ponder this a bit.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 0/4] objtool: Improve code generation for annotation macros
2025-11-26 10:00 ` [PATCH 0/4] objtool: Improve code generation for " Peter Zijlstra
@ 2025-12-03 15:59 ` Ingo Molnar
0 siblings, 0 replies; 7+ messages in thread
From: Ingo Molnar @ 2025-12-03 15:59 UTC (permalink / raw)
To: Peter Zijlstra; +Cc: Josh Poimboeuf, x86, linux-kernel
* Peter Zijlstra <peterz@infradead.org> wrote:
> On Tue, Nov 25, 2025 at 10:06:56PM -0800, Josh Poimboeuf wrote:
> > For tip/objtool/core.
> >
> > As much as possible, undo the code generation damage introduced by
> > ANNOTATE_DATA_SPECIAL:
> >
> > - Remove its usage in favor of SHF_MERGE + sh_entsize, where possible
> >
> > - Print the annotation on a single line:
> >
> > 912: .pushsection ".discard.annotate_data", "M", @progbits, 8; .long 912b - .; .long 1; .popsection
> >
> > - Remove the trailing newline/tab; let the invoking code decide on the
> > appropriate separator for the given context
> >
> > Josh Poimboeuf (4):
> > x86/alternative: Remove ANNOTATE_DATA_SPECIAL usage
> > x86/asm: Remove ANNOTATE_DATA_SPECIAL usage
> > objtool: Consolidate annotation macros
> > objtool: Remove newlines and tabs from annotation macros
>
> Durr, this will conflict with tip/core/bugs. Let me ponder this a bit.
So Josh has resolved these conflicts based on latest -git
which has all these moving pieces integrated into a single
tree, so I've applied these fixes to tip:objtool/urgent.
Thanks,
Ingo
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-12-03 15:59 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-26 6:06 [PATCH 0/4] objtool: Improve code generation for annotation macros Josh Poimboeuf
2025-11-26 6:06 ` [PATCH 1/4] x86/alternative: Remove ANNOTATE_DATA_SPECIAL usage Josh Poimboeuf
2025-11-26 6:06 ` [PATCH 2/4] x86/asm: " Josh Poimboeuf
2025-11-26 6:06 ` [PATCH 3/4] objtool: Consolidate annotation macros Josh Poimboeuf
2025-11-26 6:07 ` [PATCH 4/4] objtool: Remove newlines and tabs from " Josh Poimboeuf
2025-11-26 10:00 ` [PATCH 0/4] objtool: Improve code generation for " Peter Zijlstra
2025-12-03 15:59 ` Ingo Molnar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox