diff mbox series

[v2,2/2] target/*helper: don't check retaddr before calling cpu_restore_state

Message ID 20171108153245.20740-3-alex.bennee@linaro.org
State New
Headers show
Series fixing translation time segfaults | expand

Commit Message

Alex Bennée Nov. 8, 2017, 3:32 p.m. UTC
cpu_restore_state officially supports being passed an address it can't
resolve the state for. As a result the checks in the helpers are
superfluous and can be removed. This makes the code consistent with
other users of cpu_restore_state.

Of course this does nothing to address what to do if cpu_restore_state
can't resolve the state but so far it seems this is handled elsewhere.

The change was made with included coccinelle script.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

---
 scripts/coccinelle/cpu_restore_state.cocci | 12 ++++++++++++
 target/alpha/mem_helper.c                  | 12 +++---------
 target/arm/op_helper.c                     | 17 ++++-------------
 target/i386/svm_helper.c                   |  4 +---
 target/lm32/op_helper.c                    |  7 ++-----
 target/m68k/op_helper.c                    |  7 ++-----
 target/microblaze/op_helper.c              |  7 ++-----
 target/moxie/helper.c                      |  4 +---
 target/nios2/mmu.c                         |  7 ++-----
 target/openrisc/mmu_helper.c               |  7 ++-----
 target/s390x/excp_helper.c                 |  4 +---
 target/tricore/op_helper.c                 | 11 +++--------
 target/unicore32/op_helper.c               |  7 ++-----
 13 files changed, 37 insertions(+), 69 deletions(-)
 create mode 100644 scripts/coccinelle/cpu_restore_state.cocci

-- 
2.14.2

Comments

Laurent Vivier Nov. 8, 2017, 3:42 p.m. UTC | #1
Le 08/11/2017 à 16:32, Alex Bennée a écrit :
> cpu_restore_state officially supports being passed an address it can't

> resolve the state for. As a result the checks in the helpers are

> superfluous and can be removed. This makes the code consistent with

> other users of cpu_restore_state.

> 

> Of course this does nothing to address what to do if cpu_restore_state

> can't resolve the state but so far it seems this is handled elsewhere.

> 

> The change was made with included coccinelle script.

> 

> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

> ---

>  scripts/coccinelle/cpu_restore_state.cocci | 12 ++++++++++++

>  target/alpha/mem_helper.c                  | 12 +++---------

>  target/arm/op_helper.c                     | 17 ++++-------------

>  target/i386/svm_helper.c                   |  4 +---

>  target/lm32/op_helper.c                    |  7 ++-----

>  target/m68k/op_helper.c                    |  7 ++-----

>  target/microblaze/op_helper.c              |  7 ++-----

>  target/moxie/helper.c                      |  4 +---

>  target/nios2/mmu.c                         |  7 ++-----

>  target/openrisc/mmu_helper.c               |  7 ++-----

>  target/s390x/excp_helper.c                 |  4 +---

>  target/tricore/op_helper.c                 | 11 +++--------

>  target/unicore32/op_helper.c               |  7 ++-----

>  13 files changed, 37 insertions(+), 69 deletions(-)

>  create mode 100644 scripts/coccinelle/cpu_restore_state.cocci

> 

> diff --git a/scripts/coccinelle/cpu_restore_state.cocci b/scripts/coccinelle/cpu_restore_state.cocci

> new file mode 100644

> index 0000000000..934a042382

> --- /dev/null

> +++ b/scripts/coccinelle/cpu_restore_state.cocci

> @@ -0,0 +1,12 @@

> +// Remove unneeded tests before calling cpu_restore_state

> +//

> +// spatch --macro-file scripts/cocci-macro-file.h \

> +//        --sp-file ./scripts/coccinelle/cpu_restore_state.cocci \

> +//        --keep-comments --in-place --use-gitgrep --dir target

> +@@

> +identifier A;

> +expression C;

> +@@

> +-if (A) {

> +     cpu_restore_state(C, A);

> +-}

> diff --git a/target/alpha/mem_helper.c b/target/alpha/mem_helper.c

> index 3c06baa93a..6cf9bba17e 100644

> --- a/target/alpha/mem_helper.c

> +++ b/target/alpha/mem_helper.c

> @@ -34,9 +34,7 @@ void alpha_cpu_do_unaligned_access(CPUState *cs, vaddr addr,

>      uint64_t pc;

>      uint32_t insn;

>  

> -    if (retaddr) {

> -        cpu_restore_state(cs, retaddr);

> -    }

> +    cpu_restore_state(cs, retaddr);

>  

>      pc = env->pc;

>      insn = cpu_ldl_code(env, pc);

> @@ -58,9 +56,7 @@ void alpha_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,

>      AlphaCPU *cpu = ALPHA_CPU(cs);

>      CPUAlphaState *env = &cpu->env;

>  

> -    if (retaddr) {

> -        cpu_restore_state(cs, retaddr);

> -    }

> +    cpu_restore_state(cs, retaddr);

>  

>      env->trap_arg0 = addr;

>      env->trap_arg1 = access_type == MMU_DATA_STORE ? 1 : 0;

> @@ -80,9 +76,7 @@ void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,

>  

>      ret = alpha_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);

>      if (unlikely(ret != 0)) {

> -        if (retaddr) {

> -            cpu_restore_state(cs, retaddr);

> -        }

> +        cpu_restore_state(cs, retaddr);

>          /* Exception index and error code are already set */

