kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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 }