All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5] LoongArch: Support new relocation types
@ 2022-07-27 16:24 Xi Ruoyao
  2022-07-27 16:26 ` [PATCH 1/5] LoongArch: Add section of GOT for kernel module Xi Ruoyao
                   ` (5 more replies)
  0 siblings, 6 replies; 17+ messages in thread
From: Xi Ruoyao @ 2022-07-27 16:24 UTC (permalink / raw)
  To: loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

The version 2.00 of LoongArch ELF ABI specification introduced new
relocation types, and the development tree of Binutils and GCC has
started to use them.  If the kernel is built with the latest snapshot of
Binutils or GCC, it will fail to load the modules because of unrecognized
relocation types in modules.

Add support for GOT and new relocation types for the module loader, so
the kernel (with modules) can be built with the "normal" code model and
function properly.

Tested by building the kernel with Binutils & GCC master branch, and
running the kernel with 35 in-tree modules loaded.

Link: https://github.com/loongson/LoongArch-Documentation/pull/57
Link: https://gcc.gnu.org/r13-1834
Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=f09482a

Xi Ruoyao (5):
  LoongArch: Add section of GOT for kernel module
  LoongArch: Support R_LARCH_SOP_PUSH_GPREL relocation type in kernel
    module
  LoongArch: Support relocation against _GLOBAL_OFFSET_TABLE_
  LoongArch: Stop using undocumented assembler options
  LoongArch: Support modules with new relocation types

 arch/loongarch/Makefile                 |  5 +-
 arch/loongarch/include/asm/elf.h        | 37 ++++++++++
 arch/loongarch/include/asm/module.h     | 23 ++++++
 arch/loongarch/include/asm/module.lds.h |  1 +
 arch/loongarch/kernel/head.S            | 10 +--
 arch/loongarch/kernel/module-sections.c | 72 +++++++++++++++++--
 arch/loongarch/kernel/module.c          | 94 +++++++++++++++++++++++++
 7 files changed, 229 insertions(+), 13 deletions(-)

-- 
2.37.0



^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/5] LoongArch: Add section of GOT for kernel module
  2022-07-27 16:24 [PATCH 0/5] LoongArch: Support new relocation types Xi Ruoyao
@ 2022-07-27 16:26 ` Xi Ruoyao
       [not found]   ` <849f514e-f78a-72a2-b94e-6974074b75eb@loongson.cn>
  2022-07-27 16:27 ` [PATCH 2/5] LoongArch: Support R_LARCH_SOP_PUSH_GPREL relocation type in " Xi Ruoyao
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 17+ messages in thread
From: Xi Ruoyao @ 2022-07-27 16:26 UTC (permalink / raw)
  To: loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

The address of external symbols will locate more than 32-bit offset.  We
were using the `-Wa,-mla-global-with-abs` and `-Wa,-mla-local-with-abs`
to prevent the compiler and assembler from generating GOT relocations,
but these options are undocumented hacks and do not work anymore with
GAS 2.40 and GCC 13.

Let the module loader emit GOT entries for data symbols so we would be
able to handle GOT relocations.  The GOT entry is just the data symbol
address.

Signed-off-by: Xi Ruoyao <xry111@xry111.site>
---
 arch/loongarch/include/asm/module.h     | 23 +++++++++++++
 arch/loongarch/include/asm/module.lds.h |  1 +
 arch/loongarch/kernel/module-sections.c | 43 ++++++++++++++++++++++---
 3 files changed, 63 insertions(+), 4 deletions(-)

diff --git a/arch/loongarch/include/asm/module.h b/arch/loongarch/include/asm/module.h
index 9f6718df1854..76a98a0ab8a0 100644
--- a/arch/loongarch/include/asm/module.h
+++ b/arch/loongarch/include/asm/module.h
@@ -19,6 +19,7 @@ struct mod_section {
 struct mod_arch_specific {
 	struct mod_section plt;
 	struct mod_section plt_idx;
+	struct mod_section got;
 };
 
 struct plt_entry {
@@ -28,11 +29,16 @@ struct plt_entry {
 	u32 inst_jirl;
 };
 
+struct got_entry {
+	Elf_Addr symbol_addr;
+};
+
 struct plt_idx_entry {
 	unsigned long symbol_addr;
 };
 
 Elf_Addr module_emit_plt_entry(struct module *mod, unsigned long val);
+Elf_Addr module_emit_got_entry(struct module *mod, Elf_Addr val);
 
 static inline struct plt_entry emit_plt_entry(unsigned long val)
 {
@@ -51,6 +57,11 @@ static inline struct plt_idx_entry emit_plt_idx_entry(unsigned long val)
 	return (struct plt_idx_entry) { val };
 }
 
+static inline struct got_entry emit_got_entry(Elf_Addr val)
+{
+	return (struct got_entry) { val };
+}
+
 static inline int get_plt_idx(unsigned long val, const struct mod_section *sec)
 {
 	int i;
@@ -77,4 +88,16 @@ static inline struct plt_entry *get_plt_entry(unsigned long val,
 	return plt + plt_idx;
 }
 
+static inline struct got_entry *get_got_entry(Elf_Addr val,
+					      const struct mod_section *sec)
+{
+	struct got_entry *got = (struct got_entry *)sec->shdr->sh_addr;
+	int i;
+
+	for (i = 0; i < sec->num_entries; i++)
+		if (got[i].symbol_addr == val)
+			return &got[i];
+	return NULL;
+}
+
 #endif /* _ASM_MODULE_H */
diff --git a/arch/loongarch/include/asm/module.lds.h b/arch/loongarch/include/asm/module.lds.h
index 31c1c0db11a3..57bbd0cedd26 100644
--- a/arch/loongarch/include/asm/module.lds.h
+++ b/arch/loongarch/include/asm/module.lds.h
@@ -4,4 +4,5 @@ SECTIONS {
 	. = ALIGN(4);
 	.plt : { BYTE(0) }
 	.plt.idx : { BYTE(0) }
+	.got : { BYTE(0) }
 }
diff --git a/arch/loongarch/kernel/module-sections.c b/arch/loongarch/kernel/module-sections.c
index 6d498288977d..509c0b86b1e9 100644
--- a/arch/loongarch/kernel/module-sections.c
+++ b/arch/loongarch/kernel/module-sections.c
@@ -33,6 +33,25 @@ Elf_Addr module_emit_plt_entry(struct module *mod, unsigned long val)
 	return (Elf_Addr)&plt[nr];
 }
 
+Elf_Addr module_emit_got_entry(struct module *mod, Elf_Addr val)
+{
+	struct mod_section *got_sec = &mod->arch.got;
+	int i = got_sec->num_entries;
+	struct got_entry *got = get_got_entry(val, got_sec);
+
+	if (got)
+		return (Elf_Addr)got;
+
+	/* There is no GOT entry existing for val yet.  Create a new one.  */
+	got = (struct got_entry *)got_sec->shdr->sh_addr;
+	got[i] = emit_got_entry(val);
+
+	got_sec->num_entries++;
+	BUG_ON(got_sec->num_entries > got_sec->max_entries);
+
+	return (Elf_Addr)&got[i];
+}
+
 static int is_rela_equal(const Elf_Rela *x, const Elf_Rela *y)
 {
 	return x->r_info == y->r_info && x->r_addend == y->r_addend;
@@ -50,7 +69,8 @@ static bool duplicate_rela(const Elf_Rela *rela, int idx)
 	return false;
 }
 
-static void count_max_entries(Elf_Rela *relas, int num, unsigned int *plts)
+static void count_max_entries(Elf_Rela *relas, int num,
+			      unsigned int *plts, unsigned int *gots)
 {
 	unsigned int i, type;
 
@@ -59,14 +79,16 @@ static void count_max_entries(Elf_Rela *relas, int num, unsigned int *plts)
 		if (type == R_LARCH_SOP_PUSH_PLT_PCREL) {
 			if (!duplicate_rela(relas, i))
 				(*plts)++;
-		}
+		} else if (type == R_LARCH_SOP_PUSH_GPREL)
+			if (!duplicate_rela(relas, i))
+				(*gots)++;
 	}
 }
 
 int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 			      char *secstrings, struct module *mod)
 {
-	unsigned int i, num_plts = 0;
+	unsigned int i, num_plts = 0, num_gots = 0;
 
 	/*
 	 * Find the empty .plt sections.
@@ -76,6 +98,8 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 			mod->arch.plt.shdr = sechdrs + i;
 		else if (!strcmp(secstrings + sechdrs[i].sh_name, ".plt.idx"))
 			mod->arch.plt_idx.shdr = sechdrs + i;
+		else if (!strcmp(secstrings + sechdrs[i].sh_name, ".got"))
+			mod->arch.got.shdr = sechdrs + i;
 	}
 
 	if (!mod->arch.plt.shdr) {
@@ -86,6 +110,10 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 		pr_err("%s: module PLT.IDX section(s) missing\n", mod->name);
 		return -ENOEXEC;
 	}
+	if (!mod->arch.got.shdr) {
+		pr_err("%s: module GOT section(s) missing\n", mod->name);
+		return -ENOEXEC;
+	}
 
 	/* Calculate the maxinum number of entries */
 	for (i = 0; i < ehdr->e_shnum; i++) {
@@ -100,7 +128,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 		if (!(dst_sec->sh_flags & SHF_EXECINSTR))
 			continue;
 
-		count_max_entries(relas, num_rela, &num_plts);
+		count_max_entries(relas, num_rela, &num_plts, &num_gots);
 	}
 
 	mod->arch.plt.shdr->sh_type = SHT_NOBITS;
@@ -117,5 +145,12 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 	mod->arch.plt_idx.num_entries = 0;
 	mod->arch.plt_idx.max_entries = num_plts;
 
+	mod->arch.got.shdr->sh_type = SHT_NOBITS;
+	mod->arch.got.shdr->sh_flags = SHF_ALLOC;
+	mod->arch.got.shdr->sh_addralign = L1_CACHE_BYTES;
+	mod->arch.got.shdr->sh_size = (num_plts + 1) * sizeof(struct plt_entry);
+	mod->arch.got.num_entries = 0;
+	mod->arch.got.max_entries = num_plts;
+
 	return 0;
 }
-- 
2.37.0



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 2/5] LoongArch: Support R_LARCH_SOP_PUSH_GPREL relocation type in kernel module
  2022-07-27 16:24 [PATCH 0/5] LoongArch: Support new relocation types Xi Ruoyao
  2022-07-27 16:26 ` [PATCH 1/5] LoongArch: Add section of GOT for kernel module Xi Ruoyao