>          cpu_loop_exit(cs);

>      }

> diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c

> index a40a84ac24..504556a697 100644

> --- a/target/arm/op_helper.c

> +++ b/target/arm/op_helper.c

> @@ -175,11 +175,8 @@ void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,

>      if (unlikely(ret)) {

>          ARMCPU *cpu = ARM_CPU(cs);

>          uint32_t fsc;

> -

> -        if (retaddr) {

> -            /* now we have a real cpu fault */

> -            cpu_restore_state(cs, retaddr);

> -        }

> +        /* now we have a real cpu fault */

> +        cpu_restore_state(cs, retaddr);

>  

>          if (fsr & (1 << 9)) {

>              /* LPAE format fault status register : bottom 6 bits are

> @@ -210,11 +207,8 @@ void arm_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr,

>      uint32_t fsr, fsc;

>      ARMMMUFaultInfo fi = {};

>      ARMMMUIdx arm_mmu_idx = core_to_arm_mmu_idx(env, mmu_idx);

> -

> -    if (retaddr) {

>          /* now we have a real cpu fault */

> -        cpu_restore_state(cs, retaddr);

> -    }

> +    cpu_restore_state(cs, retaddr);

>  

>      /* the DFSR for an alignment fault depends on whether we're using

>       * the LPAE long descriptor format, or the short descriptor format

> @@ -244,11 +238,8 @@ void arm_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,

>      uint32_t fsr, fsc;

>      ARMMMUFaultInfo fi = {};

>      ARMMMUIdx arm_mmu_idx = core_to_arm_mmu_idx(env, mmu_idx);

> -

> -    if (retaddr) {

>          /* now we have a real cpu fault */

> -        cpu_restore_state(cs, retaddr);

> -    }

> +    cpu_restore_state(cs, retaddr);

>  

>      /* The EA bit in syndromes and fault status registers is an

>       * IMPDEF classification of external aborts. ARM implementations

> diff --git a/target/i386/svm_helper.c b/target/i386/svm_helper.c

> index f479239875..303106981c 100644

> --- a/target/i386/svm_helper.c

> +++ b/target/i386/svm_helper.c

> @@ -584,9 +584,7 @@ void cpu_vmexit(CPUX86State *env, uint32_t exit_code, uint64_t exit_info_1,

>  {

>      CPUState *cs = CPU(x86_env_get_cpu(env));

>  

> -    if (retaddr) {

> -        cpu_restore_state(cs, retaddr);

> -    }

> +    cpu_restore_state(cs, retaddr);

>  

>      qemu_log_mask(CPU_LOG_TB_IN_ASM, "vmexit(%08x, %016" PRIx64 ", %016"

>                    PRIx64 ", " TARGET_FMT_lx ")!\n",

> diff --git a/target/lm32/op_helper.c b/target/lm32/op_helper.c

> index 2177c8ad12..7b800bbeab 100644

> --- a/target/lm32/op_helper.c

> +++ b/target/lm32/op_helper.c

> @@ -150,11 +150,8 @@ void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,

>      int ret;

>  

>      ret = lm32_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);

> -    if (unlikely(ret)) {

> -        if (retaddr) {

> -            /* now we have a real cpu fault */

> -            cpu_restore_state(cs, retaddr);

> -        }

> +    if (unlikely(ret)) {/* now we have a real cpu fault */

> +        cpu_restore_state(cs, retaddr);

>          cpu_loop_exit(cs);

>      }

>  }

> diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c

> index 63089511cb..3079e04c7d 100644

