Jose Ricardo Ziviani <[email protected]> writes: > Qemu linux-user doesn't fill uc_mcontext completely like full emul. > does.
Are you going to submit a fix for QEMU for this? Is there a reason it doesn't do it correctly? > For instance, uc->uc_mcontext.regs->nip is an invalid so this > commit replaces it by uc->uc_mcontext.gp_regs[PT_NIP] > > Signed-off-by: Jose Ricardo Ziviani <[email protected]> > --- > risu_ppc64le.c | 2 +- > risu_reginfo_ppc64le.c | 11 ++++++----- > test_ppc64le.s | 20 +++++++++----------- > 3 files changed, 16 insertions(+), 17 deletions(-) > > diff --git a/risu_ppc64le.c b/risu_ppc64le.c > index 9c1fafd..773d14c 100644 > --- a/risu_ppc64le.c > +++ b/risu_ppc64le.c > @@ -27,7 +27,7 @@ uint8_t apprentice_memblock[MEMBLOCKLEN]; > void advance_pc(void *vuc) > { > ucontext_t *uc = (ucontext_t*)vuc; > - uc->uc_mcontext.regs->nip += 4; > + uc->uc_mcontext.gp_regs[PT_NIP] += 4; > } > > void set_x0(void *vuc, uint64_t x0) > diff --git a/risu_reginfo_ppc64le.c b/risu_reginfo_ppc64le.c > index 7a54eab..4dc509c 100644 > --- a/risu_reginfo_ppc64le.c > +++ b/risu_reginfo_ppc64le.c > @@ -28,8 +28,9 @@ void reginfo_init(struct reginfo *ri, ucontext_t *uc) > int i; > memset(ri, 0, sizeof(*ri)); > > - ri->faulting_insn = *((uint32_t *)uc->uc_mcontext.regs->nip); > - ri->nip = uc->uc_mcontext.regs->nip - image_start_address; > + ri->faulting_insn = *((uint32_t *)uc->uc_mcontext.gp_regs[PT_NIP]); > + ri->prev_insn = *((uint32_t *)(uc->uc_mcontext.gp_regs[PT_NIP] - 4)); > + ri->nip = uc->uc_mcontext.gp_regs[PT_NIP] - image_start_address; > > for (i = 0; i < NGREG; i++) { > ri->gregs[i] = uc->uc_mcontext.gp_regs[i]; > @@ -105,9 +106,9 @@ void reginfo_dump(struct reginfo *ri, int is_master) > { > int i; > if (is_master) { > - fprintf(stderr, " faulting insn \e[1;101;37m0x%x\e[0m\n", > ri->faulting_insn); > - fprintf(stderr, " prev insn \e[1;101;37m0x%x\e[0m\n", > ri->prev_insn); > - fprintf(stderr, " prev addr \e[1;101;37m0x%" PRIx64 > "\e[0m\n\n", ri->prev_addr); > + fprintf(stderr, " faulting insn 0x%x\n", ri->faulting_insn); > + fprintf(stderr, " prev insn 0x%x\n", ri->prev_insn); > + fprintf(stderr, " prev addr 0x%" PRIx64 "\n\n", ri->nip); > } > > for (i = 0; i < 16; i++) { > diff --git a/test_ppc64le.s b/test_ppc64le.s > index 4321751..4af770c 100644 > --- a/test_ppc64le.s > +++ b/test_ppc64le.s > @@ -12,20 +12,18 @@ > > *****************************************************************************/ > > /* Initialise the gp regs */ > -li 0,0 > -li 1,1 > -li 2,2 > -li 3,3 > -li 4,4 > -li 5,5 > -li 6,6 > -li 7,7 > -li 8,8 > -li 9,9 > +li 0, 0 > +li 2, 2 > +li 3, 3 > +li 4, 4 > +li 5, 5 > +li 6, 6 > +li 7, 7 > +li 8, 8 > +li 9, 9 > li 10, 10 > li 11, 11 > li 12, 12 > -li 13, 13 > li 14, 14 > li 15, 15 > li 16, 16 -- Alex Bennée
