kit

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

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 }