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 }