Message ID | 20210818191920.390759-12-richard.henderson@linaro.org |
---|---|
State | New |
Headers | show |
Series | Unaligned access for user-only | expand |
On Wed, 18 Aug 2021 at 20:23, Richard Henderson <richard.henderson@linaro.org> wrote: > > For simplicity on the linux-user side, always use SPR_DAR. > > Cc: qemu-ppc@nongnu.org > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > linux-user/ppc/cpu_loop.c | 2 +- > target/ppc/cpu_init.c | 2 +- > target/ppc/excp_helper.c | 2 ++ > 3 files changed, 4 insertions(+), 2 deletions(-) > > diff --git a/linux-user/ppc/cpu_loop.c b/linux-user/ppc/cpu_loop.c > index fa91ea0eed..d72d30248b 100644 > --- a/linux-user/ppc/cpu_loop.c > +++ b/linux-user/ppc/cpu_loop.c > @@ -165,7 +165,7 @@ void cpu_loop(CPUPPCState *env) > info.si_signo = TARGET_SIGBUS; > info.si_errno = 0; > info.si_code = TARGET_BUS_ADRALN; > - info._sifields._sigfault._addr = env->nip; > + info._sifields._sigfault._addr = env->spr[SPR_DAR]; > queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); > break; > case POWERPC_EXCP_PROGRAM: /* Program exception */ > diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c > index 505a0ed6ac..84fb6bbb83 100644 > --- a/target/ppc/cpu_init.c > +++ b/target/ppc/cpu_init.c > @@ -9014,12 +9014,12 @@ static const struct TCGCPUOps ppc_tcg_ops = { > .initialize = ppc_translate_init, > .cpu_exec_interrupt = ppc_cpu_exec_interrupt, > .tlb_fill = ppc_cpu_tlb_fill, > + .do_unaligned_access = ppc_cpu_do_unaligned_access, > > #ifndef CONFIG_USER_ONLY > .do_interrupt = ppc_cpu_do_interrupt, > .cpu_exec_enter = ppc_cpu_exec_enter, > .cpu_exec_exit = ppc_cpu_exec_exit, > - .do_unaligned_access = ppc_cpu_do_unaligned_access, > #endif /* !CONFIG_USER_ONLY */ > }; > #endif /* CONFIG_TCG */ > diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c > index d7743704ac..08cc474340 100644 > --- a/target/ppc/excp_helper.c > +++ b/target/ppc/excp_helper.c > @@ -1505,6 +1505,7 @@ void ppc_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr, > CPUPPCState *env = cs->env_ptr; > > switch (env->mmu_model) { If you add a comment giving the same info the commit message has, eg: /* * In user-only mode we always set SPR_DAR regardless of CPU type * so that the linux-user/ppc code only needs to look in one place */ then Reviewed-by: Peter Maydell <peter.maydell@linaro.org> thanks -- PMM
diff --git a/linux-user/ppc/cpu_loop.c b/linux-user/ppc/cpu_loop.c index fa91ea0eed..d72d30248b 100644 --- a/linux-user/ppc/cpu_loop.c +++ b/linux-user/ppc/cpu_loop.c @@ -165,7 +165,7 @@ void cpu_loop(CPUPPCState *env) info.si_signo = TARGET_SIGBUS; info.si_errno = 0; info.si_code = TARGET_BUS_ADRALN; - info._sifields._sigfault._addr = env->nip; + info._sifields._sigfault._addr = env->spr[SPR_DAR]; queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); break; case POWERPC_EXCP_PROGRAM: /* Program exception */ diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c index 505a0ed6ac..84fb6bbb83 100644 --- a/target/ppc/cpu_init.c +++ b/target/ppc/cpu_init.c @@ -9014,12 +9014,12 @@ static const struct TCGCPUOps ppc_tcg_ops = { .initialize = ppc_translate_init, .cpu_exec_interrupt = ppc_cpu_exec_interrupt, .tlb_fill = ppc_cpu_tlb_fill, + .do_unaligned_access = ppc_cpu_do_unaligned_access, #ifndef CONFIG_USER_ONLY .do_interrupt = ppc_cpu_do_interrupt, .cpu_exec_enter = ppc_cpu_exec_enter, .cpu_exec_exit = ppc_cpu_exec_exit, - .do_unaligned_access = ppc_cpu_do_unaligned_access, #endif /* !CONFIG_USER_ONLY */ }; #endif /* CONFIG_TCG */ diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c index d7743704ac..08cc474340 100644 --- a/target/ppc/excp_helper.c +++ b/target/ppc/excp_helper.c @@ -1505,6 +1505,7 @@ void ppc_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr, CPUPPCState *env = cs->env_ptr; switch (env->mmu_model) { +#ifndef CONFIG_USER_ONLY case POWERPC_MMU_SOFT_4xx: case POWERPC_MMU_SOFT_4xx_Z: env->spr[SPR_40x_DEAR] = vaddr; @@ -1513,6 +1514,7 @@ void ppc_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr, case POWERPC_MMU_BOOKE206: env->spr[SPR_BOOKE_DEAR] = vaddr; break; +#endif default: env->spr[SPR_DAR] = vaddr; break;
For simplicity on the linux-user side, always use SPR_DAR. Cc: qemu-ppc@nongnu.org Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- linux-user/ppc/cpu_loop.c | 2 +- target/ppc/cpu_init.c | 2 +- target/ppc/excp_helper.c | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) -- 2.25.1