From 6b44ac365a1280496d842f9959722bcc40c69dbb Mon Sep 17 00:00:00 2001 From: Youling Tang Date: Fri, 7 Apr 2023 10:59:28 +0800 Subject: backends: Add core_note callback for LoongArch Signed-off-by: Youling Tang --- backends/ChangeLog | 6 +++ backends/Makefile.am | 2 +- backends/loongarch_corenote.c | 114 ++++++++++++++++++++++++++++++++++++++++++ backends/loongarch_init.c | 1 + 4 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 backends/loongarch_corenote.c diff --git a/backends/ChangeLog b/backends/ChangeLog index f1613d80..c60d6cdb 100644 --- a/backends/ChangeLog +++ b/backends/ChangeLog @@ -1,3 +1,9 @@ +2023-04-07 Youling Tang + + * Makefile.am (loongarch_SRCS): Add loongarch_corenote.c. + * loongarch_init.c (loongarch_init): Hook core_note. + * loongarch_corenote.c: New file. + 2023-04-07 Youling Tang * Makefile.am (loongarch_SRCS): Add loongarch_unwind.c. diff --git a/backends/Makefile.am b/backends/Makefile.am index 1261f5c6..c7a953a1 100644 --- a/backends/Makefile.am +++ b/backends/Makefile.am @@ -98,7 +98,7 @@ csky_SRCS = csky_attrs.c csky_init.c csky_symbol.c csky_cfi.c \ loongarch_SRCS = loongarch_init.c loongarch_symbol.c loongarch_cfi.c \ loongarch_regs.c loongarch_retval.c \ - loongarch_unwind.c + loongarch_unwind.c loongarch_corenote.c arc_SRCS = arc_init.c arc_symbol.c diff --git a/backends/loongarch_corenote.c b/backends/loongarch_corenote.c new file mode 100644 index 00000000..b549edc0 --- /dev/null +++ b/backends/loongarch_corenote.c @@ -0,0 +1,114 @@ +/* LoongArch specific core note handling. + Copyright (C) 2023 Loongson Technology Corporation Limited. + 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 +#include + +#define BACKEND loongarch_ +#include "libebl_CPU.h" + +#define ULONG uint64_t +#define PID_T int32_t +#define UID_T uint32_t +#define GID_T uint32_t +#define ALIGN_ULONG 8 +#define ALIGN_PID_T 4 +#define ALIGN_UID_T 4 +#define ALIGN_GID_T 4 +#define TYPE_ULONG ELF_T_XWORD +#define TYPE_PID_T ELF_T_SWORD +#define TYPE_UID_T ELF_T_WORD +#define TYPE_GID_T ELF_T_WORD + +#define PRSTATUS_REGS_SIZE (45 * 8) + +static const Ebl_Register_Location prstatus_regs[] = + { + { .offset = 0, .regno = 0, .count = 32, .bits = 64 }, /* r0..r31 */ + }; + +#define PRSTATUS_REGSET_ITEMS \ + { \ + .name = "orig_a0", .type = ELF_T_XWORD, .format = 'x', \ + .offset = (offsetof (struct EBLHOOK(prstatus), pr_reg) \ + + 32 * 8), \ + .group = "register" \ + }, \ + { \ + .name = "csr_era", .type = ELF_T_XWORD, .format = 'x', \ + .offset = (offsetof (struct EBLHOOK(prstatus), pr_reg) \ + + 33 * 8), \ + .group = "register", \ + .pc_register = true \ + }, \ + { \ + .name = "csr_badvaddr", .type = ELF_T_XWORD, .format = 'x', \ + .offset = (offsetof (struct EBLHOOK(prstatus), pr_reg) \ + + 34 * 8), \ + .group = "register" \ + }, \ + { \ + .name = "csr_crmd", .type = ELF_T_XWORD, .format = 'x', \ + .offset = (offsetof (struct EBLHOOK(prstatus), pr_reg) \ + + 35 * 8), \ + .group = "register" \ + }, \ + { \ + .name = "csr_prmd", .type = ELF_T_XWORD, .format = 'x', \ + .offset = (offsetof (struct EBLHOOK(prstatus), pr_reg) \ + + 36 * 8), \ + .group = "register" \ + }, \ + { \ + .name = "csr_euen", .type = ELF_T_XWORD, .format = 'x', \ + .offset = (offsetof (struct EBLHOOK(prstatus), pr_reg) \ + + 37 * 8), \ + .group = "register" \ + }, \ + { \ + .name = "csr_ecfg", .type = ELF_T_XWORD, .format = 'x', \ + .offset = (offsetof (struct EBLHOOK(prstatus), pr_reg) \ + + 38 * 8), \ + .group = "register" \ + }, \ + { \ + .name = "csr_estat", .type = ELF_T_XWORD, .format = 'x', \ + .offset = (offsetof (struct EBLHOOK(prstatus), pr_reg) \ + + 39 * 8), \ + .group = "register" \ + } + /* 40 ~ 44 reserved */ + +#include "linux-core-note.c" diff --git a/backends/loongarch_init.c b/backends/loongarch_init.c index 1e8846a8..0b99d113 100644 --- a/backends/loongarch_init.c +++ b/backends/loongarch_init.c @@ -49,6 +49,7 @@ loongarch_init (Elf *elf __attribute__ ((unused)), HOOK (eh, reloc_simple_type); HOOK (eh, machine_flag_check); HOOK (eh, register_info); + HOOK (eh, core_note); HOOK (eh, abi_cfi); /* gcc/config/ #define DWARF_FRAME_REGISTERS. */ eh->frame_nregs = 74; -- cgit v1.2.1