> --- a/target/m68k/op_helper.c

> +++ b/target/m68k/op_helper.c

> @@ -45,11 +45,8 @@ void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,

>      int ret;

>  

>      ret = m68k_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);

> -    if (unlikely(ret)) {

> -        if (retaddr) {

> -            /* now we have a real cpu fault */

> -            cpu_restore_state(cs, retaddr);

> -        }

> +    if (unlikely(ret)) {/* now we have a real cpu fault */

> +        cpu_restore_state(cs, retaddr);

>          cpu_loop_exit(cs);

>      }

>  }

> diff --git a/target/microblaze/op_helper.c b/target/microblaze/op_helper.c

> index 1e07e21c1c..3b862faaa1 100644

> --- a/target/microblaze/op_helper.c

> +++ b/target/microblaze/op_helper.c

> @@ -39,11 +39,8 @@ void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,

>      int ret;

>  

>      ret = mb_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);

> -    if (unlikely(ret)) {

> -        if (retaddr) {

> -            /* now we have a real cpu fault */

> -            cpu_restore_state(cs, retaddr);

> -        }

> +    if (unlikely(ret)) {/* now we have a real cpu fault */

> +        cpu_restore_state(cs, retaddr);

>          cpu_loop_exit(cs);

>      }

>  }

> diff --git a/target/moxie/helper.c b/target/moxie/helper.c

> index 330299f5a7..2ecee89f11 100644

> --- a/target/moxie/helper.c

> +++ b/target/moxie/helper.c

> @@ -36,9 +36,7 @@ void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,

>  

>      ret = moxie_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);

>      if (unlikely(ret)) {

> -        if (retaddr) {

> -            cpu_restore_state(cs, retaddr);

> -        }

> +        cpu_restore_state(cs, retaddr);

>      }

>      cpu_loop_exit(cs);

>  }

> diff --git a/target/nios2/mmu.c b/target/nios2/mmu.c

> index fe9298af50..6d66a5702d 100644

> --- a/target/nios2/mmu.c

> +++ b/target/nios2/mmu.c

> @@ -41,11 +41,8 @@ void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,

>      int ret;

>  

>      ret = nios2_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);

> -    if (unlikely(ret)) {

> -        if (retaddr) {

> -            /* now we have a real cpu fault */

> -            cpu_restore_state(cs, retaddr);

> -        }

> +    if (unlikely(ret)) {/* now we have a real cpu fault */

> +        cpu_restore_state(cs, retaddr);

>          cpu_loop_exit(cs);

>      }

>  }

> diff --git a/target/openrisc/mmu_helper.c b/target/openrisc/mmu_helper.c

> index a44d0aa51a..47cd7775b6 100644

> --- a/target/openrisc/mmu_helper.c

> +++ b/target/openrisc/mmu_helper.c

> @@ -32,11 +32,8 @@ void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,

>  

>      ret = openrisc_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);

>  

