kit

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

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 }