librz/bin: ELF coredump parsing support for LoongArch (#6273)

This commit is contained in:
bubblepipe 2026-04-28 01:34:37 +07:00 committed by GitHub
parent 1ef81fb956
commit dcc825da7b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 67 additions and 2 deletions

View file

@ -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;
}

View file

@ -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;

View file

@ -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