> -    if (ret) {

> -        if (retaddr) {

> -            /* now we have a real cpu fault.  */

> -            cpu_restore_state(cs, retaddr);

> -        }

> +    if (ret) {/* now we have a real cpu fault.  */

> +        cpu_restore_state(cs, retaddr);

>          /* Raise Exception.  */

>          cpu_loop_exit(cs);

>      }

> diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c

> index e04b670663..8584ec43c1 100644

> --- a/target/s390x/excp_helper.c

> +++ b/target/s390x/excp_helper.c

> @@ -554,9 +554,7 @@ void s390x_cpu_do_unaligned_access(CPUState *cs, vaddr addr,

>      S390CPU *cpu = S390_CPU(cs);

>      CPUS390XState *env = &cpu->env;

>  

> -    if (retaddr) {

> -        cpu_restore_state(cs, retaddr);

> -    }

> +    cpu_restore_state(cs, retaddr);

>      program_interrupt(env, PGM_SPECIFICATION, ILEN_AUTO);

>  }

>  

> diff --git a/target/tricore/op_helper.c b/target/tricore/op_helper.c

> index 7af202c8c0..b0307de1ea 100644

> --- a/target/tricore/op_helper.c

> +++ b/target/tricore/op_helper.c

> @@ -31,9 +31,7 @@ raise_exception_sync_internal(CPUTriCoreState *env, uint32_t class, int tin,

>  {

>      CPUState *cs = CPU(tricore_env_get_cpu(env));

>      /* in case we come from a helper-call we need to restore the PC */

> -    if (pc) {

> -        cpu_restore_state(cs, pc);

> -    }

> +    cpu_restore_state(cs, pc);

>  

>      /* Tin is loaded into d[15] */

>      env->gpr_d[15] = tin;

> @@ -2804,11 +2802,8 @@ static inline void QEMU_NORETURN do_raise_exception_err(CPUTriCoreState *env,

>      CPUState *cs = CPU(tricore_env_get_cpu(env));

>      cs->exception_index = exception;

>      env->error_code = error_code;

> -

> -    if (pc) {

> -        /* now we have a real cpu fault */

> -        cpu_restore_state(cs, pc);

> -    }

> +    /* now we have a real cpu fault */

> +    cpu_restore_state(cs, pc);

>  

>      cpu_loop_exit(cs);

>  }

> diff --git a/target/unicore32/op_helper.c b/target/unicore32/op_helper.c

> index 0872c29faa..5a826b0e31 100644

> --- a/target/unicore32/op_helper.c

> +++ b/target/unicore32/op_helper.c

> @@ -250,11 +250,8 @@ void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,

>      int ret;

>  

>      ret = uc32_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);

> -    if (unlikely(ret)) {

> -        if (retaddr) {

> -            /* now we have a real cpu fault */

> -            cpu_restore_state(cs, retaddr);

> -        }

> +    if (unlikely(ret)) {/* now we have a real cpu fault */

> +        cpu_restore_state(cs, retaddr);

>          cpu_loop_exit(cs);

>      }

>  }

> 


Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Richard Henderson Nov. 8, 2017, 4:32 p.m. UTC | #2
On 11/08/2017 04:32 PM, Alex Bennée wrote:
> -        if (retaddr) {

> -            cpu_restore_state(cs, retaddr);

> -        }

> +        cpu_restore_state(cs, retaddr);

>          /* Exception index and error code are already set */

>          cpu_loop_exit(cs);


Not that this is wrong, but while we're cleaning things up,
this call combo is cpu_loop_exit_restore.

You create at least 8 of these pairs in this patch.

> +++ b/target/moxie/helper.c

> @@ -36,9 +36,7 @@ void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,

>  

>      ret = moxie_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);

>      if (unlikely(ret)) {

> -        if (retaddr) {

> -            cpu_restore_state(cs, retaddr);

> -        }

> +        cpu_restore_state(cs, retaddr);

>      }

>      cpu_loop_exit(cs);

>  }



This one *should* have been such a pair, but there's an existing bug in moxie
that should have restricted the cpu_loop_exit to inside the if.

All that said,

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>



r~
diff mbox series

Patch

diff --git a/scripts/coccinelle/cpu_restore_state.cocci b/scripts/coccinelle/cpu_restore_state.cocci
new file mode 100644
index 0000000000..934a042382
--- /dev/null
+++ b/scripts/coccinelle/cpu_restore_state.cocci
@@ -0,0 +1,12 @@ 
+// Remove unneeded tests before calling cpu_restore_state
+//
+// spatch --macro-file scripts/cocci-macro-file.h \
+//        --sp-file ./scripts/coccinelle/cpu_restore_state.cocci \
+//        --keep-comments --in-place --use-gitgrep --dir target
+@@
+identifier A;
+expression C;
+@@
+-if (A) {
+     cpu_restore_state(C, A);
+-}
diff --git a/target/alpha/mem_helper.c b/target/alpha/mem_helper.c
index 3c06baa93a..6cf9bba17e 100644
--- a/target/alpha/mem_helper.c
+++ b/target/alpha/mem_helper.c
@@ -34,9 +34,7 @@  void alpha_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
     uint64_t pc;
     uint32_t insn;
 
-    if (retaddr) {
-        cpu_restore_state(cs, retaddr);
-    }
+    cpu_restore_state(cs, retaddr);
 
     pc = env->pc;
     insn = cpu_ldl_code(env, pc);
@@ -58,9 +56,7 @@  void alpha_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
     AlphaCPU *cpu = ALPHA_CPU(cs);
     CPUAlphaState *env = &cpu->env;
 
-    if (retaddr) {
-        cpu_restore_state(cs, retaddr);
-    }
+    cpu_restore_state(cs, retaddr);
 
     env->trap_arg0 = addr;
     env->trap_arg1 = access_type == MMU_DATA_STORE ? 1 : 0;
