Re: [PATCH v2 1/8] objtool/LoongArch: Enable objtool to be built

From: Huacai Chen
Date: Tue Oct 10 2023 - 08:45:54 EST


Hi, Tiezhu,

On Mon, Oct 9, 2023 at 9:03 PM Tiezhu Yang <yangtiezhu@xxxxxxxxxxx> wrote:
>
> 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@xxxxxxxxxxx>
> Signed-off-by: Jinyang He <hejinyang@xxxxxxxxxxx>
> Co-developed-by: Youling Tang <tangyouling@xxxxxxxxxxx>
> Signed-off-by: Youling Tang <tangyouling@xxxxxxxxxxx>
> Signed-off-by: Tiezhu Yang <yangtiezhu@xxxxxxxxxxx>
> ---
> tools/objtool/arch/loongarch/Build | 2 +
> tools/objtool/arch/loongarch/decode.c | 71 ++++++++++++++++++++++
> .../objtool/arch/loongarch/include/arch/cfi_regs.h | 21 +++++++
> 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, 172 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..c768d39
> --- /dev/null
> +++ b/tools/objtool/arch/loongarch/include/arch/cfi_regs.h
> @@ -0,0 +1,21 @@
> +/* 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_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..1a8245c
> --- /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
Other archs use tab for indentation in special.h

Huacai
> +
> +/*
> + * 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
>