diff mbox series

[v3,11/66] target/ppc: Implement do_unaligned_access for user-only

Message ID 20210818191920.390759-12-richard.henderson@linaro.org
State New
Headers show
Series Unaligned access for user-only | expand

Commit Message

Richard Henderson Aug. 18, 2021, 7:18 p.m. UTC
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

Comments

Peter Maydell Aug. 19, 2021, 3:44 p.m. UTC | #1
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 mbox series

Patch

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;