@@ -80,9 +76,7 @@  void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,
 
     ret = alpha_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);
     if (unlikely(ret != 0)) {
-        if (retaddr) {
-            cpu_restore_state(cs, retaddr);
-        }
+        cpu_restore_state(cs, retaddr);
         /* Exception index and error code are already set */
         cpu_loop_exit(cs);
     }
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
index a40a84ac24..504556a697 100644
--- a/target/arm/op_helper.c
+++ b/target/arm/op_helper.c
@@ -175,11 +175,8 @@  void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,
     if (unlikely(ret)) {
         ARMCPU *cpu = ARM_CPU(cs);
         uint32_t fsc;
-
-        if (retaddr) {
-            /* now we have a real cpu fault */
-            cpu_restore_state(cs, retaddr);
-        }
+        /* now we have a real cpu fault */
+        cpu_restore_state(cs, retaddr);
 
         if (fsr & (1 << 9)) {
             /* LPAE format fault status register : bottom 6 bits are
@@ -210,11 +207,8 @@  void arm_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr,
     uint32_t fsr, fsc;
     ARMMMUFaultInfo fi = {};
     ARMMMUIdx arm_mmu_idx = core_to_arm_mmu_idx(env, mmu_idx);
-
-    if (retaddr) {
         /* now we have a real cpu fault */
-        cpu_restore_state(cs, retaddr);
-    }
+    cpu_restore_state(cs, retaddr);
 
     /* the DFSR for an alignment fault depends on whether we're using
      * the LPAE long descriptor format, or the short descriptor format
@@ -244,11 +238,8 @@  void arm_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
     uint32_t fsr, fsc;
     ARMMMUFaultInfo fi = {};
     ARMMMUIdx arm_mmu_idx = core_to_arm_mmu_idx(env, mmu_idx);
-
-    if (retaddr) {
         /* now we have a real cpu fault */
-        cpu_restore_state(cs, retaddr);
-    }
+    cpu_restore_state(cs, retaddr);
 
     /* The EA bit in syndromes and fault status registers is an
      * IMPDEF classification of external aborts. ARM implementations
diff --git a/target/i386/svm_helper.c b/target/i386/svm_helper.c
index f479239875..303106981c 100644
--- a/target/i386/svm_helper.c
+++ b/target/i386/svm_helper.c
@@ -584,9 +584,7 @@  void cpu_vmexit(CPUX86State *env, uint32_t exit_code, uint64_t exit_info_1,
 {
     CPUState *cs = CPU(x86_env_get_cpu(env));
 
-    if (retaddr) {
-        cpu_restore_state(cs, retaddr);
-    }
+    cpu_restore_state(cs, retaddr);
 
     qemu_log_mask(CPU_LOG_TB_IN_ASM, "vmexit(%08x, %016" PRIx64 ", %016"
                   PRIx64 ", " TARGET_FMT_lx ")!\n",
diff --git a/target/lm32/op_helper.c b/target/lm32/op_helper.c
index 2177c8ad12..7b800bbeab 100644
--- a/target/lm32/op_helper.c
+++ b/target/lm32/op_helper.c
@@ -150,11 +150,8 @@  void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,
     int ret;
 
     ret = lm32_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);
-    if (unlikely(ret)) {
-        if (retaddr) {
-            /* now we have a real cpu fault */
-            cpu_restore_state(cs, retaddr);
-        }
+    if (unlikely(ret)) {/* now we have a real cpu fault */
+        cpu_restore_state(cs, retaddr);
         cpu_loop_exit(cs);
     }
 }
diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c
index 63089511cb..3079e04c7d 100644
--- a/target/m68k/op_helper.c
+++ b/target/m68k/op_helper.c
@@ -45,11 +45,8 @@  void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,
     int ret;
 
     ret = m68k_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);
-    if (unlikely(ret)) {
-        if (retaddr) {
-            /* now we have a real cpu fault */
-            cpu_restore_state(cs, retaddr);
-        }
+    if (unlikely(ret)) {/* now we have a real cpu fault */
+        cpu_restore_state(cs, retaddr);
         cpu_loop_exit(cs);
     }
 }
diff --git a/target/microblaze/op_helper.c b/target/microblaze/op_helper.c
index 1e07e21c1c..3b862faaa1 100644
--- a/target/microblaze/op_helper.c
+++ b/target/microblaze/op_helper.c
@@ -39,11 +39,8 @@  void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,
     int ret;
 
     ret = mb_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);
-    if (unlikely(ret)) {
-        if (retaddr) {
-            /* now we have a real cpu fault */
-            cpu_restore_state(cs, retaddr);
-        }
+    if (unlikely(ret)) {/* now we have a real cpu fault */
+        cpu_restore_state(cs, retaddr);
         cpu_loop_exit(cs);
     }
 }
