PTRACE_GETREGSET для aarch64 - PullRequest
0 голосов
/ 04 октября 2018

Итак,

Я пытаюсь получить 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 интерпретирует значения с плавающей точкой, но я не уверен.Вопрос в том, можно ли как-нибудь сделать эти значения читабельными?

...