From: George Guo <[email protected]>

An ALTERNATIVE() emits its replacement instructions into a .subsection 1
placed after the patched function.  When objtool clones the function into
a livepatch module, clone_inline_alternatives() clones that replacement
block too, but only for architectures that define ARCH_HAS_INLINE_ALTS.

LoongArch uses the same .subsection layout as arm64, and its alternative
macros now mark the replacement with ANNOTATE_DATA_SPECIAL (see "LoongArch:
Mark special sections for KLP support").  Define ARCH_HAS_INLINE_ALTS so
the replacement is cloned; otherwise a livepatch for a function containing
an ALTERNATIVE() fails to build with "can't find new instruction".

Reproduced by building a livepatch for a function containing an
ALTERNATIVE() (the base-vmlinux test).
Link: https://lore.kernel.org/all/[email protected]

Reported-by: Joe Lawrence <[email protected]>
Signed-off-by: George Guo <[email protected]>
---
 tools/objtool/arch/loongarch/include/arch/elf.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/objtool/arch/loongarch/include/arch/elf.h 
b/tools/objtool/arch/loongarch/include/arch/elf.h
index 0103f27fccfc..e2843679f24e 100644
--- a/tools/objtool/arch/loongarch/include/arch/elf.h
+++ b/tools/objtool/arch/loongarch/include/arch/elf.h
@@ -46,6 +46,7 @@
 #define R_TEXT32               R_LARCH_32_PCREL
 #define R_TEXT64               R_LARCH_32_PCREL
 
+#define ARCH_HAS_INLINE_ALTS   1
 #define ARCH_HAS_PAIRED_RELOCS 1
 
 struct elf;
-- 
2.53.0


Reply via email to