lkml.org 
[lkml]   [2023]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 1/8] objtool/LoongArch: Enable objtool to be built
    Date
    Add the minimal changes to enable objtool build on LoongArch,
    most of the functions are stubs to only fix the build errors
    when make -C tools/objtool.

    This is similar with commit e52ec98c5ab1 ("objtool/powerpc:
    Enable objtool to be built on ppc").

    Co-developed-by: Jinyang He <hejinyang@loongson.cn>
    Signed-off-by: Jinyang He <hejinyang@loongson.cn>
    Co-developed-by: Youling Tang <tangyouling@loongson.cn>
    Signed-off-by: Youling Tang <tangyouling@loongson.cn>
    Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
    ---
    tools/objtool/arch/loongarch/Build | 2 +
    tools/objtool/arch/loongarch/decode.c | 71 ++++++++++++++++++++++
    .../objtool/arch/loongarch/include/arch/cfi_regs.h | 22 +++++++
    tools/objtool/arch/loongarch/include/arch/elf.h | 30 +++++++++
    .../objtool/arch/loongarch/include/arch/special.h | 33 ++++++++++
    tools/objtool/arch/loongarch/special.c | 15 +++++
    6 files changed, 173 insertions(+)
    create mode 100644 tools/objtool/arch/loongarch/Build
    create mode 100644 tools/objtool/arch/loongarch/decode.c
    create mode 100644 tools/objtool/arch/loongarch/include/arch/cfi_regs.h
    create mode 100644 tools/objtool/arch/loongarch/include/arch/elf.h
    create mode 100644 tools/objtool/arch/loongarch/include/arch/special.h
    create mode 100644 tools/objtool/arch/loongarch/special.c

    diff --git a/tools/objtool/arch/loongarch/Build b/tools/objtool/arch/loongarch/Build
    new file mode 100644
    index 0000000..d24d563
    --- /dev/null
    +++ b/tools/objtool/arch/loongarch/Build
    @@ -0,0 +1,2 @@
    +objtool-y += decode.o
    +objtool-y += special.o
    diff --git a/tools/objtool/arch/loongarch/decode.c b/tools/objtool/arch/loongarch/decode.c
    new file mode 100644
    index 0000000..cc74ba4
    --- /dev/null
    +++ b/tools/objtool/arch/loongarch/decode.c
    @@ -0,0 +1,71 @@
    +// SPDX-License-Identifier: GPL-2.0-or-later
    +#include <string.h>
    +#include <objtool/check.h>
    +
    +int arch_ftrace_match(char *name)
    +{
    + return !strcmp(name, "_mcount");
    +}
    +
    +unsigned long arch_jump_destination(struct instruction *insn)
    +{
    + return insn->offset + (insn->immediate << 2);
    +}
    +
    +unsigned long arch_dest_reloc_offset(int addend)
    +{
    + return addend;
    +}
    +
    +bool arch_pc_relative_reloc(struct reloc *reloc)
    +{
    + return false;
    +}
    +
    +bool arch_callee_saved_reg(unsigned char reg)
    +{
    + switch (reg) {
    + case CFI_RA:
    + case CFI_FP:
    + case CFI_S0 ... CFI_S8:
    + return true;
    + default:
    + return false;
    + }
    +}
    +
    +int arch_decode_hint_reg(u8 sp_reg, int *base)
    +{
    + return 0;
    +}
    +
    +int arch_decode_instruction(struct objtool_file *file, const struct section *sec,
    + unsigned long offset, unsigned int maxlen,
    + struct instruction *insn)
    +{
    + return 0;
    +}
    +
    +const char *arch_nop_insn(int len)
    +{
    + return NULL;
    +}
    +
    +const char *arch_ret_insn(int len)
    +{
    + return NULL;
    +}
    +
    +void arch_initial_func_cfi_state(struct cfi_init_state *state)
    +{
    + int i;
    +
    + for (i = 0; i < CFI_NUM_REGS; i++) {
    + state->regs[i].base = CFI_UNDEFINED;
    + state->regs[i].offset = 0;
    + }
    +
    + /* initial CFA (call frame address) */
    + state->cfa.base = CFI_SP;
    + state->cfa.offset = 0;
    +}
    diff --git a/tools/objtool/arch/loongarch/include/arch/cfi_regs.h b/tools/objtool/arch/loongarch/include/arch/cfi_regs.h
    new file mode 100644
    index 0000000..d183cc8
    --- /dev/null
    +++ b/tools/objtool/arch/loongarch/include/arch/cfi_regs.h
    @@ -0,0 +1,22 @@
    +/* SPDX-License-Identifier: GPL-2.0-or-later */
    +#ifndef _OBJTOOL_ARCH_CFI_REGS_H
    +#define _OBJTOOL_ARCH_CFI_REGS_H
    +
    +#define CFI_RA 1
    +#define CFI_SP 3
    +#define CFI_A0 4
    +#define CFI_FP 22
    +#define CFI_S0 23
    +#define CFI_S1 24
    +#define CFI_S2 25
    +#define CFI_S3 26
    +#define CFI_S4 27
    +#define CFI_S5 28
    +#define CFI_S6 29
    +#define CFI_S7 30
    +#define CFI_S8 31
    +#define CFI_NUM_REGS 32
    +
    +#define CFI_BP CFI_FP
    +
    +#endif /* _OBJTOOL_ARCH_CFI_REGS_H */
    diff --git a/tools/objtool/arch/loongarch/include/arch/elf.h b/tools/objtool/arch/loongarch/include/arch/elf.h
    new file mode 100644
    index 0000000..9623d66
    --- /dev/null
    +++ b/tools/objtool/arch/loongarch/include/arch/elf.h
    @@ -0,0 +1,30 @@
    +/* SPDX-License-Identifier: GPL-2.0-or-later */
    +#ifndef _OBJTOOL_ARCH_ELF_H
    +#define _OBJTOOL_ARCH_ELF_H
    +
    +/*
    + * See the following link for more info about ELF Relocation types:
    + * https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html#_relocations
    + */
    +#ifndef R_LARCH_NONE
    +#define R_LARCH_NONE 0
    +#endif
    +#ifndef R_LARCH_32
    +#define R_LARCH_32 1
    +#endif
    +#ifndef R_LARCH_64
    +#define R_LARCH_64 2
    +#endif
    +#ifndef R_LARCH_32_PCREL
    +#define R_LARCH_32_PCREL 99
    +#endif
    +
    +#define R_NONE R_LARCH_NONE
    +#define R_ABS32 R_LARCH_32
    +#define R_ABS64 R_LARCH_64
    +#define R_DATA32 R_LARCH_32_PCREL
    +#define R_DATA64 R_LARCH_32_PCREL
    +#define R_TEXT32 R_LARCH_32_PCREL
    +#define R_TEXT64 R_LARCH_32_PCREL
    +
    +#endif /* _OBJTOOL_ARCH_ELF_H */
    diff --git a/tools/objtool/arch/loongarch/include/arch/special.h b/tools/objtool/arch/loongarch/include/arch/special.h
    new file mode 100644
    index 0000000..35fc979
    --- /dev/null
    +++ b/tools/objtool/arch/loongarch/include/arch/special.h
    @@ -0,0 +1,33 @@
    +/* SPDX-License-Identifier: GPL-2.0-or-later */
    +#ifndef _OBJTOOL_ARCH_SPECIAL_H
    +#define _OBJTOOL_ARCH_SPECIAL_H
    +
    +/*
    + * See more info about struct exception_table_entry
    + * in arch/loongarch/include/asm/extable.h
    + */
    +#define EX_ENTRY_SIZE 12
    +#define EX_ORIG_OFFSET 0
    +#define EX_NEW_OFFSET 4
    +
    +/*
    + * See more info about struct jump_entry
    + * in include/linux/jump_label.h
    + */
    +#define JUMP_ENTRY_SIZE 16
    +#define JUMP_ORIG_OFFSET 0
    +#define JUMP_NEW_OFFSET 4
    +#define JUMP_KEY_OFFSET 8
    +
    +/*
    + * See more info about struct alt_instr
    + * in arch/loongarch/include/asm/alternative.h
    + */
    +#define ALT_ENTRY_SIZE 12
    +#define ALT_ORIG_OFFSET 0
    +#define ALT_NEW_OFFSET 4
    +#define ALT_FEATURE_OFFSET 8
    +#define ALT_ORIG_LEN_OFFSET 10
    +#define ALT_NEW_LEN_OFFSET 11
    +
    +#endif /* _OBJTOOL_ARCH_SPECIAL_H */
    diff --git a/tools/objtool/arch/loongarch/special.c b/tools/objtool/arch/loongarch/special.c
    new file mode 100644
    index 0000000..9bba1e9
    --- /dev/null
    +++ b/tools/objtool/arch/loongarch/special.c
    @@ -0,0 +1,15 @@
    +// SPDX-License-Identifier: GPL-2.0-or-later
    +#include <objtool/special.h>
    +
    +bool arch_support_alt_relocation(struct special_alt *special_alt,
    + struct instruction *insn,
    + struct reloc *reloc)
    +{
    + return false;
    +}
    +
    +struct reloc *arch_find_switch_table(struct objtool_file *file,
    + struct instruction *insn)
    +{
    + return NULL;
    +}
    --
    2.1.0
    \
     
     \ /
      Last update: 2023-10-20 04:28    [W:4.655 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site