@ 2022-07-27 16:27 ` Xi Ruoyao
  2022-07-27 16:28 ` [PATCH 3/5] LoongArch: Support relocation against _GLOBAL_OFFSET_TABLE_ Xi Ruoyao
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 17+ messages in thread
From: Xi Ruoyao @ 2022-07-27 16:27 UTC (permalink / raw)
  To: loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

This relocation type pushes the offset of the GOT entry for a symbol
from the beginning of GOT into the relocation stack.  Our linker script
has initialized an empty GOT, so we need to create a new GOT entry if
there is no exist one for a symbol.

Signed-off-by: Xi Ruoyao <xry111@xry111.site>
---
 arch/loongarch/kernel/module.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/arch/loongarch/kernel/module.c b/arch/loongarch/kernel/module.c
index 638427ff0d51..e5f1fd022cd0 100644
--- a/arch/loongarch/kernel/module.c
+++ b/arch/loongarch/kernel/module.c
@@ -122,6 +122,16 @@ static int apply_r_larch_sop_push_plt_pcrel(struct module *mod, u32 *location, E
 	return apply_r_larch_sop_push_pcrel(mod, location, v, rela_stack, rela_stack_top, type);
 }
 
+static int apply_r_larch_sop_push_gprel(struct module *mod, u32 *location,
+			Elf_Addr v, s64 *rela_stack, size_t *rela_stack_top,
+			unsigned int type)
+{
+	Elf_Addr got = module_emit_got_entry(mod, v);
+	ptrdiff_t offset = (void *)got - (void *)mod->arch.got.shdr->sh_addr;
+
+	return rela_stack_push(offset, rela_stack, rela_stack_top);
+}
+
 static int apply_r_larch_sop(struct module *mod, u32 *location, Elf_Addr v,
 			s64 *rela_stack, size_t *rela_stack_top, unsigned int type)
 {
@@ -310,6 +320,7 @@ static reloc_rela_handler reloc_rela_handlers[] = {
 	[R_LARCH_SOP_SUB ... R_LARCH_SOP_IF_ELSE] 	     = apply_r_larch_sop,
 	[R_LARCH_SOP_POP_32_S_10_5 ... R_LARCH_SOP_POP_32_U] = apply_r_larch_sop_imm_field,
 	[R_LARCH_ADD32 ... R_LARCH_SUB64]		     = apply_r_larch_add_sub,
+	[R_LARCH_SOP_PUSH_GPREL]			     = apply_r_larch_sop_push_gprel,
 };
 
 int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
-- 
2.37.0



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 3/5] LoongArch: Support relocation against _GLOBAL_OFFSET_TABLE_
  2022-07-27 16:24 [PATCH 0/5] LoongArch: Support new relocation types Xi Ruoyao
  2022-07-27 16:26 ` [PATCH 1/5] LoongArch: Add section of GOT for kernel module Xi Ruoyao
  2022-07-27 16:27 ` [PATCH 2/5] LoongArch: Support R_LARCH_SOP_PUSH_GPREL relocation type in " Xi Ruoyao
