适用于aarch64的PTRACE_GETREGSET

时间:2018-10-04 15:40:03

标签: c assembly arm ptrace

所以

我正在尝试通过PTRACE_GETREGSET和NT_PRFPREG标志在aarch64中获取SIMD寄存器。这是我用来执行此操作的代码:

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解释浮点值的方式,但我不确定。 问题是-我可以以某种方式使这些值可读吗?

0 个答案:

没有答案