uctx_aarch64_macos.c (1217B)
1 /* ucontext_t <-> KitUnwindFrame marshalling for aarch64 on macOS. 2 * Register slots use DWARF numbering (x0..x30, sp at index 31). The 3 * mcontext_t exposes Darwin's __darwin_arm_thread_state64. */ 4 5 #include <stddef.h> 6 #include <stdint.h> 7 #include <string.h> 8 9 #include "env_posix.h" 10 11 static mcontext_t dbg_mcontext(const ucontext_t* uc) { 12 mcontext_t mc; 13 memcpy(&mc, (const char*)uc + offsetof(ucontext_t, uc_mcontext), sizeof(mc)); 14 return mc; 15 } 16 17 void dbg_ucontext_to_frame(const ucontext_t* uc, KitUnwindFrame* f) { 18 mcontext_t mc = dbg_mcontext(uc); 19 const struct __darwin_arm_thread_state64* ss = &mc->__ss; 20 int i; 21 for (i = 0; i < 29; ++i) f->regs[i] = ss->__x[i]; 22 f->regs[29] = (uint64_t)ss->__fp; 23 f->regs[30] = (uint64_t)ss->__lr; 24 f->regs[31] = (uint64_t)ss->__sp; 25 f->pc = (uint64_t)ss->__pc; 26 f->cfa = (uint64_t)ss->__fp; /* DWARF CFI refines this in the session */ 27 } 28 29 void dbg_frame_to_ucontext(const KitUnwindFrame* f, ucontext_t* uc) { 30 mcontext_t mc = dbg_mcontext(uc); 31 struct __darwin_arm_thread_state64* ss = &mc->__ss; 32 int i; 33 for (i = 0; i < 29; ++i) ss->__x[i] = f->regs[i]; 34 ss->__fp = f->regs[29]; 35 ss->__lr = f->regs[30]; 36 ss->__sp = f->regs[31]; 37 ss->__pc = f->pc; 38 }