]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | // SPDX-License-Identifier: GPL-2.0 |
5ea84154 JO |
2 | #include <elfutils/libdwfl.h> |
3 | #include "../../util/unwind-libdw.h" | |
4 | #include "../../util/perf_regs.h" | |
e7ff8920 | 5 | #include "../../util/event.h" |
5ea84154 JO |
6 | |
7 | bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) | |
8 | { | |
9 | struct unwind_info *ui = arg; | |
10 | struct regs_dump *user_regs = &ui->sample->user_regs; | |
11 | Dwarf_Word dwarf_regs[17]; | |
12 | unsigned nregs; | |
13 | ||
14 | #define REG(r) ({ \ | |
15 | Dwarf_Word val = 0; \ | |
16 | perf_reg_value(&val, user_regs, PERF_REG_X86_##r); \ | |
17 | val; \ | |
18 | }) | |
19 | ||
20 | if (user_regs->abi == PERF_SAMPLE_REGS_ABI_32) { | |
21 | dwarf_regs[0] = REG(AX); | |
22 | dwarf_regs[1] = REG(CX); | |
23 | dwarf_regs[2] = REG(DX); | |
24 | dwarf_regs[3] = REG(BX); | |
25 | dwarf_regs[4] = REG(SP); | |
26 | dwarf_regs[5] = REG(BP); | |
27 | dwarf_regs[6] = REG(SI); | |
28 | dwarf_regs[7] = REG(DI); | |
29 | dwarf_regs[8] = REG(IP); | |
30 | nregs = 9; | |
31 | } else { | |
32 | dwarf_regs[0] = REG(AX); | |
33 | dwarf_regs[1] = REG(DX); | |
34 | dwarf_regs[2] = REG(CX); | |
35 | dwarf_regs[3] = REG(BX); | |
36 | dwarf_regs[4] = REG(SI); | |
37 | dwarf_regs[5] = REG(DI); | |
38 | dwarf_regs[6] = REG(BP); | |
39 | dwarf_regs[7] = REG(SP); | |
40 | dwarf_regs[8] = REG(R8); | |
41 | dwarf_regs[9] = REG(R9); | |
42 | dwarf_regs[10] = REG(R10); | |
43 | dwarf_regs[11] = REG(R11); | |
44 | dwarf_regs[12] = REG(R12); | |
45 | dwarf_regs[13] = REG(R13); | |
46 | dwarf_regs[14] = REG(R14); | |
47 | dwarf_regs[15] = REG(R15); | |
48 | dwarf_regs[16] = REG(IP); | |
49 | nregs = 17; | |
50 | } | |
51 | ||
52 | return dwfl_thread_state_registers(thread, 0, nregs, dwarf_regs); | |
53 | } |