@ 2022-07-27 16:28 ` Xi Ruoyao
  2022-07-28  1:02   ` Jinyang He
  2022-07-27 16:29 ` [PATCH 4/5] LoongArch: Stop using undocumented assembler options Xi Ruoyao
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 17+ messages in thread
From: Xi Ruoyao @ 2022-07-27 16:28 UTC (permalink / raw)
  To: loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

With the stack-based relocations, the assembler emits three relocations
to push the PC-relative offset of a GOT entry:

    R_LARCH_SOP_PUSH_PCREL _GLOBAL_OFFSET_TABLE_
    R_LARCH_SOP_PUSH_GPREL foo
    R_LARCH_SOP_ADD

"_GLOBAL_OFFSET_TABLE_" does not really exist in the symtab and the BFD
linker handles it with special hack.  Implement a similar hack for
kernel so we will be able to really use R_LARCH_SOP_PUSH_GPREL
relocation.

Signed-off-by: Xi Ruoyao <xry111@xry111.site>
---
 arch/loongarch/kernel/module-sections.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/arch/loongarch/kernel/module-sections.c b/arch/loongarch/kernel/module-sections.c
index 509c0b86b1e9..73976addbf60 100644
--- a/arch/loongarch/kernel/module-sections.c
+++ b/arch/loongarch/kernel/module-sections.c
@@ -89,6 +89,9 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 			      char *secstrings, struct module *mod)
 {
 	unsigned int i, num_plts = 0, num_gots = 0;
+	Elf_Shdr *symtab = NULL;
+	Elf_Sym *symbols;
+	char *strings;
 
 	/*
 	 * Find the empty .plt sections.
@@ -100,6 +103,8 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 			mod->arch.plt_idx.shdr = sechdrs + i;
 		else if (!strcmp(secstrings + sechdrs[i].sh_name, ".got"))
 			mod->arch.got.shdr = sechdrs + i;
+		else if (sechdrs[i].sh_type == SHT_SYMTAB)
+			symtab = sechdrs + i;
 	}
 
 	if (!mod->arch.plt.shdr) {
@@ -115,6 +120,22 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 		return -ENOEXEC;
 	}
 
+	if (!symtab) {
+		pr_err("%s: module symbol table missing\n", mod->name);
+		return -ENOEXEC;
+	}
+
+	symbols = (void *) ehdr + symtab->sh_offset;
+	strings = (void *) ehdr + sechdrs[symtab->sh_link].sh_offset;
+
+	for (i = 0; i < symtab->sh_size / sizeof(Elf_Sym); i++)
+		if (symbols[i].st_shndx == SHN_UNDEF &&
+		    strcmp(strings + symbols[i].st_name,
+			   "_GLOBAL_OFFSET_TABLE_") == 0) {
+			symbols[i].st_shndx = mod->arch.got.shdr - sechdrs;
+			symbols[i].st_value = 0;
+		}
+
 	/* Calculate the maxinum number of entries */
 	for (i = 0; i < ehdr->e_shnum; i++) {
 		int num_rela = sechdrs[i].sh_size / sizeof(Elf_Rela);
-- 
2.37.0



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 4/5] LoongArch: Stop using undocumented assembler options
  2022-07-27 16:24 [PATCH 0/5] LoongArch: Support new relocation types Xi Ruoyao
                   ` (2 preceding siblings ...)
  2022-07-27 16:28 ` [PATCH 3/5] LoongArch: Support relocation against _GLOBAL_OFFSET_TABLE_ Xi Ruoyao
@ 2022-07-27 16:29 ` Xi Ruoyao
  2022-07-28  9:46   ` Youling Tang
  2022-07-27 16:31 ` [PATCH 5/5] LoongArch: Support modules with new relocation types Xi Ruoyao
  2022-07-27 16:46 ` [PATCH 0/5] LoongArch: Support " Xi Ruoyao
  5 siblings, 1 reply; 17+ messages in thread
From: Xi Ruoyao @ 2022-07-27 16:29 UTC (permalink / raw)
  To: loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

Now we can handle GOT and GOT-based relocations properly, remove the
undocumented `-Wa,-mla-{global,local}-with-{pcrel,abs}` assembler hacks.

Adjust assembly code to explicitly use "la.pcrel" where necessary.

Signed-off-by: Xi Ruoyao <xry111@xry111.site>
---
 arch/loongarch/Makefile      |  5 +----
 arch/loongarch/kernel/head.S | 10 +++++-----
 2 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile
index 039dcc4fe1f3..9552c7880d34 100644
--- a/arch/loongarch/Makefile
+++ b/arch/loongarch/Makefile
@@ -40,10 +40,7 @@ endif
 
 cflags-y			+= -G0 -pipe -msoft-float
 LDFLAGS_vmlinux			+= -G0 -static -n -nostdlib
-KBUILD_AFLAGS_KERNEL		+= -Wa,-mla-global-with-pcrel
-KBUILD_CFLAGS_KERNEL		+= -Wa,-mla-global-with-pcrel
-KBUILD_AFLAGS_MODULE		+= -Wa,-mla-global-with-abs
-KBUILD_CFLAGS_MODULE		+= -fplt -Wa,-mla-global-with-abs,-mla-local-with-abs
+KBUILD_CFLAGS_MODULE		+= -fplt
 
 cflags-y += -ffreestanding
 cflags-y += $(call cc-option, -mno-check-zero-division)
diff --git a/arch/loongarch/kernel/head.S b/arch/loongarch/kernel/head.S
index 74ea7bf6c8d6..193329ed6e8c 100644
--- a/arch/loongarch/kernel/head.S
+++ b/arch/loongarch/kernel/head.S
@@ -60,17 +60,17 @@ SYM_CODE_START(kernel_entry)			# kernel entry point
 	la.abs		t0, 0f
 	jirl		zero, t0, 0
 0:
-	la		t0, __bss_start		# clear .bss
+	la.pcrel	t0, __bss_start		# clear .bss
 	st.d		zero, t0, 0
-	la		t1, __bss_stop - LONGSIZE
+	la.pcrel	t1, __bss_stop - LONGSIZE
 1:
 	addi.d		t0, t0, LONGSIZE
 	st.d		zero, t0, 0
 	bne		t0, t1, 1b
 
-	la		t0, fw_arg0
+	la.pcrel	t0, fw_arg0
 	st.d		a0, t0, 0		# firmware arguments
-	la		t0, fw_arg1
+	la.pcrel	t0, fw_arg1
 	st.d		a1, t0, 0
 
 	/* KSave3 used for percpu base, initialized as 0 */
@@ -78,7 +78,7 @@ SYM_CODE_START(kernel_entry)			# kernel entry point
 	/* GPR21 used for percpu base (runtime), initialized as 0 */
 	or		u0, zero, zero
 
-	la		tp, init_thread_union
+	la.pcrel	tp, init_thread_union
 	/* Set the SP after an empty pt_regs.  */
 	PTR_LI		sp, (_THREAD_SIZE - 32 - PT_SIZE)
 	PTR_ADD		sp, sp, tp
-- 
2.37.0



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 5/5] LoongArch: Support modules with new relocation types
  2022-07-27 16:24 [PATCH 0/5] LoongArch: Support new relocation types Xi Ruoyao
                   ` (3 preceding siblings ...)
  2022-07-27 16:29 ` [PATCH 4/5] LoongArch: Stop using undocumented assembler options Xi Ruoyao
@ 2022-07-27 16:31 ` Xi Ruoyao
  2022-07-27 16:46 ` [PATCH 0/5] LoongArch: Support " Xi Ruoyao
  5 siblings, 0 replies; 17+ messages in thread
From: Xi Ruoyao @ 2022-07-27 16:31 UTC (permalink / raw)
  To: loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

If GAS 2.40 and/or GCC 13 is used to build the kernel, the modules will
contain R_LARCH_B26, R_LARCH_PCALA_HI20, R_LARCH_PCALA_LO12,
R_LARCH_GOT_PC_HI20, and R_LARCH_GOT_PC_LO12 relocations.  Support them
in the module loader to allow a kernel built with latest toolchain
capable to load the modules.

Signed-off-by: Xi Ruoyao <xry111@xry111.site>
---
 arch/loongarch/include/asm/elf.h        | 37 +++++++++++
 arch/loongarch/kernel/module-sections.c | 12 +++-
 arch/loongarch/kernel/module.c          | 83 +++++++++++++++++++++++++
 3 files changed, 130 insertions(+), 2 deletions(-)

diff --git a/arch/loongarch/include/asm/elf.h b/arch/loongarch/include/asm/elf.h
index f3960b18a90e..aeca7a9924ea 100644
--- a/arch/loongarch/include/asm/elf.h
+++ b/arch/loongarch/include/asm/elf.h
@@ -74,6 +74,43 @@
 #define R_LARCH_SUB64				56
 #define R_LARCH_GNU_VTINHERIT			57
 #define R_LARCH_GNU_VTENTRY			58
+#define R_LARCH_B16				64
+#define R_LARCH_B21				65
+#define R_LARCH_B26				66
+#define R_LARCH_ABS_HI20			67
+#define R_LARCH_ABS_LO12			68
+#define R_LARCH_ABS64_LO20			69
+#define R_LARCH_ABS64_HI12			70
+#define R_LARCH_PCALA_HI20			71
+#define R_LARCH_PCALA_LO12			72
+#define R_LARCH_PCALA64_LO20			73
+#define R_LARCH_PCALA64_HI12			74
+#define R_LARCH_GOT_PC_HI20			75
+#define R_LARCH_GOT_PC_LO12			76
+#define R_LARCH_GOT64_PC_LO20			77
+#define R_LARCH_GOT64_PC_HI12			78
+#define R_LARCH_GOT_HI20			79
+#define R_LARCH_GOT_LO12			80
+#define R_LARCH_GOT64_LO20			81
+#define R_LARCH_GOT64_HI12			82
+#define R_LARCH_TLS_LE_HI20			83
+#define R_LARCH_TLS_LE_LO12			84
+#define R_LARCH_TLS_LE64_LO20			85
+#define R_LARCH_TLS_LE64_HI12			86
+#define R_LARCH_TLS_IE_PC_HI20			87
+#define R_LARCH_TLS_IE_PC_LO12			88
+#define R_LARCH_TLS_IE64_PC_LO20		89
+#define R_LARCH_TLS_IE64_PC_HI12		90
+#define R_LARCH_TLS_IE_HI20			91
+#define R_LARCH_TLS_IE_LO12			92
+#define R_LARCH_TLS_IE64_LO20			93
+#define R_LARCH_TLS_IE64_HI12			94
+#define R_LARCH_TLS_LD_PC_HI20			95
+#define R_LARCH_TLS_LD_HI20			96
+#define R_LARCH_TLS_GD_PC_HI20			97
+#define R_LARCH_TLS_GD_HI20			98
+#define R_LARCH_32_PCREL			99
+#define R_LARCH_RELAX				100
 
 #ifndef ELF_ARCH
 
diff --git a/arch/loongarch/kernel/module-sections.c b/arch/loongarch/kernel/module-sections.c
index 73976addbf60..9baf119388b9 100644
--- a/arch/loongarch/kernel/module-sections.c
+++ b/arch/loongarch/kernel/module-sections.c
@@ -76,12 +76,20 @@ static void count_max_entries(Elf_Rela *relas, int num,
 
 	for (i = 0; i < num; i++) {
 		type = ELF_R_TYPE(relas[i].r_info);
-		if (type == R_LARCH_SOP_PUSH_PLT_PCREL) {
+		switch (type) {
+		case R_LARCH_SOP_PUSH_PLT_PCREL:
+		case R_LARCH_B26:
 			if (!duplicate_rela(relas, i))
 				(*plts)++;
-		} else if (type == R_LARCH_SOP_PUSH_GPREL)
+			break;
+		case R_LARCH_SOP_PUSH_GPREL:
+		case R_LARCH_GOT_PC_HI20:
 			if (!duplicate_rela(relas, i))
 				(*gots)++;
+			break;
+		default:
+			/* Do nothing. */
+		}
 	}
 }
 
diff --git a/arch/loongarch/kernel/module.c b/arch/loongarch/kernel/module.c
index e5f1fd022cd0..1aa6a58b1c21 100644
--- a/arch/loongarch/kernel/module.c
+++ b/arch/loongarch/kernel/module.c
@@ -291,6 +291,84 @@ static int apply_r_larch_add_sub(struct module *mod, u32 *location, Elf_Addr v,
 	}
 }
 
+static int apply_r_larch_b26(struct module *mod, u32 *location, Elf_Addr v,
+			s64 *rela_stack, size_t *rela_stack_top, unsigned int type)
+{
+	ptrdiff_t offset = (void *)v - (void *)location;
+
+	if (offset >= SZ_128M)
+		v = module_emit_plt_entry(mod, v);
+
+	if (offset < -SZ_128M)
+		v = module_emit_plt_entry(mod, v);
+
+	offset = (void *)v - (void *)location;
+
+	if (!signed_imm_check(offset, 28)) {
+		pr_err("module %s: jump offset = 0x%llx overflow! dangerous R_LARCH_B26 (%u) relocation\n",
+				mod->name, (long long)offset, type);
+		return -ENOEXEC;
+	}
+
+	if (offset & 3) {
+		pr_err("module %s: jump offset = 0x%llx unaligned! dangerous R_LARCH_B26 (%u) relocation\n",
+				mod->name, (long long)offset, type);
+		return -ENOEXEC;
+	}
+
+	*location &= ~(u32)0x3ffffff;
+	*location |= (offset >> 18) & 0x3ff;
+	*location |= ((offset >> 2) & 0xffff) << 10;
+	return 0;
+}
+
+static int apply_r_larch_pcala_hi20(struct module *mod, u32 *location,
+		Elf_Addr v, s64 *rela_stack, size_t *rela_stack_top,
+		unsigned int type)
+{
+	ptrdiff_t offset = (void *)((v + 0x800) & ~0xfff) -
+		(void *)((Elf_Addr)location & ~0xfff);
+
+	if (!signed_imm_check(offset, 32)) {
+		pr_err("module %s: PCALA offset = 0x%llx does not fit in 32-bit signed and is unsupported by kernel! dangerous %s (%u) relocation\n",
+				mod->name, (long long)offset, __func__, type);
+		return -ENOEXEC;
+	}
+
+	*location &= ~((u32)0xfffff << 5);
+	*location |= ((offset >> 12) & 0xfffff) << 5;
+	return 0;
+}
+
+static int apply_r_larch_got_pc_hi20(struct module *mod, u32 *location,
+		Elf_Addr v, s64 *rela_stack, size_t *rela_stack_top,
+		unsigned int type)
+{
+	Elf_Addr got = module_emit_got_entry(mod, v);
+
+	return apply_r_larch_pcala_hi20(mod, location, got, rela_stack,
+			rela_stack_top, type);
+}
+
+static int apply_r_larch_pcala_lo12(struct module *mod, u32 *location,
+		Elf_Addr v, s64 *rela_stack, size_t *rela_stack_top,
+		unsigned int type)
+{
+	*location &= ~((u32)0xfff << 10);
+	*location |= ((u32)v & 0xfff) << 10;
+	return 0;
+}
+
+static int apply_r_larch_got_pc_lo12(struct module *mod, u32 *location,
+		Elf_Addr v, s64 *rela_stack, size_t *rela_stack_top,
+		unsigned int type)
+{
+	Elf_Addr got = module_emit_got_entry(mod, v);
+
+	return apply_r_larch_pcala_lo12(mod, location, got, rela_stack,
+			rela_stack_top, type);
+}
+
 /*
  * reloc_handlers_rela() - Apply a particular relocation to a module
  * @mod: the module to apply the reloc to
@@ -321,6 +399,11 @@ static reloc_rela_handler reloc_rela_handlers[] = {
 	[R_LARCH_SOP_POP_32_S_10_5 ... R_LARCH_SOP_POP_32_U] = apply_r_larch_sop_imm_field,
 	[R_LARCH_ADD32 ... R_LARCH_SUB64]		     = apply_r_larch_add_sub,
 	[R_LARCH_SOP_PUSH_GPREL]			     = apply_r_larch_sop_push_gprel,
+	[R_LARCH_B26]					     = apply_r_larch_b26,
+	[R_LARCH_PCALA_HI20]				     = apply_r_larch_pcala_hi20,
+	[R_LARCH_PCALA_LO12]				     = apply_r_larch_pcala_lo12,
+	[R_LARCH_GOT_PC_HI20]				     = apply_r_larch_got_pc_hi20,
+	[R_LARCH_GOT_PC_LO12]				     = apply_r_larch_got_pc_lo12,
 };
 
 int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
-- 
2.37.0



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH 0/5] LoongArch: Support new relocation types
  2022-07-27 16:24 [PATCH 0/5] LoongArch: Support new relocation types Xi Ruoyao
                   ` (4 preceding siblings ...)
  2022-07-27 16:31 ` [PATCH 5/5] LoongArch: Support modules with new relocation types Xi Ruoyao
@ 2022-07-27 16:46 ` Xi Ruoyao
  5 siblings, 0 replies; 17+ messages in thread
