kit

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

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 }