[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 13/35] target-alpha: Use do_restore_state for arithm
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH 13/35] target-alpha: Use do_restore_state for arithmetic exceptions. |
Date: |
Mon, 9 May 2011 14:34:27 -0700 |
This gets the PC right after an arithmetic exception. Also tidies
the code in the TLB fault handlers to use common code.
Signed-off-by: Richard Henderson <address@hidden>
---
target-alpha/op_helper.c | 49 ++++++++++++++++++++++++++++-----------------
1 files changed, 30 insertions(+), 19 deletions(-)
diff --git a/target-alpha/op_helper.c b/target-alpha/op_helper.c
index 672940e..fc5020a 100644
--- a/target-alpha/op_helper.c
+++ b/target-alpha/op_helper.c
@@ -25,20 +25,42 @@
/*****************************************************************************/
/* Exceptions processing helpers */
-void QEMU_NORETURN helper_excp (int excp, int error)
+
+/* This should only be called from translate, via gen_excp.
+ We expect that ENV->PC has already been updated. */
+void QEMU_NORETURN helper_excp(int excp, int error)
+{
+ env->exception_index = excp;
+ env->error_code = error;
+ cpu_loop_exit();
+}
+
+static void do_restore_state(void *retaddr)
+{
+ unsigned long pc = (unsigned long)retaddr;
+
+ if (pc) {
+ TranslationBlock *tb = tb_find_pc(pc);
+ if (tb) {
+ cpu_restore_state(tb, env, pc);
+ }
+ }
+}
+
+/* This may be called from any of the helpers to set up EXCEPTION_INDEX. */
+static void QEMU_NORETURN dynamic_excp(int excp, int error)
{
env->exception_index = excp;
env->error_code = error;
+ do_restore_state(GETPC());
cpu_loop_exit();
}
static void QEMU_NORETURN arith_excp(int exc, uint64_t mask)
{
- env->exception_index = EXCP_ARITH;
- env->error_code = 0;
env->trap_arg0 = exc;
env->trap_arg1 = mask;
- cpu_loop_exit();
+ dynamic_excp(EXCP_ARITH, 0);
}
uint64_t helper_load_pcc (void)
@@ -521,7 +543,7 @@ static inline float32 f_to_float32(uint64_t a)
if (unlikely(!exp && mant_sig)) {
/* Reserved operands / Dirty zero */
- helper_excp(EXCP_OPCDEC, 0);
+ dynamic_excp(EXCP_OPCDEC, 0);
}
if (exp < 3) {
@@ -651,7 +673,7 @@ static inline float64 g_to_float64(uint64_t a)
if (!exp && mant_sig) {
/* Reserved operands / Dirty zero */
- helper_excp(EXCP_OPCDEC, 0);
+ dynamic_excp(EXCP_OPCDEC, 0);
}
if (exp < 3) {
@@ -1260,9 +1282,7 @@ uint64_t helper_stq_c_phys(uint64_t p, uint64_t v)
/* XXX: fix it to restore all registers */
void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr)
{
- TranslationBlock *tb;
CPUState *saved_env;
- unsigned long pc;
int ret;
/* XXX: hack to restore env in all cases, even if not called from
@@ -1270,17 +1290,8 @@ void tlb_fill (target_ulong addr, int is_write, int
mmu_idx, void *retaddr)
saved_env = env;
env = cpu_single_env;
ret = cpu_alpha_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
- if (!likely(ret == 0)) {
- if (likely(retaddr)) {
- /* now we have a real cpu fault */
- pc = (unsigned long)retaddr;
- tb = tb_find_pc(pc);
- if (likely(tb)) {
- /* the PC is inside the translated code. It means that we have
- a virtual CPU fault */
- cpu_restore_state(tb, env, pc);
- }
- }
+ if (unlikely(ret != 0)) {
+ do_restore_state(retaddr);
/* Exception index and error code are already set */
cpu_loop_exit();
}
--
1.7.4.4
- [Qemu-devel] [PATCH 01/35] Export the unassigned_mem read/write functions., (continued)
- [Qemu-devel] [PATCH 01/35] Export the unassigned_mem read/write functions., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 02/35] target-alpha: Disassemble EV6 PALcode instructions., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 03/35] pci: Export pci_to_cpu_addr., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 04/35] target-alpha: Single-step properly across branches., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 06/35] target-alpha: Enable the alpha-softmmu target., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 07/35] target-alpha: Tidy exception constants., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 09/35] target-alpha: Cleanup MMU modes., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 11/35] target-alpha: Add IPRs to be used by the emulation PALcode., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 10/35] target-alpha: Fixup translation of PALmode instructions., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 12/35] target-alpha: Tidy up arithmetic exceptions., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 13/35] target-alpha: Use do_restore_state for arithmetic exceptions.,
Richard Henderson <=
- [Qemu-devel] [PATCH 05/35] target-alpha: Remove partial support for palcode emulation., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 14/35] target-alpha: Merge HW_REI and HW_RET implementations., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 08/35] target-alpha: Rationalize internal processor registers., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 15/35] target-alpha: Implement do_interrupt for system mode., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 16/35] target-alpha: Swap shadow registers moving to/from PALmode., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 17/35] target-alpha: Add various symbolic constants., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 18/35] target-alpha: Use kernel mmu_idx for pal_mode., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 20/35] target-alpha: Disable interrupts properly., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 21/35] target-alpha: Implement more CALL_PAL values inline., Richard Henderson, 2011/05/09
- [Qemu-devel] [PATCH 19/35] target-alpha: All ISA checks to use TB->FLAGS., Richard Henderson, 2011/05/09