diff mbox

target-mips: save cpu state before calling MSA load and store helpers

Message ID 1426523374-18673-1-git-send-email-leon.alrae@imgtec.com
State New
Headers show

Commit Message

Leon Alrae March 16, 2015, 4:29 p.m. UTC
PC needs to be saved if an exception can be generated by an helper.
This fixes a problem related to resuming the execution at unexpected address
after an exception (caused by MSA load/store instruction) has been serviced.

Signed-off-by: Leon Alrae <leon.alrae@imgtec.com>
---
 target-mips/translate.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Richard Henderson March 30, 2015, 7:01 p.m. UTC | #1
On 03/16/2015 09:29 AM, Leon Alrae wrote:
> PC needs to be saved if an exception can be generated by an helper.
> This fixes a problem related to resuming the execution at unexpected address
> after an exception (caused by MSA load/store instruction) has been serviced.

Only if the helper doesn't use cpu_restore_state.

In this case, all of your do_##name memory routines should
instead use helper_[lb]e_*_mmu, which allows you to pass along
the mmu_idx (instead of switching on _kernel et al), and the
GETRA() value in the top-level helper.


r~
diff mbox

Patch

diff --git a/target-mips/translate.c b/target-mips/translate.c
index 9059bfd..7a8a00e 100644
--- a/target-mips/translate.c
+++ b/target-mips/translate.c
@@ -18403,12 +18403,14 @@  static void gen_msa(CPUMIPSState *env, DisasContext *ctx)
             case OPC_LD_H:
             case OPC_LD_W:
             case OPC_LD_D:
+                save_cpu_state(ctx, 1);
                 gen_helper_msa_ld_df(cpu_env, tdf, twd, trs, ts10);
                 break;
             case OPC_ST_B:
             case OPC_ST_H:
             case OPC_ST_W:
             case OPC_ST_D:
+                save_cpu_state(ctx, 1);
                 gen_helper_msa_st_df(cpu_env, tdf, twd, trs, ts10);
                 break;
             }