Re: [PATCH v8 04/14] linkage: add macros for putting ASM functions into own sections
From: Peter Zijlstra <peterz@infradead.org>
Date: 2021-12-03 09:31:53
Also in:
linux-arch, linux-hardening, live-patching, lkml, llvm
On Thu, Dec 02, 2021 at 11:32:04PM +0100, Alexander Lobakin wrote:
quoted hunk ↗ jump to hunk
diff --git a/include/linux/linkage.h b/include/linux/linkage.h index dbf8506decca..baaab7dece08 100644 --- a/include/linux/linkage.h +++ b/include/linux/linkage.h@@ -355,4 +355,86 @@ #endif /* __ASSEMBLY__ */ +/* + * Allow ASM symbols to have their own unique sections if they are being + * generated by the compiler for C functions (DCE, FG-KASLR, LTO). + */ +#if (defined(CONFIG_LD_DEAD_CODE_DATA_ELIMINATION) && !defined(MODULE)) || \ + (defined(CONFIG_FG_KASLR) && !defined(MODULE)) || \ + (defined(CONFIG_MODULE_FG_KASLR) && defined(MODULE)) || \ + (defined(CONFIG_LTO_CLANG)) + +#define SYM_TEXT_SECTION(name) \ + .pushsection .text.##name, "ax" + +#define ASM_TEXT_SECTION(name) \ + ".text." #name + +#define ASM_PUSH_SECTION(name) \ + ".pushsection .text." #name ", \"ax\"" + +#else /* just .text */ + +#define SYM_TEXT_SECTION(name) \ + .pushsection .text, "ax" + +#define ASM_TEXT_SECTION(name) \ + ".text" + +#define ASM_PUSH_SECTION(name) \ + ".pushsection .text, \"ax\"" + +#endif /* just .text */
That's terribly inconsistent, SYM_TEXT_SECTION is in fact PUSH_TEXT_SECTION, ASM_PUSH_SECTION is in fact ASM_PUSH_TEXT_SECTION and should be stringify(PUSH_TEXT_SECTION()) or something, and they're all repeating that ASM_TEXT_SECTION thing :/
+ +#ifdef __ASSEMBLY__ + +#define SYM_TEXT_END_SECTION \ + .popsection + +#define SYM_FUNC_START_LOCAL_ALIAS_SECTION(name) \ + SYM_TEXT_SECTION(name) ASM_NL \ + SYM_FUNC_START_LOCAL_ALIAS(name) + +#define SYM_FUNC_START_LOCAL_SECTION(name) \ + SYM_TEXT_SECTION(name) ASM_NL \ + SYM_FUNC_START_LOCAL(name) + +#define SYM_FUNC_START_NOALIGN_SECTION(name) \ + SYM_TEXT_SECTION(name) ASM_NL \ + SYM_FUNC_START_NOALIGN(name) + +#define SYM_FUNC_START_WEAK_SECTION(name) \ + SYM_TEXT_SECTION(name) ASM_NL \ + SYM_FUNC_START_WEAK(name) + +#define SYM_FUNC_START_SECTION(name) \ + SYM_TEXT_SECTION(name) ASM_NL \ + SYM_FUNC_START(name) + +#define SYM_CODE_START_LOCAL_NOALIGN_SECTION(name) \ + SYM_TEXT_SECTION(name) ASM_NL \ + SYM_CODE_START_LOCAL_NOALIGN(name) + +#define SYM_CODE_START_NOALIGN_SECTION(name) \ + SYM_TEXT_SECTION(name) ASM_NL \ + SYM_CODE_START_NOALIGN(name) + +#define SYM_CODE_START_SECTION(name) \ + SYM_TEXT_SECTION(name) ASM_NL \ + SYM_CODE_START(name) + +#define SYM_FUNC_END_ALIAS_SECTION(name) \ + SYM_FUNC_END_ALIAS(name) ASM_NL \ + SYM_TEXT_END_SECTION + +#define SYM_FUNC_END_SECTION(name) \ + SYM_FUNC_END(name) ASM_NL \ + SYM_TEXT_END_SECTION + +#define SYM_CODE_END_SECTION(name) \ + SYM_CODE_END(name) ASM_NL \ + SYM_TEXT_END_SECTION + +#endif /* __ASSEMBLY__ */
*URGH* why do we have to have new macros for this? SYM_FUNC_START*() already takes the name as argument.