[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH 01/10] target/ppc: Fix nip on power management instruc
From: |
Cédric Le Goater |
Subject: |
[Qemu-ppc] [PATCH 01/10] target/ppc: Fix nip on power management instructions |
Date: |
Fri, 15 Feb 2019 17:16:39 +0100 |
From: Benjamin Herrenschmidt <address@hidden>
Those instructions currently raise an exception from within
the helper. This tends to result in a bogus nip value in
the env context (typically the beginning of the TB). Such
a helper needs a gen_update_nip() first.
This fixes it with a different approach which is to throw the
exception from translate.c instead of the helper using
gen_exception_nip() which does the right thing. Exception
EXCP_HLT is also used instead of POWERPC_EXCP_STOP to effectively
exit from the CPU execution loop.
Signed-off-by: Benjamin Herrenschmidt <address@hidden>
[clg : modified the commit log to comment the use of EXCP_HLT instead
of POWERPC_EXCP_STOP]
Signed-off-by: Cédric Le Goater <address@hidden>
---
target/ppc/excp_helper.c | 1 -
target/ppc/translate.c | 12 ++++++++----
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c
index 751d759fcc1d..8407e0ade938 100644
--- a/target/ppc/excp_helper.c
+++ b/target/ppc/excp_helper.c
@@ -958,7 +958,6 @@ void helper_pminsn(CPUPPCState *env, powerpc_pm_insn_t insn)
* but this doesn't seem to be a problem.
*/
env->msr |= (1ull << MSR_EE);
- raise_exception(env, EXCP_HLT);
}
#endif /* defined(TARGET_PPC64) */
diff --git a/target/ppc/translate.c b/target/ppc/translate.c
index d5f29d3536e1..e94422f7ff1c 100644
--- a/target/ppc/translate.c
+++ b/target/ppc/translate.c
@@ -3565,7 +3565,8 @@ static void gen_doze(DisasContext *ctx)
t = tcg_const_i32(PPC_PM_DOZE);
gen_helper_pminsn(cpu_env, t);
tcg_temp_free_i32(t);
- gen_stop_exception(ctx);
+ /* Stop translation, as the CPU is supposed to sleep from now */
+ gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next);
#endif /* defined(CONFIG_USER_ONLY) */
}
@@ -3580,7 +3581,8 @@ static void gen_nap(DisasContext *ctx)
t = tcg_const_i32(PPC_PM_NAP);
gen_helper_pminsn(cpu_env, t);
tcg_temp_free_i32(t);
- gen_stop_exception(ctx);
+ /* Stop translation, as the CPU is supposed to sleep from now */
+ gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next);
#endif /* defined(CONFIG_USER_ONLY) */
}
@@ -3600,7 +3602,8 @@ static void gen_sleep(DisasContext *ctx)
t = tcg_const_i32(PPC_PM_SLEEP);
gen_helper_pminsn(cpu_env, t);
tcg_temp_free_i32(t);
- gen_stop_exception(ctx);
+ /* Stop translation, as the CPU is supposed to sleep from now */
+ gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next);
#endif /* defined(CONFIG_USER_ONLY) */
}
@@ -3615,7 +3618,8 @@ static void gen_rvwinkle(DisasContext *ctx)
t = tcg_const_i32(PPC_PM_RVWINKLE);
gen_helper_pminsn(cpu_env, t);
tcg_temp_free_i32(t);
- gen_stop_exception(ctx);
+ /* Stop translation, as the CPU is supposed to sleep from now */
+ gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next);
#endif /* defined(CONFIG_USER_ONLY) */
}
#endif /* #if defined(TARGET_PPC64) */
--
2.20.1
- [Qemu-ppc] [PATCH 00/10] ppc: Add Hypervisor Virtualization Interrupt on POWER9, Cédric Le Goater, 2019/02/15
- [Qemu-ppc] [PATCH 01/10] target/ppc: Fix nip on power management instructions,
Cédric Le Goater <=
- [Qemu-ppc] [PATCH 08/10] target/ppc: Add Hypervisor Virtualization Interrupt on POWER9, Cédric Le Goater, 2019/02/15
- [Qemu-ppc] [PATCH 07/10] target/ppc: Detect erroneous condition in interrupt delivery, Cédric Le Goater, 2019/02/15
- [Qemu-ppc] [PATCH 02/10] target/ppc: Don't clobber MSR:EE on PM instructions, Cédric Le Goater, 2019/02/15
- [Qemu-ppc] [PATCH 10/10] target/ppc: Add support for LPCR:HEIC on POWER9, Cédric Le Goater, 2019/02/15
- [Qemu-ppc] [PATCH 06/10] target/ppc: Add POWER9 exception model, Cédric Le Goater, 2019/02/15
- [Qemu-ppc] [PATCH 09/10] target/ppc: Add POWER9 external interrupt model, Cédric Le Goater, 2019/02/15
- [Qemu-ppc] [PATCH 04/10] target/ppc: Move "wakeup reset" code to a separate function, Cédric Le Goater, 2019/02/15
- [Qemu-ppc] [PATCH 05/10] target/ppc: Rename "in_pm_state" to "resume_as_sreset", Cédric Le Goater, 2019/02/15
- [Qemu-ppc] [PATCH 03/10] target/ppc: Fix support for "STOP light" states on POWER9, Cédric Le Goater, 2019/02/15
- Re: [Qemu-ppc] [PATCH 00/10] ppc: Add Hypervisor Virtualization Interrupt on POWER9, David Gibson, 2019/02/18