From: Xi Ruoyao @ 2022-07-27 16:46 UTC (permalink / raw)
  To: loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

Self notes:

With "-mla-global-with-pcrel" in KBUILD_CFLAGS_KERNEL gone (even if I
don't remove it, it will be ineffective with binutils-2.40/gcc-13), the
kernel will use GOT to access the objects in other translation units. 
It may cause a performance regression.

*If* such a performance regression is really observed, we need to change
GCC to use PC relative addressing (instead of GOT) for loading external
objects when -fno-PIC.  Such a change will benefit userspace apps as
well, *if* PC relative addressing is really faster than GOT access.

(Emphasize "if" here: I've not run any benchmarks yet.)

I'll be mostly AFK in the following one or two weeks, apologize for
possible slow respond.

On Thu, 2022-07-28 at 00:24 +0800, Xi Ruoyao wrote:
> The version 2.00 of LoongArch ELF ABI specification introduced new
> relocation types, and the development tree of Binutils and GCC has
> started to use them.  If the kernel is built with the latest snapshot of
> Binutils or GCC, it will fail to load the modules because of unrecognized
> relocation types in modules.
> 
> Add support for GOT and new relocation types for the module loader, so
> the kernel (with modules) can be built with the "normal" code model and
> function properly.
> 
> Tested by building the kernel with Binutils & GCC master branch, and
> running the kernel with 35 in-tree modules loaded.
> 
> Link: https://github.com/loongson/LoongArch-Documentation/pull/57
> Link: https://gcc.gnu.org/r13-1834
> Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=f09482a
> 
> Xi Ruoyao (5):
>   LoongArch: Add section of GOT for kernel module
>   LoongArch: Support R_LARCH_SOP_PUSH_GPREL relocation type in kernel
>     module
>   LoongArch: Support relocation against _GLOBAL_OFFSET_TABLE_
>   LoongArch: Stop using undocumented assembler options
>   LoongArch: Support modules with new relocation types
> 
>  arch/loongarch/Makefile                 |  5 +-
>  arch/loongarch/include/asm/elf.h        | 37 ++++++++++
>  arch/loongarch/include/asm/module.h     | 23 ++++++
>  arch/loongarch/include/asm/module.lds.h |  1 +
>  arch/loongarch/kernel/head.S            | 10 +--
>  arch/loongarch/kernel/module-sections.c | 72 +++++++++++++++++--
>  arch/loongarch/kernel/module.c          | 94 +++++++++++++++++++++++++
>  7 files changed, 229 insertions(+), 13 deletions(-)
> 

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 3/5] LoongArch: Support relocation against _GLOBAL_OFFSET_TABLE_
  2022-07-27 16:28 ` [PATCH 3/5] LoongArch: Support relocation against _GLOBAL_OFFSET_TABLE_ Xi Ruoyao
@ 2022-07-28  1:02   ` Jinyang He
  2022-07-28  6:41     ` Xi Ruoyao
  0 siblings, 1 reply; 17+ messages in thread
From: Jinyang He @ 2022-07-28  1:02 UTC (permalink / raw)
  To: Xi Ruoyao, loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

On 07/28/2022 12:28 AM, Xi Ruoyao wrote:
> With the stack-based relocations, the assembler emits three relocations
> to push the PC-relative offset of a GOT entry:
>
>      R_LARCH_SOP_PUSH_PCREL _GLOBAL_OFFSET_TABLE_
>      R_LARCH_SOP_PUSH_GPREL foo
>      R_LARCH_SOP_ADD
>
> "_GLOBAL_OFFSET_TABLE_" does not really exist in the symtab and the BFD
> linker handles it with special hack.  Implement a similar hack for
> kernel so we will be able to really use R_LARCH_SOP_PUSH_GPREL
> relocation.
>
> Signed-off-by: Xi Ruoyao <xry111@xry111.site>
> ---
>   arch/loongarch/kernel/module-sections.c | 21 +++++++++++++++++++++
>   1 file changed, 21 insertions(+)
>
> diff --git a/arch/loongarch/kernel/module-sections.c b/arch/loongarch/kernel/module-sections.c
> index 509c0b86b1e9..73976addbf60 100644
> --- a/arch/loongarch/kernel/module-sections.c
> +++ b/arch/loongarch/kernel/module-sections.c
> @@ -89,6 +89,9 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
>   			      char *secstrings, struct module *mod)
>   {
>   	unsigned int i, num_plts = 0, num_gots = 0;
> +	Elf_Shdr *symtab = NULL;
> +	Elf_Sym *symbols;
> +	char *strings;
>   
>   	/*
>   	 * Find the empty .plt sections.
> @@ -100,6 +103,8 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
>   			mod->arch.plt_idx.shdr = sechdrs + i;
>   		else if (!strcmp(secstrings + sechdrs[i].sh_name, ".got"))
>   			mod->arch.got.shdr = sechdrs + i;
> +		else if (sechdrs[i].sh_type == SHT_SYMTAB)
> +			symtab = sechdrs + i;
>   	}
>   
>   	if (!mod->arch.plt.shdr) {
> @@ -115,6 +120,22 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
>   		return -ENOEXEC;
>   	}
>   
> +	if (!symtab) {
> +		pr_err("%s: module symbol table missing\n", mod->name);
> +		return -ENOEXEC;
> +	}
> +
> +	symbols = (void *) ehdr + symtab->sh_offset;
> +	strings = (void *) ehdr + sechdrs[symtab->sh_link].sh_offset;
> +
> +	for (i = 0; i < symtab->sh_size / sizeof(Elf_Sym); i++)
> +		if (symbols[i].st_shndx == SHN_UNDEF &&
> +		    strcmp(strings + symbols[i].st_name,
> +			   "_GLOBAL_OFFSET_TABLE_") == 0) {
> +			symbols[i].st_shndx = mod->arch.got.shdr - sechdrs;
> +			symbols[i].st_value = 0;
> +		}
> +
>   	/* Calculate the maxinum number of entries */
>   	for (i = 0; i < ehdr->e_shnum; i++) {
>   		int num_rela = sechdrs[i].sh_size / sizeof(Elf_Rela);

Hi, Ruoyao,


It is possible to create a symbol when linking, which means
maybe we can add _GLOBAL_OFFSET_TABLE_ in 'module.lds.h'.
What do you think about it?


Thanks,

Jinyang


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 3/5] LoongArch: Support relocation against _GLOBAL_OFFSET_TABLE_
  2022-07-28  1:02   ` Jinyang He
@ 2022-07-28  6:41     ` Xi Ruoyao
  2022-07-28  9:14       ` Jinyang He
  0 siblings, 1 reply; 17+ messages in thread
From: Xi Ruoyao @ 2022-07-28  6:41 UTC (permalink / raw)
  To: Jinyang He, loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

On Thu, 2022-07-28 at 09:02 +0800, Jinyang He wrote:

> Hi, Ruoyao,
> 
> It is possible to create a symbol when linking, which means
> maybe we can add _GLOBAL_OFFSET_TABLE_ in 'module.lds.h'.
> What do you think about it?

Hi Jinyang,

I think you are right, this patch can be replaced with the following,
which is much simpler.

-- >8 --

With the stack-based relocations, the assembler emits three relocations
to push the PC-relative offset of a GOT entry:

    R_LARCH_SOP_PUSH_PCREL _GLOBAL_OFFSET_TABLE_
    R_LARCH_SOP_PUSH_GPREL foo
    R_LARCH_SOP_ADD

In normal relocatable ELF object files, "_GLOBAL_OFFSET_TABLE_" is
undefined in the symtab and the BFD linker generates it on final link.
Define it for kernel modules so we will be able to really use
R_LARCH_SOP_PUSH_GPREL relocation.

Note that we need to use "HIDDEN" to make it a local symbol because each
kernel module has its own GOT and the reference to it should not be
resolved to the GOT in the main kernel image.

Suggested-by: Jinyang He <hejinyang@loongson.cn>
Signed-off-by: Xi Ruoyao <xry111@xry111.site>
---
 arch/loongarch/include/asm/module.lds.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/loongarch/include/asm/module.lds.h b/arch/loongarch/include/asm/module.lds.h
index 57bbd0cedd26..42b7cca0b947 100644
--- a/arch/loongarch/include/asm/module.lds.h
+++ b/arch/loongarch/include/asm/module.lds.h
@@ -4,5 +4,5 @@ SECTIONS {
 	. = ALIGN(4);
 	.plt : { BYTE(0) }
 	.plt.idx : { BYTE(0) }
-	.got : { BYTE(0) }
+	.got : { HIDDEN(_GLOBAL_OFFSET_TABLE_ = .); BYTE(0) }
 }
-- 
2.37.0

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH 1/5] LoongArch: Add section of GOT for kernel module
       [not found]   ` <849f514e-f78a-72a2-b94e-6974074b75eb@loongson.cn>
@ 2022-07-28  9:02     ` Xi Ruoyao
  2022-07-28  9:21       ` Youling Tang
  0 siblings, 1 reply; 17+ messages in thread
From: Xi Ruoyao @ 2022-07-28  9:02 UTC (permalink / raw)
  To: Youling Tang, loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

On Thu, 2022-07-28 at 16:29 +0800, Youling Tang wrote:
> On 07/28/2022 12:26 AM, Xi Ruoyao wrote:
> > +	mod->arch.got.shdr->sh_type = SHT_NOBITS;
> > +	mod->arch.got.shdr->sh_flags = SHF_ALLOC;
> > +	mod->arch.got.shdr->sh_addralign = L1_CACHE_BYTES;
> > +	mod->arch.got.shdr->sh_size = (num_plts + 1) *
> > sizeof(struct plt_entry);
> > +	mod->arch.got.num_entries = 0;
> > +	mod->arch.got.max_entries = num_plts;
>  Hi, Ruoyao
> 
>   We should use num_gots instead of num_plts when creating .got
> section.

Yes, it's a stupid error and I'll fix it in V2.

But why didn't this cause a malfunction on my system? :(.

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 3/5] LoongArch: Support relocation against _GLOBAL_OFFSET_TABLE_
  2022-07-28  6:41     ` Xi Ruoyao
