uctx_aarch64_freebsd.c (913B)
1 /* ucontext_t <-> KitUnwindFrame marshalling for aarch64 on FreeBSD. 2 * mcontext_t uses a named gpregs struct: gp_x[0..29] (x0..x29), gp_lr (x30), 3 * gp_sp, and gp_elr (the saved PC). */ 4 5 #include <stdint.h> 6 7 #include "env_posix.h" 8 9 void dbg_ucontext_to_frame(const ucontext_t* uc, KitUnwindFrame* f) { 10 const struct gpregs* gp = &uc->uc_mcontext.mc_gpregs; 11 int i; 12 for (i = 0; i < 30; ++i) f->regs[i] = (uint64_t)gp->gp_x[i]; 13 f->regs[30] = (uint64_t)gp->gp_lr; 14 f->regs[31] = (uint64_t)gp->gp_sp; 15 f->pc = (uint64_t)gp->gp_elr; 16 f->cfa = (uint64_t)gp->gp_x[29]; /* fp; CFI refines */ 17 } 18 19 void dbg_frame_to_ucontext(const KitUnwindFrame* f, ucontext_t* uc) { 20 struct gpregs* gp = &uc->uc_mcontext.mc_gpregs; 21 int i; 22 for (i = 0; i < 30; ++i) gp->gp_x[i] = (__register_t)f->regs[i]; 23 gp->gp_lr = (__register_t)f->regs[30]; 24 gp->gp_sp = (__register_t)f->regs[31]; 25 gp->gp_elr = (__register_t)f->pc; 26 }