diff --git a/target/moxie/helper.c b/target/moxie/helper.c
index 330299f5a7..2ecee89f11 100644
--- a/target/moxie/helper.c
+++ b/target/moxie/helper.c
@@ -36,9 +36,7 @@  void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,
 
     ret = moxie_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);
     if (unlikely(ret)) {
-        if (retaddr) {
-            cpu_restore_state(cs, retaddr);
-        }
+        cpu_restore_state(cs, retaddr);
     }
     cpu_loop_exit(cs);
 }
diff --git a/target/nios2/mmu.c b/target/nios2/mmu.c
index fe9298af50..6d66a5702d 100644
--- a/target/nios2/mmu.c
+++ b/target/nios2/mmu.c
@@ -41,11 +41,8 @@  void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,
     int ret;
 
     ret = nios2_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);
-    if (unlikely(ret)) {
-        if (retaddr) {
-            /* now we have a real cpu fault */
-            cpu_restore_state(cs, retaddr);
-        }
+    if (unlikely(ret)) {/* now we have a real cpu fault */
+        cpu_restore_state(cs, retaddr);
         cpu_loop_exit(cs);
     }
 }
diff --git a/target/openrisc/mmu_helper.c b/target/openrisc/mmu_helper.c
index a44d0aa51a..47cd7775b6 100644
--- a/target/openrisc/mmu_helper.c
+++ b/target/openrisc/mmu_helper.c
@@ -32,11 +32,8 @@  void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,
 
     ret = openrisc_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);
 
-    if (ret) {
-        if (retaddr) {
-            /* now we have a real cpu fault.  */
-            cpu_restore_state(cs, retaddr);
-        }
+    if (ret) {/* now we have a real cpu fault.  */
+        cpu_restore_state(cs, retaddr);
         /* Raise Exception.  */
         cpu_loop_exit(cs);
     }
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
index e04b670663..8584ec43c1 100644
--- a/target/s390x/excp_helper.c
+++ b/target/s390x/excp_helper.c
@@ -554,9 +554,7 @@  void s390x_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
     S390CPU *cpu = S390_CPU(cs);
     CPUS390XState *env = &cpu->env;
 
-    if (retaddr) {
-        cpu_restore_state(cs, retaddr);
-    }
+    cpu_restore_state(cs, retaddr);
     program_interrupt(env, PGM_SPECIFICATION, ILEN_AUTO);
 }
 
diff --git a/target/tricore/op_helper.c b/target/tricore/op_helper.c
index 7af202c8c0..b0307de1ea 100644
--- a/target/tricore/op_helper.c
+++ b/target/tricore/op_helper.c
@@ -31,9 +31,7 @@  raise_exception_sync_internal(CPUTriCoreState *env, uint32_t class, int tin,
 {
     CPUState *cs = CPU(tricore_env_get_cpu(env));
     /* in case we come from a helper-call we need to restore the PC */
-    if (pc) {
-        cpu_restore_state(cs, pc);
-    }
+    cpu_restore_state(cs, pc);
 
     /* Tin is loaded into d[15] */
     env->gpr_d[15] = tin;
@@ -2804,11 +2802,8 @@  static inline void QEMU_NORETURN do_raise_exception_err(CPUTriCoreState *env,
     CPUState *cs = CPU(tricore_env_get_cpu(env));
     cs->exception_index = exception;
     env->error_code = error_code;
-
-    if (pc) {
-        /* now we have a real cpu fault */
-        cpu_restore_state(cs, pc);
-    }
+    /* now we have a real cpu fault */
+    cpu_restore_state(cs, pc);
 
     cpu_loop_exit(cs);
 }
diff --git a/target/unicore32/op_helper.c b/target/unicore32/op_helper.c
index 0872c29faa..5a826b0e31 100644
--- a/target/unicore32/op_helper.c
+++ b/target/unicore32/op_helper.c
@@ -250,11 +250,8 @@  void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,
     int ret;
 
     ret = uc32_cpu_handle_mmu_fault(cs, addr, access_type, mmu_idx);
-    if (unlikely(ret)) {
-        if (retaddr) {
-            /* now we have a real cpu fault */
-            cpu_restore_state(cs, retaddr);
-        }
+    if (unlikely(ret)) {/* now we have a real cpu fault */
+        cpu_restore_state(cs, retaddr);
         cpu_loop_exit(cs);
     }
 }