@ 2022-07-28  9:14       ` Jinyang He
  2022-07-28 10:57         ` Xi Ruoyao
  0 siblings, 1 reply; 17+ messages in thread
From: Jinyang He @ 2022-07-28  9:14 UTC (permalink / raw)
  To: Xi Ruoyao, loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

On 07/28/2022 02:41 PM, Xi Ruoyao wrote:

> On Thu, 2022-07-28 at 09:02 +0800, Jinyang He wrote:
>
>> Hi, Ruoyao,
>>
>> It is possible to create a symbol when linking, which means
>> maybe we can add _GLOBAL_OFFSET_TABLE_ in 'module.lds.h'.
>> What do you think about it?
> Hi Jinyang,
>
> I think you are right, this patch can be replaced with the following,
> which is much simpler.
>
> -- >8 --
>
> With the stack-based relocations, the assembler emits three relocations
> to push the PC-relative offset of a GOT entry:
>
>      R_LARCH_SOP_PUSH_PCREL _GLOBAL_OFFSET_TABLE_
>      R_LARCH_SOP_PUSH_GPREL foo
>      R_LARCH_SOP_ADD
>
> In normal relocatable ELF object files, "_GLOBAL_OFFSET_TABLE_" is
> undefined in the symtab and the BFD linker generates it on final link.
> Define it for kernel modules so we will be able to really use
> R_LARCH_SOP_PUSH_GPREL relocation.
>
> Note that we need to use "HIDDEN" to make it a local symbol because each
> kernel module has its own GOT and the reference to it should not be
> resolved to the GOT in the main kernel image.
>
> Suggested-by: Jinyang He <hejinyang@loongson.cn>
> Signed-off-by: Xi Ruoyao <xry111@xry111.site>
> ---
>   arch/loongarch/include/asm/module.lds.h | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/loongarch/include/asm/module.lds.h b/arch/loongarch/include/asm/module.lds.h
> index 57bbd0cedd26..42b7cca0b947 100644
> --- a/arch/loongarch/include/asm/module.lds.h
> +++ b/arch/loongarch/include/asm/module.lds.h
> @@ -4,5 +4,5 @@ SECTIONS {
>   	. = ALIGN(4);
>   	.plt : { BYTE(0) }
>   	.plt.idx : { BYTE(0) }
> -	.got : { BYTE(0) }
> +	.got : { HIDDEN(_GLOBAL_OFFSET_TABLE_ = .); BYTE(0) }
Not sure but maybe re-align is needed here.
Since '{BYTE(0)}' actually use 1byte. _GLOABL_OFFSET_TABLE_ may have
difference with really GOT table entry. Have no machine and without 
test... :-(

Thanks,
Jinyang
>   }


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 1/5] LoongArch: Add section of GOT for kernel module
  2022-07-28  9:02     ` Xi Ruoyao
@ 2022-07-28  9:21       ` Youling Tang
  2022-07-28 10:53         ` Xi Ruoyao
  0 siblings, 1 reply; 17+ messages in thread
From: Youling Tang @ 2022-07-28  9:21 UTC (permalink / raw)
  To: Xi Ruoyao, loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen



On 07/28/2022 05:02 PM, Xi Ruoyao wrote:
> On Thu, 2022-07-28 at 16:29 +0800, Youling Tang wrote:
>> On 07/28/2022 12:26 AM, Xi Ruoyao wrote:
>>> +	mod->arch.got.shdr->sh_type = SHT_NOBITS;
>>> +	mod->arch.got.shdr->sh_flags = SHF_ALLOC;
>>> +	mod->arch.got.shdr->sh_addralign = L1_CACHE_BYTES;
>>> +	mod->arch.got.shdr->sh_size = (num_plts + 1) *
>>> sizeof(struct plt_entry);
>>> +	mod->arch.got.num_entries = 0;
>>> +	mod->arch.got.max_entries = num_plts;
>>  Hi, Ruoyao
>>
>>   We should use num_gots instead of num_plts when creating .got
>> section.
>
> Yes, it's a stupid error and I'll fix it in V2.
>
> But why didn't this cause a malfunction on my system? :(.

Maybe num_plts is greater than num_gots, and the size of plt_entry is 
equivalent to the size of four got_entry, so that when the module is 
loaded, it just allocates a larger space without causing the module to 
fail to load.

Thanks,
Youling
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 4/5] LoongArch: Stop using undocumented assembler options
  2022-07-27 16:29 ` [PATCH 4/5] LoongArch: Stop using undocumented assembler options Xi Ruoyao
