kit

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

uctx_x86_64_linux.c (1893B)


      1 /* ucontext_t <-> KitUnwindFrame marshalling for x86_64 on Linux.
      2  * mcontext_t.gregs[] is indexed by glibc's REG_* enum (RAX, RDX, RCX, ...);
      3  * the frame array uses DWARF numbering, which is the System V x86-64 order
      4  * (RAX, RDX, RCX, RBX, RSI, RDI, RBP, RSP, R8..R15, RIP). */
      5 
      6 #include <stdint.h>
      7 #include <string.h>
      8 
      9 #include "env_posix.h"
     10 
     11 void dbg_ucontext_to_frame(const ucontext_t* uc, KitUnwindFrame* f) {
     12   const greg_t* g = uc->uc_mcontext.gregs;
     13   memset(f, 0, sizeof(*f));
     14   f->regs[0] = (uint64_t)g[REG_RAX];
     15   f->regs[1] = (uint64_t)g[REG_RDX];
     16   f->regs[2] = (uint64_t)g[REG_RCX];
     17   f->regs[3] = (uint64_t)g[REG_RBX];
     18   f->regs[4] = (uint64_t)g[REG_RSI];
     19   f->regs[5] = (uint64_t)g[REG_RDI];
     20   f->regs[6] = (uint64_t)g[REG_RBP];
     21   f->regs[7] = (uint64_t)g[REG_RSP];
     22   f->regs[8] = (uint64_t)g[REG_R8];
     23   f->regs[9] = (uint64_t)g[REG_R9];
     24   f->regs[10] = (uint64_t)g[REG_R10];
     25   f->regs[11] = (uint64_t)g[REG_R11];
     26   f->regs[12] = (uint64_t)g[REG_R12];
     27   f->regs[13] = (uint64_t)g[REG_R13];
     28   f->regs[14] = (uint64_t)g[REG_R14];
     29   f->regs[15] = (uint64_t)g[REG_R15];
     30   f->regs[16] = (uint64_t)g[REG_RIP];
     31   f->pc = (uint64_t)g[REG_RIP];
     32   f->cfa = (uint64_t)g[REG_RSP];
     33 }
     34 
     35 void dbg_frame_to_ucontext(const KitUnwindFrame* f, ucontext_t* uc) {
     36   greg_t* g = uc->uc_mcontext.gregs;
     37   g[REG_RAX] = (greg_t)f->regs[0];
     38   g[REG_RDX] = (greg_t)f->regs[1];
     39   g[REG_RCX] = (greg_t)f->regs[2];
     40   g[REG_RBX] = (greg_t)f->regs[3];
     41   g[REG_RSI] = (greg_t)f->regs[4];
     42   g[REG_RDI] = (greg_t)f->regs[5];
     43   g[REG_RBP] = (greg_t)f->regs[6];
     44   g[REG_RSP] = (greg_t)f->regs[7];
     45   g[REG_R8] = (greg_t)f->regs[8];
     46   g[REG_R9] = (greg_t)f->regs[9];
     47   g[REG_R10] = (greg_t)f->regs[10];
     48   g[REG_R11] = (greg_t)f->regs[11];
     49   g[REG_R12] = (greg_t)f->regs[12];
     50   g[REG_R13] = (greg_t)f->regs[13];
     51   g[REG_R14] = (greg_t)f->regs[14];
     52   g[REG_R15] = (greg_t)f->regs[15];
     53   g[REG_RIP] = (greg_t)f->pc;
     54 }