[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH Risu 1/2] risu_ppc64: Fix Risu to run under qemu lin
From: |
Jose Ricardo Ziviani |
Subject: |
[Qemu-devel] [PATCH Risu 1/2] risu_ppc64: Fix Risu to run under qemu linux user |
Date: |
Mon, 30 Jan 2017 00:47:36 -0200 |
Qemu linux-user doesn't fill uc_mcontext completely like full emul. does.
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 <address@hidden>
---
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
--
2.7.4