On 4/30/20 12:21 AM, LIU Zhiwei wrote: > +void reginfo_init(struct reginfo *ri, ucontext_t *uc) > +{ > + int i; > + union __riscv_mc_fp_state *fp; > + /* necessary to be able to compare with memcmp later */ > + memset(ri, 0, sizeof(*ri)); > + > + for (i = 0; i < 32; i++) { > + ri->regs[i] = uc->uc_mcontext.__gregs[i]; > + } > + > + ri->sp = 0xdeadbeefdeadbeef; > + ri->regs[2] = 0xdeadbeefdeadbeef; > + ri->regs[3] = 0xdeadbeefdeadbeef; > + ri->regs[4] = 0xdeadbeefdeadbeef; > + ri->pc = uc->uc_mcontext.__gregs[0] - image_start_address; > + ri->faulting_insn = *((uint32_t *) uc->uc_mcontext.__gregs[0]); > + fp = &uc->uc_mcontext.__fpregs; > + ri->fcsr = fp->__d.__fcsr; > + > + for (i = 0; i < 32; i++) { > + ri->fregs[i] = fp->__d.__f[i]; > + } > +}
Perhaps wrap the fp bits here in #if __riscv_flen == 64 ri->fcsr = fp->__d.__fscr; ... #else # error "Unsupported fp length" #endif > + if (m->regs[i] != a->regs[i]) { > + fprintf(f, " X%-2d : %016" PRIx64 " vs %016" PRIx64 "\n", > + i, m->regs[i], a->regs[i]); > + } riscv doesn't name its registers with an x. r~