@ 2022-07-28  9:46   ` Youling Tang
  2022-07-28 10:58     ` Xi Ruoyao
  0 siblings, 1 reply; 17+ messages in thread
From: Youling Tang @ 2022-07-28  9:46 UTC (permalink / raw)
  To: Xi Ruoyao, loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen


On 07/28/2022 12:29 AM, Xi Ruoyao wrote:
> Now we can handle GOT and GOT-based relocations properly, remove the
> undocumented `-Wa,-mla-{global,local}-with-{pcrel,abs}` assembler hacks.
>
> Adjust assembly code to explicitly use "la.pcrel" where necessary.
>
> Signed-off-by: Xi Ruoyao <xry111@xry111.site>
> ---
>  arch/loongarch/Makefile      |  5 +----
>  arch/loongarch/kernel/head.S | 10 +++++-----
>  2 files changed, 6 insertions(+), 9 deletions(-)
>
> diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile
> index 039dcc4fe1f3..9552c7880d34 100644
> --- a/arch/loongarch/Makefile
> +++ b/arch/loongarch/Makefile
> @@ -40,10 +40,7 @@ endif
>
>  cflags-y			+= -G0 -pipe -msoft-float
>  LDFLAGS_vmlinux			+= -G0 -static -n -nostdlib
> -KBUILD_AFLAGS_KERNEL		+= -Wa,-mla-global-with-pcrel
> -KBUILD_CFLAGS_KERNEL		+= -Wa,-mla-global-with-pcrel
> -KBUILD_AFLAGS_MODULE		+= -Wa,-mla-global-with-abs
> -KBUILD_CFLAGS_MODULE		+= -fplt -Wa,-mla-global-with-abs,-mla-local-with-abs
> +KBUILD_CFLAGS_MODULE		+= -fplt

