uctx_x86_64_macos.c (2098B)
1 /* ucontext_t <-> KitUnwindFrame marshalling for x86_64 on macOS. 2 * The frame array uses DWARF numbering, which is the System V x86-64 order 3 * (rax=0 rdx=1 rcx=2 rbx=3 rsi=4 rdi=5 rbp=6 rsp=7 r8..r15=8..15 rip=16). 4 * mcontext_t is a pointer to _STRUCT_MCONTEXT; the GPRs live in Darwin's 5 * __darwin_x86_thread_state64 (__ss), named __rax, __rbx, … __rip. */ 6 7 #include <stddef.h> 8 #include <stdint.h> 9 #include <string.h> 10 11 #include "env_posix.h" 12 13 static mcontext_t dbg_mcontext(const ucontext_t* uc) { 14 mcontext_t mc; 15 memcpy(&mc, (const char*)uc + offsetof(ucontext_t, uc_mcontext), sizeof(mc)); 16 return mc; 17 } 18 19 void dbg_ucontext_to_frame(const ucontext_t* uc, KitUnwindFrame* f) { 20 mcontext_t mc = dbg_mcontext(uc); 21 const struct __darwin_x86_thread_state64* ss = &mc->__ss; 22 memset(f, 0, sizeof(*f)); 23 f->regs[0] = (uint64_t)ss->__rax; 24 f->regs[1] = (uint64_t)ss->__rdx; 25 f->regs[2] = (uint64_t)ss->__rcx; 26 f->regs[3] = (uint64_t)ss->__rbx; 27 f->regs[4] = (uint64_t)ss->__rsi; 28 f->regs[5] = (uint64_t)ss->__rdi; 29 f->regs[6] = (uint64_t)ss->__rbp; 30 f->regs[7] = (uint64_t)ss->__rsp; 31 f->regs[8] = (uint64_t)ss->__r8; 32 f->regs[9] = (uint64_t)ss->__r9; 33 f->regs[10] = (uint64_t)ss->__r10; 34 f->regs[11] = (uint64_t)ss->__r11; 35 f->regs[12] = (uint64_t)ss->__r12; 36 f->regs[13] = (uint64_t)ss->__r13; 37 f->regs[14] = (uint64_t)ss->__r14; 38 f->regs[15] = (uint64_t)ss->__r15; 39 f->regs[16] = (uint64_t)ss->__rip; 40 f->pc = (uint64_t)ss->__rip; 41 f->cfa = (uint64_t)ss->__rsp; 42 } 43 44 void dbg_frame_to_ucontext(const KitUnwindFrame* f, ucontext_t* uc) { 45 mcontext_t mc = dbg_mcontext(uc); 46 struct __darwin_x86_thread_state64* ss = &mc->__ss; 47 ss->__rax = f->regs[0]; 48 ss->__rdx = f->regs[1]; 49 ss->__rcx = f->regs[2]; 50 ss->__rbx = f->regs[3]; 51 ss->__rsi = f->regs[4]; 52 ss->__rdi = f->regs[5]; 53 ss->__rbp = f->regs[6]; 54 ss->__rsp = f->regs[7]; 55 ss->__r8 = f->regs[8]; 56 ss->__r9 = f->regs[9]; 57 ss->__r10 = f->regs[10]; 58 ss->__r11 = f->regs[11]; 59 ss->__r12 = f->regs[12]; 60 ss->__r13 = f->regs[13]; 61 ss->__r14 = f->regs[14]; 62 ss->__r15 = f->regs[15]; 63 ss->__rip = f->pc; 64 }