From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg1-x52c.google.com (mail-pg1-x52c.google.com [IPv6:2607:f8b0:4864:20::52c]) by sourceware.org (Postfix) with ESMTPS id 994CA3858D39 for ; Sat, 3 Dec 2022 13:47:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 994CA3858D39 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-pg1-x52c.google.com with SMTP id r18so6617053pgr.12 for ; Sat, 03 Dec 2022 05:47:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=35WBTb+3kt5VEa/TmkkhqZEio2bZvjSgeYaaFbbu+fk=; b=GUGNdoc28DsQhl6esUdCjbgz90TnLCV2NxmrbvR3EyG5zvtO31fKQuw6Xkq/tNPTl4 rPT8kvfrLXvjCrYIbRQGYGAqdShoYxCnVB7VciTPfV1T3VpuWNUXOhCFyMAGIvTNq7bf 1osib9r+TkvBJkCFgih9+sQrGOzgyOZ7UZncFpG3cetqSJAfIJRUiP0caOHfBOrmse+R 0zPdt9sEqFnAljRJxOVU53h71AqgqkbB+1sf52OwJekhLWthClGtYdGIELLtB2zYlus5 Jl3LKmymwjfxAuZucbp2wgt2iWR7XMe0LA2/86K0toliZF33da58uyceAqHXqVosQzuq b5tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=35WBTb+3kt5VEa/TmkkhqZEio2bZvjSgeYaaFbbu+fk=; b=wWXiDepCG9POtSrrTuCYW3FsBcj/PVAeC1rTuSibkpagiSFjon3mbIqcrGPfaIhVIt BFrtC1TRa8PLqBxd4Pd8xlwhNAUoLmFMv+nj6UTlzrIIM47m/1n886xae/wbIJFk8xn2 AJ++kSnx6XD9SygBCucylJpcuoz3QQptj+idypXj3B1BEehXylEbrGr7KqK80VtCNNyB fyOzrVhQjAS9zFL2YxmTQCX/0qyzT7JbppR+n7f6ejlwaEoQkPxD1QdCTHN0PR79AqAP W2teaKmDroamauClTyFM50MS6Da8IQts5cDQWm+5VKU8qaPnMUaQGM9HBhVbA2m/mivD GXfg== X-Gm-Message-State: ANoB5plpqdYy3jYzcg1QPPK9qrvDpQS/5X1RQPD3A6i7Gfjn3c3MbRUC ZC1wFRNVWAAlNUItMno7jtd6VuOTieUCtg== X-Google-Smtp-Source: AA0mqf4az5akP3mWa4PFeNH4TU6IiMqCIvHim5XiPCkILOp6pvNw7CaBooTfoYoNZESxpCPCjwOMsA== X-Received: by 2002:a62:fb11:0:b0:56b:dbab:5362 with SMTP id x17-20020a62fb11000000b0056bdbab5362mr76957997pfm.47.1670075238344; Sat, 03 Dec 2022 05:47:18 -0800 (PST) Received: from localhost.localdomain ([43.132.141.4]) by smtp.gmail.com with ESMTPSA id e12-20020a170902784c00b001888cadf8f6sm7379326pln.49.2022.12.03.05.47.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Dec 2022 05:47:17 -0800 (PST) From: Hengqi Chen To: elfutils-devel@sourceware.org Cc: hengqi.chen@gmail.com Subject: [PATCH] Add support for LoongArch Date: Sat, 3 Dec 2022 21:47:07 +0800 Message-Id: <20221203134707.2197078-1-hengqi.chen@gmail.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: 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 ++++++++++++++++++++++++++++++++ libebl/ChangeLog | 4 ++ libebl/eblopenbackend.c | 2 + src/ChangeLog | 4 ++ src/elflint.c | 2 +- 9 files changed, 228 insertions(+), 3 deletions(-) create mode 100644 backends/loongarch_init.c create mode 100644 backends/loongarch_reloc.def create mode 100644 backends/loongarch_symbol.c 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; + } +} diff --git a/libebl/ChangeLog b/libebl/ChangeLog index 6f55a5e7..5f9ea552 100644 --- a/libebl/ChangeLog +++ b/libebl/ChangeLog @@ -1,3 +1,7 @@ +2022-12-02 Hengqi Chen + + * eblopenbackend.c (machines): Add entries for LoongArch. + 2022-10-21 Yonggang Luo * eblclosebackend.c: Remove dlfcn.h include. diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c index 02f80653..b87aef19 100644 --- a/libebl/eblopenbackend.c +++ b/libebl/eblopenbackend.c @@ -55,6 +55,7 @@ Ebl *m68k_init (Elf *, GElf_Half, Ebl *); Ebl *bpf_init (Elf *, GElf_Half, Ebl *); Ebl *riscv_init (Elf *, GElf_Half, Ebl *); Ebl *csky_init (Elf *, GElf_Half, Ebl *); +Ebl *loongarch_init (Elf *, GElf_Half, Ebl *); /* This table should contain the complete list of architectures as far as the ELF specification is concerned. */ @@ -150,6 +151,7 @@ static const struct { riscv_init, "elf_riscv", "riscv", 5, EM_RISCV, ELFCLASS64, ELFDATA2LSB }, { riscv_init, "elf_riscv", "riscv", 5, EM_RISCV, ELFCLASS32, ELFDATA2LSB }, { csky_init, "elf_csky", "csky", 4, EM_CSKY, ELFCLASS32, ELFDATA2LSB }, + { loongarch_init, "elf_loongarch", "loongarch", 9, EM_LOONGARCH, ELFCLASS64, ELFDATA2LSB }, }; #define nmachines (sizeof (machines) / sizeof (machines[0])) diff --git a/src/ChangeLog b/src/ChangeLog index 66428b70..b679f092 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2022-12-02 Hengqi Chen + + * elflint.c (valid_e_machine): Add EM_LOONGARCH. + 2022-11-03 Mark Wielaard * readelf.c (get_dynscn_addrs): Check gelf_getdyn doesn't diff --git a/src/elflint.c b/src/elflint.c index 565cffdc..b9548862 100644 --- a/src/elflint.c +++ b/src/elflint.c @@ -329,7 +329,7 @@ static const int valid_e_machine[] = EM_CRIS, EM_JAVELIN, EM_FIREPATH, EM_ZSP, EM_MMIX, EM_HUANY, EM_PRISM, EM_AVR, EM_FR30, EM_D10V, EM_D30V, EM_V850, EM_M32R, EM_MN10300, EM_MN10200, EM_PJ, EM_OPENRISC, EM_ARC_A5, EM_XTENSA, EM_ALPHA, - EM_TILEGX, EM_TILEPRO, EM_AARCH64, EM_BPF, EM_RISCV, EM_CSKY + EM_TILEGX, EM_TILEPRO, EM_AARCH64, EM_BPF, EM_RISCV, EM_CSKY, EM_LOONGARCH, }; #define nvalid_e_machine \ (sizeof (valid_e_machine) / sizeof (valid_e_machine[0])) -- 2.37.3