librz/bin: ELF coredump parsing support for LoongArch (#6273)
This commit is contained in:
parent
1ef81fb956
commit
dcc825da7b
3 changed files with 67 additions and 2 deletions
|
|
@ -60,7 +60,7 @@ static char *loongarch_get_reg_profile(RzAnalysis *analysis) {
|
|||
"gpr s6 .32 116 0\n" // Static registers
|
||||
"gpr s7 .32 120 0\n" // Static registers
|
||||
"gpr s8 .32 124 0\n" // Static registers
|
||||
"gpr s8 .32 128 0\n" // Static registers
|
||||
"gpr orig_a0 .32 128 0\n" // Static registers
|
||||
"gpr pc .32 132 0\n";
|
||||
break;
|
||||
case 64:
|
||||
|
|
@ -111,7 +111,7 @@ static char *loongarch_get_reg_profile(RzAnalysis *analysis) {
|
|||
"gpr s6 .64 232 0\n" // Static registers
|
||||
"gpr s7 .64 240 0\n" // Static registers
|
||||
"gpr s8 .64 248 0\n" // Static registers
|
||||
"gpr s8 .64 256 0\n" // Static registers
|
||||
"gpr orig_a0 .64 256 0\n" // Static registers
|
||||
"gpr pc .64 264 0\n";
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@
|
|||
#define RISCV_64_FP (FP_LAYOUT | RISCV_64)
|
||||
#define PPC64 15
|
||||
#define S390X 17
|
||||
#define LOONGARCH32 18
|
||||
#define LOONGARCH64 19
|
||||
// Floating point register layout.
|
||||
#define ARCH_LEN (FP_LAYOUT | 0xf)
|
||||
|
||||
|
|
@ -104,6 +106,16 @@
|
|||
#define S390X_PR_STATUS_REG_OFFSET 0x70
|
||||
#define S390X_PR_STATUS_REG_OFFSET_SP 136
|
||||
|
||||
// linux/arch/loongarch/include/uapi/asm/ptrace.h: user_pt_regs { regs[32](128) + orig_a0(4) + csr_era(4) + csr_badv(4) + reserved[10](40) } = 180 bytes; sp = regs[3] at byte 12
|
||||
#define LOONGARCH32_REGS_SIZE 180
|
||||
#define LOONGARCH32_PR_STATUS_REG_OFFSET 0x48
|
||||
#define LOONGARCH32_PR_STATUS_REG_OFFSET_SP 12
|
||||
|
||||
// linux/arch/loongarch/include/uapi/asm/ptrace.h: user_pt_regs { regs[32](256) + orig_a0(8) + csr_era(8) + csr_badv(8) + reserved[10](80) } = 360 bytes; sp = regs[3] at byte 24
|
||||
#define LOONGARCH64_REGS_SIZE 360
|
||||
#define LOONGARCH64_PR_STATUS_REG_OFFSET 0x70
|
||||
#define LOONGARCH64_PR_STATUS_REG_OFFSET_SP 24
|
||||
|
||||
// The ones for Linux coredumps.
|
||||
// linux/arch/sparc/include/asm/elf_64.h or elf_32.h
|
||||
//
|
||||
|
|
@ -189,6 +201,8 @@ static RzBinElfPrStatusLayout prstatus_layouts[ARCH_LEN] = {
|
|||
[PPC64] = { PPC64_REGS_SIZE, PPC64_PR_STATUS_REG_OFFSET, 64, PPC64_PR_STATUS_REG_OFFSET_SP },
|
||||
|
||||
[S390X] = { S390X_REGS_SIZE, S390X_PR_STATUS_REG_OFFSET, 64, S390X_PR_STATUS_REG_OFFSET_SP },
|
||||
[LOONGARCH32] = { LOONGARCH32_REGS_SIZE, LOONGARCH32_PR_STATUS_REG_OFFSET, 32, LOONGARCH32_PR_STATUS_REG_OFFSET_SP },
|
||||
[LOONGARCH64] = { LOONGARCH64_REGS_SIZE, LOONGARCH64_PR_STATUS_REG_OFFSET, 64, LOONGARCH64_PR_STATUS_REG_OFFSET_SP },
|
||||
|
||||
[SPARC32_FP] = { SPARC32_FPREGS_SIZE, SPARC32_FPREG_OFFSET, 0, 0 },
|
||||
[SPARC64_FP] = { SPARC64_FPREGS_SIZE, SPARC32_FPREG_OFFSET, 0, 0 },
|
||||
|
|
@ -454,6 +468,14 @@ RZ_BORROW RzBinElfPrStatusLayout *Elf_(rz_bin_elf_get_prstatus_layout)(RZ_NONNUL
|
|||
return prstatus_layouts + S390X;
|
||||
}
|
||||
return NULL;
|
||||
case EM_LOONGARCH:
|
||||
if (bin->ehdr.e_ident[EI_CLASS] == ELFCLASS64) {
|
||||
return prstatus_layouts + LOONGARCH64;
|
||||
}
|
||||
if (bin->ehdr.e_ident[EI_CLASS] == ELFCLASS32) {
|
||||
return prstatus_layouts + LOONGARCH32;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -1049,3 +1049,46 @@ acr15 = 0x00000000
|
|||
orig_r2 = 0x0000000000000001
|
||||
EOF
|
||||
RUN
|
||||
|
||||
NAME=core regs linux loongarch
|
||||
FILE=bins/elf/core/core-linux-loongarch
|
||||
CMDS=<<EOF
|
||||
ar
|
||||
EOF
|
||||
EXPECT=<<EOF
|
||||
zero = 0x0000000000000000
|
||||
ra = 0x000055555579497c
|
||||
tp = 0x00007ffff3a1f1c0
|
||||
sp = 0x00007ffffbc566e0
|
||||
a0 = 0x0000000000000029
|
||||
a1 = 0x0000555568c242a0
|
||||
a2 = 0x0000000000000029
|
||||
a3 = 0x0000555568c242c9
|
||||
a4 = 0x00007ffffbc565e1
|
||||
a5 = 0x00007ffffbc563e8
|
||||
a6 = 0x00007ffffbc56870
|
||||
a7 = 0x0000000000000040
|
||||
t0 = 0x0000000000000000
|
||||
t1 = 0x0000000000000001
|
||||
t2 = 0x0000000000000000
|
||||
t3 = 0x00007ffffbc565b8
|
||||
t4 = 0x00000000000002b0
|
||||
t5 = 0x0000000000000000
|
||||
t6 = 0x00007ffff39cc990
|
||||
t7 = 0x000000000000000a
|
||||
t8 = 0x0000000000000010
|
||||
u0 = 0x0000000000000000
|
||||
fp = 0x00007ffffbc56710
|
||||
s0 = 0x00007ffffbc56878
|
||||
s1 = 0x0000000000000001
|
||||
s2 = 0x0000000000000000
|
||||
s3 = 0x000055555579be38
|
||||
s4 = 0x00007ffff3a1c050
|
||||
s5 = 0x00005555557948b8
|
||||
s6 = 0x00007ffff39cd000
|
||||
s7 = 0x00007ffffbc56888
|
||||
s8 = 0x000055555579be38
|
||||
orig_a0 = 0x0000000000000001
|
||||
pc = 0x0000555555794988
|
||||
EOF
|
||||
RUN
|
||||
|
|
|
|||
Loading…
Reference in a new issue