From nobody Tue Apr 14 15:39:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8A815ECAAD5 for ; Sat, 27 Aug 2022 17:55:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229595AbiH0Rzm (ORCPT ); Sat, 27 Aug 2022 13:55:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52314 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229379AbiH0Rzj (ORCPT ); Sat, 27 Aug 2022 13:55:39 -0400 Received: from xry111.site (xry111.site [89.208.246.23]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EE0A380E95 for ; Sat, 27 Aug 2022 10:55:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=xry111.site; s=default; t=1661622932; bh=5gF4zRm2HsqlA+R+dZxda56qftVNflTTvjyLrTHAMIM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=c6rb0leMlO7eX0MklNiG6AD2hAIWrbtHCisYgFWqmKST8dVf9FHmklm+j4sXagKLX JLSCk3fU7+92bJdpb2l3fP3N0WN0k1VLywJDnxo/mU7lCVUquyu3kOG6Z/KfgGZ+0J DdIV8gG40gGjCu/ikWCEsRsm874hlc7I87wB8rT4= Received: from xry111-x57s1.. (unknown [IPv6:240e:358:1157:dc00:dc73:854d:832e:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (Client did not present a certificate) (Authenticated sender: xry111@xry111.site) by xry111.site (Postfix) with ESMTPSA id 1CC9B667FF; Sat, 27 Aug 2022 13:55:24 -0400 (EDT) From: Xi Ruoyao To: loongarch@lists.linux.dev Cc: linux-kernel@vger.kernel.org, WANG Xuerui , Huacai Chen , Youling Tang , Jinyang He , Xi Ruoyao Subject: [PATCH 1/8] LoongArch: Add CONFIG_CC_HAS_EXPLICIT_RELOCS Date: Sun, 28 Aug 2022 01:54:29 +0800 Message-Id: <20220827175436.156464-2-xry111@xry111.site> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220827175436.156464-1-xry111@xry111.site> References: <20220827175436.156464-1-xry111@xry111.site> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" GNU as >=3D 2.40 and GCC >=3D 13 will support using explicit relocation hints in the assembly code, instead of la.* macros. The usage of explicit relocation hints can improve code generation so it's enabled by default by GCC >=3D 13. We need to adapt the kernel for this change, introduce CONFIG_CC_HAS_EXPLICIT_RELOCS so we can use it in later patches. Signed-off-by: Xi Ruoyao --- arch/loongarch/Kconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig index 810096bbf853..e7cfd451024b 100644 --- a/arch/loongarch/Kconfig +++ b/arch/loongarch/Kconfig @@ -203,6 +203,9 @@ config SCHED_OMIT_FRAME_POINTER bool default y =20 +config CC_HAS_EXPLICIT_RELOCS + def_bool $(cc-option,-mexplicit-relocs) && $(as-instr,x:pcalau12i \$t0$(c= omma)%pc_hi20(x)) + menu "Kernel type and options" =20 source "kernel/Kconfig.hz" --=20 2.37.0 From nobody Tue Apr 14 15:39:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B83F8ECAAD1 for ; Sat, 27 Aug 2022 17:55:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229379AbiH0Rzr (ORCPT ); Sat, 27 Aug 2022 13:55:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52804 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229736AbiH0Rzn (ORCPT ); Sat, 27 Aug 2022 13:55:43 -0400 Received: from xry111.site (xry111.site [89.208.246.23]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DD71A80515 for ; Sat, 27 Aug 2022 10:55:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=xry111.site; s=default; t=1661622938; bh=aWS3z7K5q+R4s35cYvJ4OdynNgvtS0vSuzHZvho9eZY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GYDlhfYBlTndeTYinokoJH/Qg8GwOAhpEqGEYEEHzUiBLYYe17K2cQInkrQWkHbr6 u+pR5JsigNRPCOjKzhXJhl7VqiPyOTVS7pQyWMXVFE3ELcZlhKHE/egjz87aZ5hawL KulvSHTpAwMnPr98q6GRrWa6E+eMjBDn4TlbTPyM= Received: from xry111-x57s1.. (unknown [IPv6:240e:358:1157:dc00:dc73:854d:832e:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (Client did not present a certificate) (Authenticated sender: xry111@xry111.site) by xry111.site (Postfix) with ESMTPSA id EC82C66800; Sat, 27 Aug 2022 13:55:33 -0400 (EDT) From: Xi Ruoyao To: loongarch@lists.linux.dev Cc: linux-kernel@vger.kernel.org, WANG Xuerui , Huacai Chen , Youling Tang , Jinyang He , Xi Ruoyao Subject: [PATCH 2/8] LoongArch: Only use -Wa,-mla-* options for !CONFIG_CC_HAS_EXPLICIT_RELOCS Date: Sun, 28 Aug 2022 01:54:30 +0800 Message-Id: <20220827175436.156464-3-xry111@xry111.site> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220827175436.156464-1-xry111@xry111.site> References: <20220827175436.156464-1-xry111@xry111.site> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" If explicit relocation hints is used by the toolchain, -Wa,-mla-* options will be useless for C code. Only use them for !CONFIG_CC_HAS_EXPLICIT_RELOCS. Replace "la" with "la.pcrel" in head.S to keep the semantic consistent with new and old toolchains for the low level startup code. Signed-off-by: Xi Ruoyao --- arch/loongarch/Makefile | 15 ++++++++++++++- arch/loongarch/kernel/head.S | 10 +++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile index 415e09bdf31a..bd0ea6623245 100644 --- a/arch/loongarch/Makefile +++ b/arch/loongarch/Makefile @@ -40,10 +40,23 @@ endif =20 cflags-y +=3D -G0 -pipe -msoft-float LDFLAGS_vmlinux +=3D -G0 -static -n -nostdlib + +ifdef CONFIG_CC_HAS_EXPLICIT_RELOCS +# GCC may have -mexplicit-relocs off by default if it was built with an old +# assembler. But with CONFIG_CC_HAS_EXPLICIT_RELOCS we are sure explicit +# relocation hints are supported by the assembler, so force it. +cflags-y +=3D -mexplicit-relocs +else +# Likewise, disable -mexplicit-relocs if GCC enables by default but the +# assembler does not support it. +cflags-y +=3D $(call cc-option,-mno-explicit-relocs) +# With -mno-explicit-relocs, use assembler options to adjust code generati= on +# for symbol address. KBUILD_AFLAGS_KERNEL +=3D -Wa,-mla-global-with-pcrel KBUILD_CFLAGS_KERNEL +=3D -Wa,-mla-global-with-pcrel KBUILD_AFLAGS_MODULE +=3D -Wa,-mla-global-with-abs -KBUILD_CFLAGS_MODULE +=3D -fplt -Wa,-mla-global-with-abs,-mla-local-with-= abs +KBUILD_CFLAGS_MODULE +=3D -Wa,-mla-global-with-abs,-mla-local-with-abs +endif =20 cflags-y +=3D -ffreestanding cflags-y +=3D $(call cc-option, -mno-check-zero-division) diff --git a/arch/loongarch/kernel/head.S b/arch/loongarch/kernel/head.S index 01bac62a6442..eb3f641d5915 100644 --- a/arch/loongarch/kernel/head.S +++ b/arch/loongarch/kernel/head.S @@ -55,17 +55,17 @@ SYM_CODE_START(kernel_entry) # kernel entry point li.w t0, 0x00 # FPE=3D0, SXE=3D0, ASXE=3D0, BTE=3D0 csrwr t0, LOONGARCH_CSR_EUEN =20 - 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 =20 - 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 =20 /* KSave3 used for percpu base, initialized as 0 */ @@ -73,7 +73,7 @@ SYM_CODE_START(kernel_entry) # kernel entry point /* GPR21 used for percpu base (runtime), initialized as 0 */ move u0, zero =20 - 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 --=20 2.37.0 From nobody Tue Apr 14 15:39:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 075B9ECAAD1 for ; Sat, 27 Aug 2022 17:56:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229772AbiH0R4E (ORCPT ); Sat, 27 Aug 2022 13:56:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54078 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229839AbiH0R4A (ORCPT ); Sat, 27 Aug 2022 13:56:00 -0400 Received: from xry111.site (xry111.site [IPv6:2001:470:683e::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AD6B4E1A8B for ; Sat, 27 Aug 2022 10:55:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=xry111.site; s=default; t=1661622945; bh=YGYJfp6hCx6eH/Nfs4eCDr4R+EBIr89AN05AxFZ+kgc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YfmnvIQhShxhFIXVDAToyJ1ELWZL6QeJ2yG/WcjvdQMttr3TJG0L2yuIPNe7LpV6I 5lUzVvu8gddgVi3Hx8by36u0fpLbY4swYaZO442keZQYcwb99WzXFbnP6tVXqoC6v7 Sv83fJxeO4H0BPiv58PAQL2AfqynQATsXTUqo7is= Received: from xry111-x57s1.. (unknown [IPv6:240e:358:1157:dc00:dc73:854d:832e:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (Client did not present a certificate) (Authenticated sender: xry111@xry111.site) by xry111.site (Postfix) with ESMTPSA id B3FEB667FF; Sat, 27 Aug 2022 13:55:39 -0400 (EDT) From: Xi Ruoyao To: loongarch@lists.linux.dev Cc: linux-kernel@vger.kernel.org, WANG Xuerui , Huacai Chen , Youling Tang , Jinyang He , Xi Ruoyao Subject: [PATCH 3/8] LoongArch: Define ELF relocation types added in v2.00 ABI Date: Sun, 28 Aug 2022 01:54:31 +0800 Message-Id: <20220827175436.156464-4-xry111@xry111.site> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220827175436.156464-1-xry111@xry111.site> References: <20220827175436.156464-1-xry111@xry111.site> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" These relocation types are used by GNU binutils >=3D 2.40 and GCC >=3D 13. Add their definitions so we will be able to use them in later patches. Link: https://github.com/loongson/LoongArch-Documentation/pull/57 Signed-off-by: Xi Ruoyao --- arch/loongarch/include/asm/elf.h | 37 ++++++++++++++++++++++++++++++++ arch/loongarch/kernel/module.c | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/arch/loongarch/include/asm/elf.h b/arch/loongarch/include/asm/= elf.h index 5f3ff4781fda..7af0cebf28d7 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 =20 #ifndef ELF_ARCH =20 diff --git a/arch/loongarch/kernel/module.c b/arch/loongarch/kernel/module.c index 638427ff0d51..755d91ef8d85 100644 --- a/arch/loongarch/kernel/module.c +++ b/arch/loongarch/kernel/module.c @@ -296,7 +296,7 @@ typedef int (*reloc_rela_handler)(struct module *mod, u= 32 *location, Elf_Addr v, =20 /* The handlers for known reloc types */ static reloc_rela_handler reloc_rela_handlers[] =3D { - [R_LARCH_NONE ... R_LARCH_SUB64] =3D apply_r_larch_error, + [R_LARCH_NONE ... R_LARCH_RELAX] =3D apply_r_larch_error, =20 [R_LARCH_NONE] =3D apply_r_larch_none, [R_LARCH_32] =3D apply_r_larch_32, --=20 2.37.0 From nobody Tue Apr 14 15:39:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 33603ECAAD5 for ; Sat, 27 Aug 2022 17:56:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229549AbiH0R4L (ORCPT ); Sat, 27 Aug 2022 13:56:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54622 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229909AbiH0R4I (ORCPT ); Sat, 27 Aug 2022 13:56:08 -0400 Received: from xry111.site (xry111.site [IPv6:2001:470:683e::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 60A3BE8300 for ; Sat, 27 Aug 2022 10:55:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=xry111.site; s=default; t=1661622952; bh=cjqHborlmmsEk4gf/sTqVWHd8WMhLLWTrrXr/AzZ8d4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WNQcolyo/59aa31yB0oBuXSLCbohxLagmFeDYFKGeomtYN55IT5XJ12CMumt1gxGV uNgpdsotyBum247PQJUoyyBczP0qvyFI55UlnSjqgJQHUUgmX7ITLSkeGpfHzzNoh6 FqhD8vxOxDnz5BrhVtdSB+WuqE0c52x0x6BobEgY= Received: from xry111-x57s1.. (unknown [IPv6:240e:358:1157:dc00:dc73:854d:832e:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (Client did not present a certificate) (Authenticated sender: xry111@xry111.site) by xry111.site (Postfix) with ESMTPSA id 0315B66801; Sat, 27 Aug 2022 13:55:46 -0400 (EDT) From: Xi Ruoyao To: loongarch@lists.linux.dev Cc: linux-kernel@vger.kernel.org, WANG Xuerui , Huacai Chen , Youling Tang , Jinyang He , Xi Ruoyao Subject: [PATCH 4/8] LoongArch: Support R_LARCH_B26 in modules Date: Sun, 28 Aug 2022 01:54:32 +0800 Message-Id: <20220827175436.156464-5-xry111@xry111.site> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220827175436.156464-1-xry111@xry111.site> References: <20220827175436.156464-1-xry111@xry111.site> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Binutils >=3D 2.40 uses R_LARCH_B26 for function calls with "bl" instructions, instead of a pair of R_LARCH_SOP_PUSH_PLT_PCREL and R_LARCH_SOP_POP_32_S_0_10_10_16_S2. Handle R_LARCH_B26 in the module loader and create a PLT entry as needed, so a modules can call functions in main kernel image if it's built with Binutils >=3D 2.40. Signed-off-by: Xi Ruoyao --- arch/loongarch/kernel/module-sections.c | 7 +++++- arch/loongarch/kernel/module.c | 33 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/arch/loongarch/kernel/module-sections.c b/arch/loongarch/kerne= l/module-sections.c index 6d498288977d..c67b9cb220eb 100644 --- a/arch/loongarch/kernel/module-sections.c +++ b/arch/loongarch/kernel/module-sections.c @@ -56,9 +56,14 @@ static void count_max_entries(Elf_Rela *relas, int num, = unsigned int *plts) =20 for (i =3D 0; i < num; i++) { type =3D ELF_R_TYPE(relas[i].r_info); - if (type =3D=3D 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)++; + break; + default: + /* Do nothing. */ } } } diff --git a/arch/loongarch/kernel/module.c b/arch/loongarch/kernel/module.c index 755d91ef8d85..e54df4717e4f 100644 --- a/arch/loongarch/kernel/module.c +++ b/arch/loongarch/kernel/module.c @@ -281,6 +281,38 @@ static int apply_r_larch_add_sub(struct module *mod, u= 32 *location, Elf_Addr v, } } =20 +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 =3D (void *)v - (void *)location; + union loongarch_instruction *insn =3D (union loongarch_instruction *)loca= tion; + + if (offset >=3D SZ_128M) + v =3D module_emit_plt_entry(mod, v); + + if (offset < -SZ_128M) + v =3D module_emit_plt_entry(mod, v); + + offset =3D (void *)v - (void *)location; + + if (offset & 3) { + pr_err("module %s: jump offset =3D 0x%llx unaligned! dangerous R_LARCH_B= 26 (%u) relocation\n", + mod->name, (long long)offset, type); + return -ENOEXEC; + } + + if (!signed_imm_check(offset, 28)) { + pr_err("module %s: jump offset =3D 0x%llx overflow! dangerous R_LARCH_B2= 6 (%u) relocation\n", + mod->name, (long long)offset, type); + return -ENOEXEC; + } + + offset >>=3D 2; + insn->reg0i26_format.immediate_l =3D offset & 0xffff; + insn->reg0i26_format.immediate_h =3D (offset >> 16) & 0x3ff; + return 0; +} + /* * reloc_handlers_rela() - Apply a particular relocation to a module * @mod: the module to apply the reloc to @@ -310,6 +342,7 @@ static reloc_rela_handler reloc_rela_handlers[] =3D { [R_LARCH_SOP_SUB ... R_LARCH_SOP_IF_ELSE] =3D apply_r_larch_sop, [R_LARCH_SOP_POP_32_S_10_5 ... R_LARCH_SOP_POP_32_U] =3D apply_r_larch_so= p_imm_field, [R_LARCH_ADD32 ... R_LARCH_SUB64] =3D apply_r_larch_add_sub, + [R_LARCH_B26] =3D apply_r_larch_b26, }; =20 int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, --=20 2.37.0 From nobody Tue Apr 14 15:39:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6E332ECAAD1 for ; Sat, 27 Aug 2022 17:56:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231343AbiH0R4g (ORCPT ); Sat, 27 Aug 2022 13:56:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55104 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230058AbiH0R4Y (ORCPT ); Sat, 27 Aug 2022 13:56:24 -0400 Received: from xry111.site (xry111.site [IPv6:2001:470:683e::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 60BF8EA312 for ; Sat, 27 Aug 2022 10:56:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=xry111.site; s=default; t=1661622961; bh=Cy5JEnPKz+uW+QWU7fbJlNTXHrB/qYUsL6GTu0Jzp/Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PwPg5TKlaGWemvSDB9vCeTQeELlJIKL27iBTNUV/BgcGM4P1XejlnKwLRVKkdYZBV pACvZkYjzUP/bjYK19EbXjc/+EqZ1pRk67jQLneBT7oDv/XcQM0IlaVodJfk3vIVxJ rp09tMLT0p4Rb5qlMjbsM5Neh/f594MIfyyYFI7s= Received: from xry111-x57s1.. (unknown [IPv6:240e:358:1157:dc00:dc73:854d:832e:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (Client did not present a certificate) (Authenticated sender: xry111@xry111.site) by xry111.site (Postfix) with ESMTPSA id 0BE5066802; Sat, 27 Aug 2022 13:55:52 -0400 (EDT) From: Xi Ruoyao To: loongarch@lists.linux.dev Cc: linux-kernel@vger.kernel.org, WANG Xuerui , Huacai Chen , Youling Tang , Jinyang He , Xi Ruoyao Subject: [PATCH 5/8] LoongArch: Support R_LARCH_ABS* in modules Date: Sun, 28 Aug 2022 01:54:33 +0800 Message-Id: <20220827175436.156464-6-xry111@xry111.site> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220827175436.156464-1-xry111@xry111.site> References: <20220827175436.156464-1-xry111@xry111.site> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Binutils >=3D 2.40 uses R_LARCH_ABS* for relocations expanding "la.abs" macro, instead of R_LARCH_PUSH_ABSOLUTE and other stack operations. Handle R_LARCH_ABS* so we can load modules built with Binutils >=3D 2.40. Signed-off-by: Xi Ruoyao --- arch/loongarch/kernel/module.c | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/arch/loongarch/kernel/module.c b/arch/loongarch/kernel/module.c index e54df4717e4f..54be05c62145 100644 --- a/arch/loongarch/kernel/module.c +++ b/arch/loongarch/kernel/module.c @@ -313,6 +313,41 @@ static int apply_r_larch_b26(struct module *mod, u32 *= location, Elf_Addr v, return 0; } =20 +static int apply_r_larch_abs(struct module *mod, u32 *location, Elf_Addr v, + s64 *rela_stack, size_t *rela_stack_top, unsigned int type) +{ + union loongarch_instruction *insn =3D (union loongarch_instruction *)loca= tion; + + switch (type) { + case R_LARCH_ABS_HI20: + v >>=3D 12; + break; + case R_LARCH_ABS64_LO20: + v >>=3D 32; + break; + case R_LARCH_ABS64_HI12: + v >>=3D 52; + break; + default: + /* Do nothing. */ + } + + switch (type) { + case R_LARCH_ABS_HI20: + case R_LARCH_ABS64_LO20: + insn->reg1i20_format.immediate =3D v & 0xfffff; + break; + case R_LARCH_ABS_LO12: + case R_LARCH_ABS64_HI12: + insn->reg2i12_format.immediate =3D v & 0xfff; + break; + default: + pr_err("%s: Unsupport relocation type %u\n", mod->name, type); + return -EINVAL; + } + + return 0; +} /* * reloc_handlers_rela() - Apply a particular relocation to a module * @mod: the module to apply the reloc to @@ -343,6 +378,7 @@ static reloc_rela_handler reloc_rela_handlers[] =3D { [R_LARCH_SOP_POP_32_S_10_5 ... R_LARCH_SOP_POP_32_U] =3D apply_r_larch_so= p_imm_field, [R_LARCH_ADD32 ... R_LARCH_SUB64] =3D apply_r_larch_add_sub, [R_LARCH_B26] =3D apply_r_larch_b26, + [R_LARCH_ABS_HI20...R_LARCH_ABS64_HI12] =3D apply_r_larch_abs, }; =20 int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, --=20 2.37.0 From nobody Tue Apr 14 15:39:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9352DECAAD5 for ; Sat, 27 Aug 2022 17:56:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229909AbiH0R4Y (ORCPT ); Sat, 27 Aug 2022 13:56:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54744 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229916AbiH0R4N (ORCPT ); Sat, 27 Aug 2022 13:56:13 -0400 Received: from xry111.site (xry111.site [IPv6:2001:470:683e::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D3897E01F3 for ; Sat, 27 Aug 2022 10:56:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=xry111.site; s=default; t=1661622967; bh=Sdq8ZYzZnQy9EkfcHVFGSRWK5K9Fxb6STtdvVoeRLVE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Bx4hV/1JE610b4hy3t4uBhWviGK5RvpFq0TDgBU1GpYBbKdW47Cr4LLG+GQ0F7gfM 5yJrHWLNqmOqaCWcum4AlFmx7+JEH3lNCenibWqDPfP7KNuxNUtXVwb5rwSKfI9DuI +B6CjvkJyISd1UThnrIMUcJbu7gxtFeX01yI4AfA= Received: from xry111-x57s1.. (unknown [IPv6:240e:358:1157:dc00:dc73:854d:832e:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (Client did not present a certificate) (Authenticated sender: xry111@xry111.site) by xry111.site (Postfix) with ESMTPSA id 6F31166803; Sat, 27 Aug 2022 13:56:01 -0400 (EDT) From: Xi Ruoyao To: loongarch@lists.linux.dev Cc: linux-kernel@vger.kernel.org, WANG Xuerui , Huacai Chen , Youling Tang , Jinyang He , Xi Ruoyao Subject: [PATCH 6/8] LoongArch: Use model("extreme") attribute for per-CPU variables in module if CONFIG_CC_HAS_EXPLICIT_RELOCS Date: Sun, 28 Aug 2022 01:54:34 +0800 Message-Id: <20220827175436.156464-7-xry111@xry111.site> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220827175436.156464-1-xry111@xry111.site> References: <20220827175436.156464-1-xry111@xry111.site> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" On LoongArch, The "address" of a per-CPU variable symbol is actually an offset from $r21. The value is nearing the loading address of main kernel image, but far from the address of modules. We need to tell the compiler that a PC-relative addressing with 32-bit offset is not sufficient for local per-CPU variables. After some discussion with GCC maintainers, we implemented this attribute to indicate that a PC-relative addressing with 64-bit offset should be used. This attribute should be available in GCC 13 release. Some early GCC 13 snapshots may support -mexplicit-relocs but lack this attribute, we simply reject them. Link: https://gcc.gnu.org/r13-2199 Signed-off-by: Xi Ruoyao --- arch/loongarch/include/asm/percpu.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/arch/loongarch/include/asm/percpu.h b/arch/loongarch/include/a= sm/percpu.h index 0bd6b0110198..91d4026b074e 100644 --- a/arch/loongarch/include/asm/percpu.h +++ b/arch/loongarch/include/asm/percpu.h @@ -8,6 +8,19 @@ #include #include =20 +#if defined(MODULE) && defined(CONFIG_CC_HAS_EXPLICIT_RELOCS) +# if __has_attribute(model) +/* The "address" (in fact, offset from $r21) of a per-CPU variable is close + * to the load address of main kernel image, but far from where the module= s are + * loaded. Tell the compiler this fact. + */ +# define PER_CPU_ATTRIBUTES __attribute__((model("extreme"))) +# else /* __has_attribute(model) */ +/* This should only happen with early GCC 13 snapshots. */ +# error "Compiler with explicit relocs but no model attribute is not supp= orted" +# endif /* __has_attribute(model) */ +#endif + /* Use r21 for fast access */ register unsigned long __my_cpu_offset __asm__("$r21"); =20 --=20 2.37.0 From nobody Tue Apr 14 15:39:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A5A6FECAAD1 for ; Sat, 27 Aug 2022 17:56:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230051AbiH0R4i (ORCPT ); Sat, 27 Aug 2022 13:56:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55786 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231167AbiH0R40 (ORCPT ); Sat, 27 Aug 2022 13:56:26 -0400 Received: from xry111.site (xry111.site [89.208.246.23]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 392BFEEC6A for ; Sat, 27 Aug 2022 10:56:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=xry111.site; s=default; t=1661622974; bh=D/xO81IDb2K17po/ppXxDCpbQzjp4AkgROc9wcYpui8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=B9+Xs5ty+niYC0SswmGljn7sE6xKUCS5Y4m/L0oxJYTX3ugIJRfYpHjvpQA/eJ/+U 1b7ACzzCCvWb856iZI/DR6CLQFGlsAnkkKlJMa59Z1GY47GnCTuq9djUvaerdvhTgH ysmBPjobWIgKbb+1voxSGONlb1i79mVYim4hR91M= Received: from xry111-x57s1.. (unknown [IPv6:240e:358:1157:dc00:dc73:854d:832e:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (Client did not present a certificate) (Authenticated sender: xry111@xry111.site) by xry111.site (Postfix) with ESMTPSA id 5043666801; Sat, 27 Aug 2022 13:56:07 -0400 (EDT) From: Xi Ruoyao To: loongarch@lists.linux.dev Cc: linux-kernel@vger.kernel.org, WANG Xuerui , Huacai Chen , Youling Tang , Jinyang He , Xi Ruoyao Subject: [PATCH 7/8] LoongArch: Support R_LARCH_PCALA* in modules Date: Sun, 28 Aug 2022 01:54:35 +0800 Message-Id: <20220827175436.156464-8-xry111@xry111.site> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220827175436.156464-1-xry111@xry111.site> References: <20220827175436.156464-1-xry111@xry111.site> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" GCC >=3D 13 and GNU assembler >=3D 2.40 use these relocations to address local symbols, so we need to add them. Signed-off-by: Xi Ruoyao --- arch/loongarch/kernel/module.c | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/arch/loongarch/kernel/module.c b/arch/loongarch/kernel/module.c index 54be05c62145..61ecd174dd03 100644 --- a/arch/loongarch/kernel/module.c +++ b/arch/loongarch/kernel/module.c @@ -348,6 +348,48 @@ static int apply_r_larch_abs(struct module *mod, u32 *= location, Elf_Addr v, =20 return 0; } + +static int apply_r_larch_pcala(struct module *mod, u32 *location, Elf_Addr= v, + s64 *rela_stack, size_t *rela_stack_top, unsigned int type) +{ + union loongarch_instruction *insn =3D (union loongarch_instruction *)loca= tion; + /* Use s32 for a sign-extension deliberately. */ + s32 offset_hi20 =3D (void *)((v + 0x800) & ~0xfff) - + (void *)((Elf_Addr)location & ~0xfff); + Elf_Addr anchor =3D (((Elf_Addr)location) & ~0xfff) + offset_hi20; + ptrdiff_t offset_rem =3D (void *)v - (void *)anchor; + + switch (type) { + case R_LARCH_PCALA_HI20: + v =3D offset_hi20 >> 12; + break; + case R_LARCH_PCALA64_LO20: + v =3D offset_rem >> 32; + break; + case R_LARCH_PCALA64_HI12: + v =3D offset_rem >> 52; + break; + default: + /* Do nothing. */ + } + + switch (type) { + case R_LARCH_PCALA_HI20: + case R_LARCH_PCALA64_LO20: + insn->reg1i20_format.immediate =3D v & 0xfffff; + break; + case R_LARCH_PCALA_LO12: + case R_LARCH_PCALA64_HI12: + insn->reg2i12_format.immediate =3D v & 0xfff; + break; + default: + pr_err("%s: Unsupport relocation type %u\n", mod->name, type); + return -EINVAL; + } + + return 0; +} + /* * reloc_handlers_rela() - Apply a particular relocation to a module * @mod: the module to apply the reloc to @@ -379,6 +421,7 @@ static reloc_rela_handler reloc_rela_handlers[] =3D { [R_LARCH_ADD32 ... R_LARCH_SUB64] =3D apply_r_larch_add_sub, [R_LARCH_B26] =3D apply_r_larch_b26, [R_LARCH_ABS_HI20...R_LARCH_ABS64_HI12] =3D apply_r_larch_abs, + [R_LARCH_PCALA_HI20...R_LARCH_PCALA64_HI12] =3D apply_r_larch_pcala, }; =20 int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, --=20 2.37.0 From nobody Tue Apr 14 15:39:40 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2F2C0ECAAD5 for ; Sat, 27 Aug 2022 17:56:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231307AbiH0R4t (ORCPT ); Sat, 27 Aug 2022 13:56:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55104 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230422AbiH0R4e (ORCPT ); Sat, 27 Aug 2022 13:56:34 -0400 Received: from xry111.site (xry111.site [89.208.246.23]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 290F6E3993 for ; Sat, 27 Aug 2022 10:56:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=xry111.site; s=default; t=1661622981; bh=8mrWmTXV6n9Id+Gx7iWuD5ZGJlt9LxLt/SRZ0QpLHXY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hIMPfb6iKAdsMlF+rtszgI7TX+dLdaGykxYv/yXmRXb6IICGU+B5gzbdeaR3eA002 5oUUUX2ODLu3VA45KJIsSkixaujXJkoRxEGrsFYwAm3UZThh+BoHYSc7szuRL9y1Rv +txeQYLKou0PLEtQOpdkbYvJeowQtLVd03iqteY4= Received: from xry111-x57s1.. (unknown [IPv6:240e:358:1157:dc00:dc73:854d:832e:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (Client did not present a certificate) (Authenticated sender: xry111@xry111.site) by xry111.site (Postfix) with ESMTPSA id 5247166804; Sat, 27 Aug 2022 13:56:14 -0400 (EDT) From: Xi Ruoyao To: loongarch@lists.linux.dev Cc: linux-kernel@vger.kernel.org, WANG Xuerui , Huacai Chen , Youling Tang , Jinyang He , Xi Ruoyao Subject: [PATCH 8/8] LoongArch: Support R_LARCH_GOT_PC* in modules Date: Sun, 28 Aug 2022 01:54:36 +0800 Message-Id: <20220827175436.156464-9-xry111@xry111.site> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220827175436.156464-1-xry111@xry111.site> References: <20220827175436.156464-1-xry111@xry111.site> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" GCC >=3D 13 and GNU assembler >=3D 2.40 use these relocations to address external symbols, so we need to add them. 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. In module.lds, emit a stub .got section for a section header entry. The actual content of the entry will be filled at runtime by module_frob_arch_sections. Signed-off-by: Xi Ruoyao --- arch/loongarch/include/asm/module.h | 23 ++++++++++++ arch/loongarch/include/asm/module.lds.h | 1 + arch/loongarch/kernel/module-sections.c | 49 +++++++++++++++++++++++-- arch/loongarch/kernel/module.c | 24 ++++++++++++ 4 files changed, 94 insertions(+), 3 deletions(-) diff --git a/arch/loongarch/include/asm/module.h b/arch/loongarch/include/a= sm/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; }; =20 struct plt_entry { @@ -28,11 +29,16 @@ struct plt_entry { u32 inst_jirl; }; =20 +struct got_entry { + Elf_Addr symbol_addr; +}; + struct plt_idx_entry { unsigned long symbol_addr; }; =20 Elf_Addr module_emit_plt_entry(struct module *mod, unsigned long val); +Elf_Addr module_emit_got_entry(struct module *mod, Elf_Addr val); =20 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(un= signed long val) return (struct plt_idx_entry) { val }; } =20 +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 l= ong val, return plt + plt_idx; } =20 +static inline struct got_entry *get_got_entry(Elf_Addr val, + const struct mod_section *sec) +{ + struct got_entry *got =3D (struct got_entry *)sec->shdr->sh_addr; + int i; + + for (i =3D 0; i < sec->num_entries; i++) + if (got[i].symbol_addr =3D=3D val) + return &got[i]; + return NULL; +} + #endif /* _ASM_MODULE_H */ diff --git a/arch/loongarch/include/asm/module.lds.h b/arch/loongarch/inclu= de/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 { . =3D ALIGN(4); .plt : { BYTE(0) } .plt.idx : { BYTE(0) } + .got : { BYTE(0) } } diff --git a/arch/loongarch/kernel/module-sections.c b/arch/loongarch/kerne= l/module-sections.c index c67b9cb220eb..4c99737cd8dc 100644 --- a/arch/loongarch/kernel/module-sections.c +++ b/arch/loongarch/kernel/module-sections.c @@ -33,6 +33,31 @@ Elf_Addr module_emit_plt_entry(struct module *mod, unsig= ned long val) return (Elf_Addr)&plt[nr]; } =20 +Elf_Addr module_emit_got_entry(struct module *mod, Elf_Addr val) +{ + struct mod_section *got_sec =3D &mod->arch.got; + int i =3D got_sec->num_entries; + struct got_entry *got =3D 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 =3D (struct got_entry *)got_sec->shdr->sh_addr; + got[i] =3D emit_got_entry(val); + + got_sec->num_entries++; + if (got_sec->num_entries > got_sec->max_entries) { + /* This may happen when the module contains a GOT_HI20 without + * a paired GOT_LO12. Such a module is broken, reject it. + */ + pr_err("%s: module contains bad GOT relocation\n", mod->name); + return 0; + } + + return (Elf_Addr)&got[i]; +} + static int is_rela_equal(const Elf_Rela *x, const Elf_Rela *y) { return x->r_info =3D=3D y->r_info && x->r_addend =3D=3D y->r_addend; @@ -50,7 +75,8 @@ static bool duplicate_rela(const Elf_Rela *rela, int idx) return false; } =20 -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; =20 @@ -62,6 +88,10 @@ static void count_max_entries(Elf_Rela *relas, int num, = unsigned int *plts) if (!duplicate_rela(relas, i)) (*plts)++; break; + case R_LARCH_GOT_PC_HI20: + if (!duplicate_rela(relas, i)) + (*gots)++; + break; default: /* Do nothing. */ } @@ -71,7 +101,7 @@ static void count_max_entries(Elf_Rela *relas, int num, = unsigned int *plts) int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, char *secstrings, struct module *mod) { - unsigned int i, num_plts =3D 0; + unsigned int i, num_plts =3D 0, num_gots =3D 0; =20 /* * Find the empty .plt sections. @@ -81,6 +111,8 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *= sechdrs, mod->arch.plt.shdr =3D sechdrs + i; else if (!strcmp(secstrings + sechdrs[i].sh_name, ".plt.idx")) mod->arch.plt_idx.shdr =3D sechdrs + i; + else if (!strcmp(secstrings + sechdrs[i].sh_name, ".got")) + mod->arch.got.shdr =3D sechdrs + i; } =20 if (!mod->arch.plt.shdr) { @@ -91,6 +123,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; + } =20 /* Calculate the maxinum number of entries */ for (i =3D 0; i < ehdr->e_shnum; i++) { @@ -105,7 +141,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr = *sechdrs, if (!(dst_sec->sh_flags & SHF_EXECINSTR)) continue; =20 - count_max_entries(relas, num_rela, &num_plts); + count_max_entries(relas, num_rela, &num_plts, &num_gots); } =20 mod->arch.plt.shdr->sh_type =3D SHT_NOBITS; @@ -122,5 +158,12 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr= *sechdrs, mod->arch.plt_idx.num_entries =3D 0; mod->arch.plt_idx.max_entries =3D num_plts; =20 + mod->arch.got.shdr->sh_type =3D SHT_NOBITS; + mod->arch.got.shdr->sh_flags =3D SHF_ALLOC; + mod->arch.got.shdr->sh_addralign =3D L1_CACHE_BYTES; + mod->arch.got.shdr->sh_size =3D (num_gots + 1) * sizeof(struct got_entry); + mod->arch.got.num_entries =3D 0; + mod->arch.got.max_entries =3D num_gots; + return 0; } diff --git a/arch/loongarch/kernel/module.c b/arch/loongarch/kernel/module.c index 61ecd174dd03..2f7f516522a9 100644 --- a/arch/loongarch/kernel/module.c +++ b/arch/loongarch/kernel/module.c @@ -390,6 +390,29 @@ static int apply_r_larch_pcala(struct module *mod, u32= *location, Elf_Addr v, return 0; } =20 +static int apply_r_larch_got_pc(struct module *mod, u32 *location, Elf_Add= r v, + s64 *rela_stack, size_t *rela_stack_top, unsigned int type) +{ + Elf_Addr got =3D module_emit_got_entry(mod, v); + + if (!got) + return -EINVAL; + + switch (type) { + case R_LARCH_GOT_PC_LO12: + type =3D R_LARCH_PCALA_LO12; + break; + case R_LARCH_GOT_PC_HI20: + type =3D R_LARCH_PCALA_HI20; + break; + default: + pr_err("%s: Unsupport relocation type %u\n", mod->name, type); + return -EINVAL; + } + + return apply_r_larch_pcala(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 @@ -422,6 +445,7 @@ static reloc_rela_handler reloc_rela_handlers[] =3D { [R_LARCH_B26] =3D apply_r_larch_b26, [R_LARCH_ABS_HI20...R_LARCH_ABS64_HI12] =3D apply_r_larch_abs, [R_LARCH_PCALA_HI20...R_LARCH_PCALA64_HI12] =3D apply_r_larch_pcala, + [R_LARCH_GOT_PC_HI20...R_LARCH_GOT_PC_LO12] =3D apply_r_larch_got_pc, }; =20 int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, --=20 2.37.0