uctx_x86_64_linux.c (1893B)
1 /* ucontext_t <-> KitUnwindFrame marshalling for x86_64 on Linux. 2 * mcontext_t.gregs[] is indexed by glibc's REG_* enum (RAX, RDX, RCX, ...); 3 * the frame array uses DWARF numbering, which is the System V x86-64 order 4 * (RAX, RDX, RCX, RBX, RSI, RDI, RBP, RSP, R8..R15, RIP). */ 5 6 #include <stdint.h> 7 #include <string.h> 8 9 #include "env_posix.h" 10 11 void dbg_ucontext_to_frame(const ucontext_t* uc, KitUnwindFrame* f) { 12 const greg_t* g = uc->uc_mcontext.gregs; 13 memset(f, 0, sizeof(*f)); 14 f->regs[0] = (uint64_t)g[REG_RAX]; 15 f->regs[1] = (uint64_t)g[REG_RDX]; 16 f->regs[2] = (uint64_t)g[REG_RCX]; 17 f->regs[3] = (uint64_t)g[REG_RBX]; 18 f->regs[4] = (uint64_t)g[REG_RSI]; 19 f->regs[5] = (uint64_t)g[REG_RDI]; 20 f->regs[6] = (uint64_t)g[REG_RBP]; 21 f->regs[7] = (uint64_t)g[REG_RSP]; 22 f->regs[8] = (uint64_t)g[REG_R8]; 23 f->regs[9] = (uint64_t)g[REG_R9]; 24 f->regs[10] = (uint64_t)g[REG_R10]; 25 f->regs[11] = (uint64_t)g[REG_R11]; 26 f->regs[12] = (uint64_t)g[REG_R12]; 27 f->regs[13] = (uint64_t)g[REG_R13]; 28 f->regs[14] = (uint64_t)g[REG_R14]; 29 f->regs[15] = (uint64_t)g[REG_R15]; 30 f->regs[16] = (uint64_t)g[REG_RIP]; 31 f->pc = (uint64_t)g[REG_RIP]; 32 f->cfa = (uint64_t)g[REG_RSP]; 33 } 34 35 void dbg_frame_to_ucontext(const KitUnwindFrame* f, ucontext_t* uc) { 36 greg_t* g = uc->uc_mcontext.gregs; 37 g[REG_RAX] = (greg_t)f->regs[0]; 38 g[REG_RDX] = (greg_t)f->regs[1]; 39 g[REG_RCX] = (greg_t)f->regs[2]; 40 g[REG_RBX] = (greg_t)f->regs[3]; 41 g[REG_RSI] = (greg_t)f->regs[4]; 42 g[REG_RDI] = (greg_t)f->regs[5]; 43 g[REG_RBP] = (greg_t)f->regs[6]; 44 g[REG_RSP] = (greg_t)f->regs[7]; 45 g[REG_R8] = (greg_t)f->regs[8]; 46 g[REG_R9] = (greg_t)f->regs[9]; 47 g[REG_R10] = (greg_t)f->regs[10]; 48 g[REG_R11] = (greg_t)f->regs[11]; 49 g[REG_R12] = (greg_t)f->regs[12]; 50 g[REG_R13] = (greg_t)f->regs[13]; 51 g[REG_R14] = (greg_t)f->regs[14]; 52 g[REG_R15] = (greg_t)f->regs[15]; 53 g[REG_RIP] = (greg_t)f->pc; 54 }