qemu-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]