uctx_x86_64_freebsd.c (2029B)
1 /* ucontext_t <-> KitUnwindFrame marshalling for x86_64 on FreeBSD. 2 * mcontext_t has named fields (mc_rax, mc_rdx, …, mc_rip, mc_rsp). 3 * DWARF register numbering (System V x86-64): rax=0 rdx=1 rcx=2 rbx=3 4 * rsi=4 rdi=5 rbp=6 rsp=7 r8=8 r9=9 r10=10 r11=11 r12=12 r13=13 r14=14 5 * r15=15 rip=16. */ 6 7 #include <stdint.h> 8 #include <string.h> 9 10 #include "env_posix.h" 11 12 void dbg_ucontext_to_frame(const ucontext_t* uc, KitUnwindFrame* f) { 13 const mcontext_t* mc = &uc->uc_mcontext; 14 memset(f, 0, sizeof(*f)); 15 f->regs[0] = (uint64_t)mc->mc_rax; 16 f->regs[1] = (uint64_t)mc->mc_rdx; 17 f->regs[2] = (uint64_t)mc->mc_rcx; 18 f->regs[3] = (uint64_t)mc->mc_rbx; 19 f->regs[4] = (uint64_t)mc->mc_rsi; 20 f->regs[5] = (uint64_t)mc->mc_rdi; 21 f->regs[6] = (uint64_t)mc->mc_rbp; 22 f->regs[7] = (uint64_t)mc->mc_rsp; 23 f->regs[8] = (uint64_t)mc->mc_r8; 24 f->regs[9] = (uint64_t)mc->mc_r9; 25 f->regs[10] = (uint64_t)mc->mc_r10; 26 f->regs[11] = (uint64_t)mc->mc_r11; 27 f->regs[12] = (uint64_t)mc->mc_r12; 28 f->regs[13] = (uint64_t)mc->mc_r13; 29 f->regs[14] = (uint64_t)mc->mc_r14; 30 f->regs[15] = (uint64_t)mc->mc_r15; 31 f->regs[16] = (uint64_t)mc->mc_rip; 32 f->pc = (uint64_t)mc->mc_rip; 33 f->cfa = (uint64_t)mc->mc_rsp; 34 } 35 36 void dbg_frame_to_ucontext(const KitUnwindFrame* f, ucontext_t* uc) { 37 mcontext_t* mc = &uc->uc_mcontext; 38 mc->mc_rax = (__register_t)f->regs[0]; 39 mc->mc_rdx = (__register_t)f->regs[1]; 40 mc->mc_rcx = (__register_t)f->regs[2]; 41 mc->mc_rbx = (__register_t)f->regs[3]; 42 mc->mc_rsi = (__register_t)f->regs[4]; 43 mc->mc_rdi = (__register_t)f->regs[5]; 44 mc->mc_rbp = (__register_t)f->regs[6]; 45 mc->mc_rsp = (__register_t)f->regs[7]; 46 mc->mc_r8 = (__register_t)f->regs[8]; 47 mc->mc_r9 = (__register_t)f->regs[9]; 48 mc->mc_r10 = (__register_t)f->regs[10]; 49 mc->mc_r11 = (__register_t)f->regs[11]; 50 mc->mc_r12 = (__register_t)f->regs[12]; 51 mc->mc_r13 = (__register_t)f->regs[13]; 52 mc->mc_r14 = (__register_t)f->regs[14]; 53 mc->mc_r15 = (__register_t)f->regs[15]; 54 mc->mc_rip = (__register_t)f->pc; 55 }