From 13a4d1279c5b7847049ca3045d04f2705c45ce31 Mon Sep 17 00:00:00 2001 From: Hengqi Chen Date: Sat, 3 Dec 2022 21:47:07 +0800 Subject: Add support for LoongArch This implements initial support for the LoongArch architecture. Signed-off-by: Hengqi Chen --- backends/ChangeLog | 7 ++++ backends/Makefile.am | 7 ++-- backends/loongarch_init.c | 50 +++++++++++++++++++++++++++ backends/loongarch_reloc.def | 81 ++++++++++++++++++++++++++++++++++++++++++++ backends/loongarch_symbol.c | 74 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 217 insertions(+), 2 deletions(-) create mode 100644 backends/loongarch_init.c create mode 100644 backends/loongarch_reloc.def create mode 100644 backends/loongarch_symbol.c (limited to 'backends') diff --git a/backends/ChangeLog b/backends/ChangeLog index 5b0daffe..5813ddcc 100644 --- a/backends/ChangeLog +++ b/backends/ChangeLog @@ -1,3 +1,10 @@ +2022-12-02 Hengqi Chen + + * Makefile.am (modules): Add loongarch. + * loongarch_init.c: New file. + * loongarch_reloc.def: New file. + * loongarch_symbol.c: New file. + 2022-08-09 Andreas Schwab * riscv_init.c (riscv_init): HOOK segment_type_name, diff --git a/backends/Makefile.am b/backends/Makefile.am index 9566377f..0824123d 100644 --- a/backends/Makefile.am +++ b/backends/Makefile.am @@ -37,7 +37,7 @@ AM_CPPFLAGS += -I$(top_srcdir)/libebl -I$(top_srcdir)/libasm \ noinst_LIBRARIES = libebl_backends.a libebl_backends_pic.a modules = i386 sh x86_64 ia64 alpha arm aarch64 sparc ppc ppc64 s390 \ - m68k bpf riscv csky + m68k bpf riscv csky loongarch i386_SRCS = i386_init.c i386_symbol.c i386_corenote.c i386_cfi.c \ i386_retval.c i386_regs.c i386_auxv.c \ @@ -96,11 +96,14 @@ riscv_SRCS = riscv_init.c riscv_symbol.c riscv_cfi.c riscv_regs.c \ csky_SRCS = csky_attrs.c csky_init.c csky_symbol.c csky_cfi.c \ csky_regs.c csky_initreg.c csky_corenote.c +loongarch_SRCS = loongarch_init.c loongarch_symbol.c + libebl_backends_a_SOURCES = $(i386_SRCS) $(sh_SRCS) $(x86_64_SRCS) \ $(ia64_SRCS) $(alpha_SRCS) $(arm_SRCS) \ $(aarch64_SRCS) $(sparc_SRCS) $(ppc_SRCS) \ $(ppc64_SRCS) $(s390_SRCS) \ - $(m68k_SRCS) $(bpf_SRCS) $(riscv_SRCS) $(csky_SRCS) + $(m68k_SRCS) $(bpf_SRCS) $(riscv_SRCS) $(csky_SRCS) \ + $(loongarch_SRCS) libebl_backends_pic_a_SOURCES = am_libebl_backends_pic_a_OBJECTS = $(libebl_backends_a_SOURCES:.c=.os) diff --git a/backends/loongarch_init.c b/backends/loongarch_init.c new file mode 100644 index 00000000..a8ed9e81 --- /dev/null +++ b/backends/loongarch_init.c @@ -0,0 +1,50 @@ +/* Initialization of LoongArch specific backend library. + Copyright (C) 2022 Hengqi Chen + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#define BACKEND loongarch_ +#define RELOC_PREFIX R_LARCH_ +#include "libebl_CPU.h" + +/* This defines the common reloc hooks based on loongarch_reloc.def. */ +#include "common-reloc.c" + + +Ebl * +loongarch_init (Elf *elf __attribute__ ((unused)), + GElf_Half machine __attribute__ ((unused)), + Ebl *eh) +{ + loongarch_init_reloc (eh); + HOOK (eh, reloc_simple_type); + + return eh; +} diff --git a/backends/loongarch_reloc.def b/backends/loongarch_reloc.def new file mode 100644 index 00000000..dd4a6b6d --- /dev/null +++ b/backends/loongarch_reloc.def @@ -0,0 +1,81 @@ +/* List the relocation types for LoongArch. -*- C -*- + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +/* NAME, REL|EXEC|DYN */ + +RELOC_TYPE (NONE, EXEC|DYN) +RELOC_TYPE (32, REL|EXEC|DYN) +RELOC_TYPE (64, REL|EXEC|DYN) +RELOC_TYPE (RELATIVE, EXEC|DYN) +RELOC_TYPE (COPY, EXEC|DYN) +RELOC_TYPE (JUMP_SLOT, EXEC|DYN) +RELOC_TYPE (TLS_DTPMOD32, EXEC|DYN) +RELOC_TYPE (TLS_DTPMOD64, EXEC|DYN) +RELOC_TYPE (TLS_DTPREL32, EXEC|DYN) +RELOC_TYPE (TLS_DTPREL64, EXEC|DYN) +RELOC_TYPE (TLS_TPREL32, EXEC|DYN) +RELOC_TYPE (TLS_TPREL64, EXEC|DYN) +RELOC_TYPE (IRELATIVE, EXEC|DYN) +RELOC_TYPE (MARK_LA, REL) +RELOC_TYPE (MARK_PCREL, REL) +RELOC_TYPE (SOP_PUSH_PCREL, REL) +RELOC_TYPE (SOP_PUSH_ABSOLUTE, REL) +RELOC_TYPE (SOP_PUSH_DUP, REL) +RELOC_TYPE (SOP_PUSH_GPREL, REL) +RELOC_TYPE (SOP_PUSH_TLS_TPREL, REL) +RELOC_TYPE (SOP_PUSH_TLS_GOT, REL) +RELOC_TYPE (SOP_PUSH_TLS_GD, REL) +RELOC_TYPE (SOP_PUSH_PLT_PCREL, REL) +RELOC_TYPE (SOP_ASSERT, REL) +RELOC_TYPE (SOP_NOT, REL) +RELOC_TYPE (SOP_SUB, REL) +RELOC_TYPE (SOP_SL, REL) +RELOC_TYPE (SOP_SR, REL) +RELOC_TYPE (SOP_ADD, REL) +RELOC_TYPE (SOP_AND, REL) +RELOC_TYPE (SOP_IF_ELSE, REL) +RELOC_TYPE (SOP_POP_32_S_10_5, REL) +RELOC_TYPE (SOP_POP_32_U_10_12, REL) +RELOC_TYPE (SOP_POP_32_S_10_12, REL) +RELOC_TYPE (SOP_POP_32_S_10_16, REL) +RELOC_TYPE (SOP_POP_32_S_10_16_S2, REL) +RELOC_TYPE (SOP_POP_32_S_5_20, REL) +RELOC_TYPE (SOP_POP_32_S_0_5_10_16_S2, REL) +RELOC_TYPE (SOP_POP_32_S_0_10_10_16_S2, REL) +RELOC_TYPE (SOP_POP_32_U, REL) +RELOC_TYPE (ADD8, REL) +RELOC_TYPE (ADD16, REL) +RELOC_TYPE (ADD24, REL) +RELOC_TYPE (ADD32, REL) +RELOC_TYPE (ADD64, REL) +RELOC_TYPE (SUB8, REL) +RELOC_TYPE (SUB16, REL) +RELOC_TYPE (SUB24, REL) +RELOC_TYPE (SUB32, REL) +RELOC_TYPE (SUB64, REL) +RELOC_TYPE (GNU_VTINHERIT, REL) +RELOC_TYPE (GNU_VTENTRY, REL) diff --git a/backends/loongarch_symbol.c b/backends/loongarch_symbol.c new file mode 100644 index 00000000..8ba66a09 --- /dev/null +++ b/backends/loongarch_symbol.c @@ -0,0 +1,74 @@ +/* LoongArch specific symbolic name handling. + Copyright (C) 2022 Hengqi Chen + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#define BACKEND loongarch_ +#include "libebl_CPU.h" + + +/* Check for the simple reloc types. */ +Elf_Type +loongarch_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type, + int *addsub) +{ + switch (type) + { + case R_LARCH_32: + return ELF_T_WORD; + case R_LARCH_64: + return ELF_T_XWORD; + case R_LARCH_ADD16: + *addsub = 1; + return ELF_T_HALF; + case R_LARCH_ADD32: + *addsub = 1; + return ELF_T_WORD; + case R_LARCH_ADD64: + *addsub = 1; + return ELF_T_XWORD; + case R_LARCH_SUB16: + *addsub = -1; + return ELF_T_HALF; + case R_LARCH_SUB32: + *addsub = -1; + return ELF_T_WORD; + case R_LARCH_SUB64: + *addsub = -1; + return ELF_T_XWORD; + default: + return ELF_T_NUM; + } +} -- cgit v1.2.1