The -fplt flag may be removed, the compiler defaults to -fplt if not
specified (riscv is also not manually specified as -fplt).

Thanks,
Youling


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 1/5] LoongArch: Add section of GOT for kernel module
  2022-07-28  9:21       ` Youling Tang
@ 2022-07-28 10:53         ` Xi Ruoyao
  0 siblings, 0 replies; 17+ messages in thread
From: Xi Ruoyao @ 2022-07-28 10:53 UTC (permalink / raw)
  To: Youling Tang, loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

On Thu, 2022-07-28 at 17:21 +0800, Youling Tang wrote:
> 
> 
> On 07/28/2022 05:02 PM, Xi Ruoyao wrote:
> > On Thu, 2022-07-28 at 16:29 +0800, Youling Tang wrote:
> > > On 07/28/2022 12:26 AM, Xi Ruoyao wrote:
> > > > +       mod->arch.got.shdr->sh_type = SHT_NOBITS;
> > > > +       mod->arch.got.shdr->sh_flags = SHF_ALLOC;
> > > > +       mod->arch.got.shdr->sh_addralign = L1_CACHE_BYTES;
> > > > +       mod->arch.got.shdr->sh_size = (num_plts + 1) *
> > > > sizeof(struct plt_entry);
> > > > +       mod->arch.got.num_entries = 0;
> > > > +       mod->arch.got.max_entries = num_plts;
> > >  Hi, Ruoyao
> > > 
> > >   We should use num_gots instead of num_plts when creating .got
> > > section.
> > 
> > Yes, it's a stupid error and I'll fix it in V2.
> > 
> > But why didn't this cause a malfunction on my system? :(.
> 
> Maybe num_plts is greater than num_gots, and the size of plt_entry is 
> equivalent to the size of four got_entry, so that when the module is 
> loaded, it just allocates a larger space without causing the module to
> fail to load.

