kit

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

uctx_rv64_freebsd.c (3671B)


      1 /* ucontext_t <-> KitUnwindFrame marshalling for riscv64 on FreeBSD.
      2  * mcontext_t uses a named gpregs struct with fields for each register group.
      3  * DWARF numbering assigns 0..31 to x0..x31; x0 is the constant zero (absent).
      4  * Register layout:
      5  *   gp_ra=x1  gp_sp=x2  gp_gp=x3  gp_tp=x4
      6  *   gp_t[0..2]=x5-x7   gp_t[3..6]=x28-x31
      7  *   gp_s[0..1]=x8-x9   gp_s[2..11]=x18-x27
      8  *   gp_a[0..7]=x10-x17  gp_sepc=PC */
      9 
     10 #include <stdint.h>
     11 
     12 #include "env_posix.h"
     13 
     14 void dbg_ucontext_to_frame(const ucontext_t* uc, KitUnwindFrame* f) {
     15   const struct gpregs* gp = &uc->uc_mcontext.mc_gpregs;
     16   f->regs[0]  = 0; /* x0 is always zero */
     17   f->regs[1]  = (uint64_t)gp->gp_ra;
     18   f->regs[2]  = (uint64_t)gp->gp_sp;
     19   f->regs[3]  = (uint64_t)gp->gp_gp;
     20   f->regs[4]  = (uint64_t)gp->gp_tp;
     21   f->regs[5]  = (uint64_t)gp->gp_t[0]; /* t0 */
     22   f->regs[6]  = (uint64_t)gp->gp_t[1]; /* t1 */
     23   f->regs[7]  = (uint64_t)gp->gp_t[2]; /* t2 */
     24   f->regs[8]  = (uint64_t)gp->gp_s[0]; /* s0/fp */
     25   f->regs[9]  = (uint64_t)gp->gp_s[1]; /* s1 */
     26   f->regs[10] = (uint64_t)gp->gp_a[0]; /* a0 */
     27   f->regs[11] = (uint64_t)gp->gp_a[1]; /* a1 */
     28   f->regs[12] = (uint64_t)gp->gp_a[2]; /* a2 */
     29   f->regs[13] = (uint64_t)gp->gp_a[3]; /* a3 */
     30   f->regs[14] = (uint64_t)gp->gp_a[4]; /* a4 */
     31   f->regs[15] = (uint64_t)gp->gp_a[5]; /* a5 */
     32   f->regs[16] = (uint64_t)gp->gp_a[6]; /* a6 */
     33   f->regs[17] = (uint64_t)gp->gp_a[7]; /* a7 */
     34   f->regs[18] = (uint64_t)gp->gp_s[2]; /* s2 */
     35   f->regs[19] = (uint64_t)gp->gp_s[3]; /* s3 */
     36   f->regs[20] = (uint64_t)gp->gp_s[4]; /* s4 */
     37   f->regs[21] = (uint64_t)gp->gp_s[5]; /* s5 */
     38   f->regs[22] = (uint64_t)gp->gp_s[6]; /* s6 */
     39   f->regs[23] = (uint64_t)gp->gp_s[7]; /* s7 */
     40   f->regs[24] = (uint64_t)gp->gp_s[8]; /* s8 */
     41   f->regs[25] = (uint64_t)gp->gp_s[9]; /* s9 */
     42   f->regs[26] = (uint64_t)gp->gp_s[10]; /* s10 */
     43   f->regs[27] = (uint64_t)gp->gp_s[11]; /* s11 */
     44   f->regs[28] = (uint64_t)gp->gp_t[3]; /* t3 */
     45   f->regs[29] = (uint64_t)gp->gp_t[4]; /* t4 */
     46   f->regs[30] = (uint64_t)gp->gp_t[5]; /* t5 */
     47   f->regs[31] = (uint64_t)gp->gp_t[6]; /* t6 */
     48   f->pc  = (uint64_t)gp->gp_sepc;
     49   f->cfa = (uint64_t)gp->gp_s[0]; /* s0/fp; CFI refines */
     50 }
     51 
     52 void dbg_frame_to_ucontext(const KitUnwindFrame* f, ucontext_t* uc) {
     53   struct gpregs* gp = &uc->uc_mcontext.mc_gpregs;
     54   gp->gp_ra   = (__register_t)f->regs[1];
     55   gp->gp_sp   = (__register_t)f->regs[2];
     56   gp->gp_gp   = (__register_t)f->regs[3];
     57   gp->gp_tp   = (__register_t)f->regs[4];
     58   gp->gp_t[0] = (__register_t)f->regs[5];
     59   gp->gp_t[1] = (__register_t)f->regs[6];
     60   gp->gp_t[2] = (__register_t)f->regs[7];
     61   gp->gp_s[0] = (__register_t)f->regs[8];
     62   gp->gp_s[1] = (__register_t)f->regs[9];
     63   gp->gp_a[0] = (__register_t)f->regs[10];
     64   gp->gp_a[1] = (__register_t)f->regs[11];
     65   gp->gp_a[2] = (__register_t)f->regs[12];
     66   gp->gp_a[3] = (__register_t)f->regs[13];
     67   gp->gp_a[4] = (__register_t)f->regs[14];
     68   gp->gp_a[5] = (__register_t)f->regs[15];
     69   gp->gp_a[6] = (__register_t)f->regs[16];
     70   gp->gp_a[7] = (__register_t)f->regs[17];
     71   gp->gp_s[2]  = (__register_t)f->regs[18];
     72   gp->gp_s[3]  = (__register_t)f->regs[19];
     73   gp->gp_s[4]  = (__register_t)f->regs[20];
     74   gp->gp_s[5]  = (__register_t)f->regs[21];
     75   gp->gp_s[6]  = (__register_t)f->regs[22];
     76   gp->gp_s[7]  = (__register_t)f->regs[23];
     77   gp->gp_s[8]  = (__register_t)f->regs[24];
     78   gp->gp_s[9]  = (__register_t)f->regs[25];
     79   gp->gp_s[10] = (__register_t)f->regs[26];
     80   gp->gp_s[11] = (__register_t)f->regs[27];
     81   gp->gp_t[3] = (__register_t)f->regs[28];
     82   gp->gp_t[4] = (__register_t)f->regs[29];
     83   gp->gp_t[5] = (__register_t)f->regs[30];
     84   gp->gp_t[6] = (__register_t)f->regs[31];
     85   gp->gp_sepc = (__register_t)f->pc;
     86 }