Commit aa0cbc1b authored by WANG Rui's avatar WANG Rui Committed by Huacai Chen
Browse files

LoongArch: Record pc instead of offset in la_abs relocation



To clarify, the previous version functioned flawlessly. However, it's
worth noting that the LLVM's LoongArch backend currently lacks support
for cross-section label calculations. With this patch, we enable the use
of clang to compile relocatable kernels.

Tested-by: default avatarNathan Chancellor <nathan@kernel.org>
Signed-off-by: default avatarWANG Rui <wangrui@loongson.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent cbfd44bd
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -609,8 +609,7 @@
	lu32i.d	\reg, 0
	lu52i.d	\reg, \reg, 0
	.pushsection ".la_abs", "aw", %progbits
	768:
	.dword	768b-766b
	.dword	766b
	.dword	\sym
	.popsection
#endif
+1 −1
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ extern void set_merr_handler(unsigned long offset, void *addr, unsigned long len
#ifdef CONFIG_RELOCATABLE

struct rela_la_abs {
	long offset;
	long pc;
	long symvalue;
};

+1 −1
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ static inline void __init relocate_absolute(long random_offset)
	for (p = begin; (void *)p < end; p++) {
		long v = p->symvalue;
		uint32_t lu12iw, ori, lu32id, lu52id;
		union loongarch_instruction *insn = (void *)p - p->offset;
		union loongarch_instruction *insn = (void *)p->pc;

		lu12iw = (v >> 12) & 0xfffff;
		ori    = v & 0xfff;