I'll write a module to load address of 10 kernel symbols with only one
printk call to test before sending V2 :).

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 3/5] LoongArch: Support relocation against _GLOBAL_OFFSET_TABLE_
  2022-07-28  9:14       ` Jinyang He
@ 2022-07-28 10:57         ` Xi Ruoyao
  2022-07-28 11:21           ` Jinyang He
  0 siblings, 1 reply; 17+ messages in thread
From: Xi Ruoyao @ 2022-07-28 10:57 UTC (permalink / raw)
  To: Jinyang He, loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

On Thu, 2022-07-28 at 17:14 +0800, Jinyang He wrote:
> Not sure but maybe re-align is needed here.
> Since '{BYTE(0)}' actually use 1byte. _GLOABL_OFFSET_TABLE_ may have
> difference with really GOT table entry. Have no machine and without 
> test... :-(

BYTE(0) is only for preventing the linker from removing the section. 
All we want from the linker is a slot for .got in the section table, and
the actual property (including size) will be filled at runtime by
module_frob_arch_sections.  The first GOT entry won't be "appended"
after one byte, it is wrote into the start of .got (at runtime).

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 4/5] LoongArch: Stop using undocumented assembler options
  2022-07-28  9:46   ` Youling Tang
@ 2022-07-28 10:58     ` Xi Ruoyao
  0 siblings, 0 replies; 17+ messages in thread
From: Xi Ruoyao @ 2022-07-28 10:58 UTC (permalink / raw)
  To: Youling Tang, loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

On Thu, 2022-07-28 at 17:46 +0800, Youling Tang wrote:
> 
> On 07/28/2022 12:29 AM, Xi Ruoyao wrote:
> > Now we can handle GOT and GOT-based relocations properly, remove the
> > undocumented `-Wa,-mla-{global,local}-with-{pcrel,abs}` assembler
> > hacks.
> > 
> > Adjust assembly code to explicitly use "la.pcrel" where necessary.
> > 
> > Signed-off-by: Xi Ruoyao <xry111@xry111.site>
> > ---
> >  arch/loongarch/Makefile      |  5 +----
> >  arch/loongarch/kernel/head.S | 10 +++++-----
> >  2 files changed, 6 insertions(+), 9 deletions(-)
> > 
> > diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile
> > index 039dcc4fe1f3..9552c7880d34 100644
> > --- a/arch/loongarch/Makefile
> > +++ b/arch/loongarch/Makefile
> > @@ -40,10 +40,7 @@ endif
> > 
> >  cflags-y                       += -G0 -pipe -msoft-float
> >  LDFLAGS_vmlinux                        += -G0 -static -n -nostdlib
> > -KBUILD_AFLAGS_KERNEL           += -Wa,-mla-global-with-pcrel
> > -KBUILD_CFLAGS_KERNEL           += -Wa,-mla-global-with-pcrel
> > -KBUILD_AFLAGS_MODULE           += -Wa,-mla-global-with-abs
> > -KBUILD_CFLAGS_MODULE           += -fplt -Wa,-mla-global-with-abs,-
> > mla-local-with-abs
> > +KBUILD_CFLAGS_MODULE           += -fplt
> 
> The -fplt flag may be removed, the compiler defaults to -fplt if not
> specified (riscv is also not manually specified as -fplt).

Will remove explicit -fplt in V2.

By the way, how do you think about "-G0"?  It does not have any effect
now because the toolchain does not attempt to use sbss/sdata sections.
Do we have any plan to add sbss and sdata support in the toolchain?


-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 3/5] LoongArch: Support relocation against _GLOBAL_OFFSET_TABLE_
  2022-07-28 10:57         ` Xi Ruoyao
@ 2022-07-28 11:21           ` Jinyang He
  0 siblings, 0 replies; 17+ messages in thread
From: Jinyang He @ 2022-07-28 11:21 UTC (permalink / raw)
  To: Xi Ruoyao, loongarch; +Cc: linux-kernel, WANG Xuerui, Huacai Chen

On 07/28/2022 06:57 PM, Xi Ruoyao wrote:

> On Thu, 2022-07-28 at 17:14 +0800, Jinyang He wrote:
>> Not sure but maybe re-align is needed here.
>> Since '{BYTE(0)}' actually use 1byte. _GLOABL_OFFSET_TABLE_ may have
>> difference with really GOT table entry. Have no machine and without
>> test... :-(
> BYTE(0) is only for preventing the linker from removing the section.
> All we want from the linker is a slot for .got in the section table, and
> the actual property (including size) will be filled at runtime by
> module_frob_arch_sections.  The first GOT entry won't be "appended"
> after one byte, it is wrote into the start of .got (at runtime).
Thank you for the detail answer which solves a doubt
that bothered me for a long time. I used to define the
'sym' outside of '.sec'. It always failed without align.


^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2022-07-28 11:21 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-27 16:24 [PATCH 0/5] LoongArch: Support new relocation types Xi Ruoyao
2022-07-27 16:26 ` [PATCH 1/5] LoongArch: Add section of GOT for kernel module Xi Ruoyao
     [not found]   ` <849f514e-f78a-72a2-b94e-6974074b75eb@loongson.cn>
2022-07-28  9:02     ` Xi Ruoyao
2022-07-28  9:21       ` Youling Tang
2022-07-28 10:53         ` Xi Ruoyao
2022-07-27 16:27 ` [PATCH 2/5] LoongArch: Support R_LARCH_SOP_PUSH_GPREL relocation type in " Xi Ruoyao
2022-07-27 16:28 ` [PATCH 3/5] LoongArch: Support relocation against _GLOBAL_OFFSET_TABLE_ Xi Ruoyao
2022-07-28  1:02   ` Jinyang He
2022-07-28  6:41     ` Xi Ruoyao
2022-07-28  9:14       ` Jinyang He
2022-07-28 10:57         ` Xi Ruoyao
2022-07-28 11:21           ` Jinyang He
2022-07-27 16:29 ` [PATCH 4/5] LoongArch: Stop using undocumented assembler options Xi Ruoyao
2022-07-28  9:46   ` Youling Tang
2022-07-28 10:58     ` Xi Ruoyao
2022-07-27 16:31 ` [PATCH 5/5] LoongArch: Support modules with new relocation types Xi Ruoyao
2022-07-27 16:46 ` [PATCH 0/5] LoongArch: Support " Xi Ruoyao

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.