lkml.org 
[lkml]   [2022]   [Feb]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 2/8] riscv: Remove unneeded definitions from asm/module.h
    Date
    The inline functions previously defined here are only ever
    used in kernel/module-sections.c, so there is no need to
    include them in every user of asm/module.h. Through
    linux/module.h this is just about every driver.

    Now that these functions are static in a single file
    remove the inline marker to allow the compiler to make
    its own decisions.

    Signed-off-by: Emil Renner Berthing <kernel@esmil.dk>
    ---
    arch/riscv/include/asm/module.h | 87 ----------------------------
    arch/riscv/kernel/module-sections.c | 90 +++++++++++++++++++++++++++++
    2 files changed, 90 insertions(+), 87 deletions(-)

    diff --git a/arch/riscv/include/asm/module.h b/arch/riscv/include/asm/module.h
    index 76aa96a9fc08..570cd025f220 100644
    --- a/arch/riscv/include/asm/module.h
    +++ b/arch/riscv/include/asm/module.h
    @@ -22,93 +22,6 @@ struct mod_arch_specific {
    struct mod_section plt;
    struct mod_section got_plt;
    };
    -
    -struct got_entry {
    - unsigned long symbol_addr; /* the real variable address */
    -};
    -
    -static inline struct got_entry emit_got_entry(unsigned long val)
    -{
    - return (struct got_entry) {val};
    -}
    -
    -static inline struct got_entry *get_got_entry(unsigned long 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;
    -}
    -
    -struct plt_entry {
    - /*
    - * Trampoline code to real target address. The return address
    - * should be the original (pc+4) before entring plt entry.
    - */
    - u32 insn_auipc; /* auipc t0, 0x0 */
    - u32 insn_ld; /* ld t1, 0x10(t0) */
    - u32 insn_jr; /* jr t1 */
    -};
    -
    -#define OPC_AUIPC 0x0017
    -#define OPC_LD 0x3003
    -#define OPC_JALR 0x0067
    -#define REG_T0 0x5
    -#define REG_T1 0x6
    -
    -static inline struct plt_entry emit_plt_entry(unsigned long val,
    - unsigned long plt,
    - unsigned long got_plt)
    -{
    - /*
    - * U-Type encoding:
    - * +------------+----------+----------+
    - * | imm[31:12] | rd[11:7] | opc[6:0] |
    - * +------------+----------+----------+
    - *
    - * I-Type encoding:
    - * +------------+------------+--------+----------+----------+
    - * | imm[31:20] | rs1[19:15] | funct3 | rd[11:7] | opc[6:0] |
    - * +------------+------------+--------+----------+----------+
    - *
    - */
    - unsigned long offset = got_plt - plt;
    - u32 hi20 = (offset + 0x800) & 0xfffff000;
    - u32 lo12 = (offset - hi20);
    - return (struct plt_entry) {
    - OPC_AUIPC | (REG_T0 << 7) | hi20,
    - OPC_LD | (lo12 << 20) | (REG_T0 << 15) | (REG_T1 << 7),
    - OPC_JALR | (REG_T1 << 15)
    - };
    -}
    -
    -static inline int get_got_plt_idx(unsigned long val, const struct mod_section *sec)
    -{
    - struct got_entry *got_plt = (struct got_entry *)sec->shdr->sh_addr;
    - int i;
    - for (i = 0; i < sec->num_entries; i++) {
    - if (got_plt[i].symbol_addr == val)
    - return i;
    - }
    - return -1;
    -}
    -
    -static inline struct plt_entry *get_plt_entry(unsigned long val,
    - const struct mod_section *sec_plt,
    - const struct mod_section *sec_got_plt)
    -{
    - struct plt_entry *plt = (struct plt_entry *)sec_plt->shdr->sh_addr;
    - int got_plt_idx = get_got_plt_idx(val, sec_got_plt);
    - if (got_plt_idx >= 0)
    - return plt + got_plt_idx;
    - else
    - return NULL;
    -}
    -
    #endif /* CONFIG_MODULE_SECTIONS */

    #endif /* _ASM_RISCV_MODULE_H */
    diff --git a/arch/riscv/kernel/module-sections.c b/arch/riscv/kernel/module-sections.c
    index e264e59e596e..39d4ac681c2a 100644
    --- a/arch/riscv/kernel/module-sections.c
    +++ b/arch/riscv/kernel/module-sections.c
    @@ -10,6 +10,28 @@
    #include <linux/module.h>
    #include <linux/moduleloader.h>

    +struct got_entry {
    + unsigned long symbol_addr; /* the real variable address */
    +};
    +
    +static struct got_entry emit_got_entry(unsigned long val)
    +{
    + return (struct got_entry) {val};
    +}
    +
    +static struct got_entry *get_got_entry(unsigned long 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;
    +}
    +
    unsigned long module_emit_got_entry(struct module *mod, unsigned long val)
    {
    struct mod_section *got_sec = &mod->arch.got;
    @@ -29,6 +51,74 @@ unsigned long module_emit_got_entry(struct module *mod, unsigned long val)
    return (unsigned long)&got[i];
    }

    +struct plt_entry {
    + /*
    + * Trampoline code to real target address. The return address
    + * should be the original (pc+4) before entring plt entry.
    + */
    + u32 insn_auipc; /* auipc t0, 0x0 */
    + u32 insn_ld; /* ld t1, 0x10(t0) */
    + u32 insn_jr; /* jr t1 */
    +};
    +
    +#define OPC_AUIPC 0x0017
    +#define OPC_LD 0x3003
    +#define OPC_JALR 0x0067
    +#define REG_T0 0x5
    +#define REG_T1 0x6
    +
    +static struct plt_entry emit_plt_entry(unsigned long val,
    + unsigned long plt,
    + unsigned long got_plt)
    +{
    + /*
    + * U-Type encoding:
    + * +------------+----------+----------+
    + * | imm[31:12] | rd[11:7] | opc[6:0] |
    + * +------------+----------+----------+
    + *
    + * I-Type encoding:
    + * +------------+------------+--------+----------+----------+
    + * | imm[31:20] | rs1[19:15] | funct3 | rd[11:7] | opc[6:0] |
    + * +------------+------------+--------+----------+----------+
    + *
    + */
    + unsigned long offset = got_plt - plt;
    + u32 hi20 = (offset + 0x800) & 0xfffff000;
    + u32 lo12 = (offset - hi20);
    +
    + return (struct plt_entry) {
    + OPC_AUIPC | (REG_T0 << 7) | hi20,
    + OPC_LD | (lo12 << 20) | (REG_T0 << 15) | (REG_T1 << 7),
    + OPC_JALR | (REG_T1 << 15)
    + };
    +}
    +
    +static int get_got_plt_idx(unsigned long val, const struct mod_section *sec)
    +{
    + struct got_entry *got_plt = (struct got_entry *)sec->shdr->sh_addr;
    + int i;
    +
    + for (i = 0; i < sec->num_entries; i++) {
    + if (got_plt[i].symbol_addr == val)
    + return i;
    + }
    + return -1;
    +}
    +
    +static struct plt_entry *get_plt_entry(unsigned long val,
    + const struct mod_section *sec_plt,
    + const struct mod_section *sec_got_plt)
    +{
    + struct plt_entry *plt = (struct plt_entry *)sec_plt->shdr->sh_addr;
    + int got_plt_idx = get_got_plt_idx(val, sec_got_plt);
    +
    + if (got_plt_idx >= 0)
    + return plt + got_plt_idx;
    + else
    + return NULL;
    +}
    +
    unsigned long module_emit_plt_entry(struct module *mod, unsigned long val)
    {
    struct mod_section *got_plt_sec = &mod->arch.got_plt;
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-02-24 16:26    [W:3.615 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site