Итак,
Я пытаюсь получить SIMD-регистры в aarch64 через флаг PTRACE_GETREGSET и NT_PRFPREG.Это код, который я использую для этого:
struct {
void* buf;
size_t len;
} my_iovec2 = { &simd_regs, sizeof(simd_regs)};
if (ptrace(PTRACE_GETREGSET, child_pid, (void *)NT_PRFPREG, &my_iovec2) < 0) {
log_error("failed to read the context of %d: %s", child_pid, strerror(errno));
abort();
}
И это код для печати значений регистров:
for (i = 0; i < 31; i++){
if (simd_regs->vregs[i] != 0){
printf("Q%d = %X\n", i, simd_regs->vregs[i]);
}
}
Вывод выглядит так:
`A64_decode:unknown instruction 1e229000
Q0 = 40A0
A64_decode: unknown instruction bd000fe0
Q0 = 40A0
A64_decode: unknown instruction 1e239000
Q0 = 40E0
A64_decode: unknown instruction bd000be0
Q0 = 40E0
A64_decode: unknown instruction bd400fe1
Q0 = 40E0
Q1 = 40A0
A64_decode: unknown instruction bd400be0
Q0 = 40E0
Q1 = 40A0
Call back opcode - 1e202820
rd = 0 ,rn = 1 ,rm = 0
fp_ctx_addr: 41D180
Rd: 0
Rn: 0
Rm: 0
A64_decode: unknown instruction bd0007e0
Q0 = 4140
Q1 = 40A0
`
И objdump -D двоичного файла, который я пытаюсь отследить, выглядит следующим образом:
`40010c: d10043ff sub sp, sp, #0x10
400110: 1e229000 fmov s0, #5.000000000000000000e+00
400114: bd000fe0 str s0, [sp,#12]
400118: 1e239000 fmov s0, #7.000000000000000000e+00
40011c: bd000be0 str s0, [sp,#8]
400120: bd400fe1 ldr s1, [sp,#12]
400124: bd400be0 ldr s0, [sp,#8]
400128: 1e202820 fadd s0, s1, s0
40012c: bd0007e0 str s0, [sp,#4]
400130: d2800020 mov x0, #0x1 // #1
400134: d2800ba8 mov x8, #0x5d // #93
400138: d4000001 svc #0x0
40013c: d503201f nop
400140: 910043ff add sp, sp, #0x10
400144: d65f03c0 ret
`
Так что он действительно что-то отслеживает и, возможно, он даже корректен.Я предполагаю, что полученные значения - это способ, которым aarch64 интерпретирует значения с плавающей точкой, но я не уверен.Вопрос в том, можно ли как-нибудь сделать эти значения читабельными?