[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH Risu 1/2] risu_ppc64: Fix Risu to run under qemu
From: |
Alex Bennée |
Subject: |
Re: [Qemu-devel] [PATCH Risu 1/2] risu_ppc64: Fix Risu to run under qemu linux user |
Date: |
Mon, 30 Jan 2017 11:26:10 +0000 |
User-agent: |
mu4e 0.9.19; emacs 25.1.91.6 |
Jose Ricardo Ziviani <address@hidden> 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 <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
--
Alex Bennée