[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 12/24] target-alpha: Implement do_interrupt for syst
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH 12/24] target-alpha: Implement do_interrupt for system mode. |
Date: |
Tue, 19 Apr 2011 08:04:49 -0700 |
Signed-off-by: Richard Henderson <address@hidden>
---
target-alpha/helper.c | 115 ++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 105 insertions(+), 10 deletions(-)
diff --git a/target-alpha/helper.c b/target-alpha/helper.c
index c5479fd..d5923e0 100644
--- a/target-alpha/helper.c
+++ b/target-alpha/helper.c
@@ -160,7 +160,6 @@ void cpu_alpha_store_fpcr (CPUState *env, uint64_t val)
}
#if defined(CONFIG_USER_ONLY)
-
int cpu_alpha_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
int mmu_idx, int is_softmmu)
{
@@ -168,14 +167,7 @@ int cpu_alpha_handle_mmu_fault (CPUState *env,
target_ulong address, int rw,
env->trap_arg0 = address;
return 1;
}
-
-void do_interrupt (CPUState *env)
-{
- env->exception_index = -1;
-}
-
#else
-
target_phys_addr_t cpu_get_phys_page_debug (CPUState *env, target_ulong addr)
{
return -1;
@@ -186,12 +178,115 @@ int cpu_alpha_handle_mmu_fault (CPUState *env,
target_ulong address, int rw,
{
return 0;
}
+#endif /* USER_ONLY */
void do_interrupt (CPUState *env)
{
- abort();
+ int i = env->exception_index;
+
+ if (qemu_loglevel_mask(CPU_LOG_INT)) {
+ static int count;
+ const char *name = "<unknown>";
+
+ switch (i) {
+ case EXCP_RESET:
+ name = "reset";
+ break;
+ case EXCP_MCHK:
+ name = "mchk";
+ break;
+ case EXCP_CLK_INTERRUPT:
+ name = "clk_interrupt";
+ break;
+ case EXCP_DEV_INTERRUPT:
+ name = "dev_interrupt";
+ break;
+ case EXCP_MMFAULT:
+ name = "mmfault";
+ break;
+ case EXCP_UNALIGN:
+ name = "unalign";
+ break;
+ case EXCP_OPCDEC:
+ name = "opcdec";
+ break;
+ case EXCP_ARITH:
+ name = "arith";
+ break;
+ case EXCP_FEN:
+ name = "fen";
+ break;
+ case EXCP_CALL_PAL:
+ name = "call_pal";
+ break;
+ case EXCP_STL_C:
+ name = "stl_c";
+ break;
+ case EXCP_STQ_C:
+ name = "stq_c";
+ break;
+ }
+ qemu_log("INT %6d: %s(%#x) pc=%016" PRIx64 " sp=%016" PRIx64 "\n",
+ ++count, name, env->error_code, env->pc, env->ir[IR_SP]);
+ }
+
+ env->exception_index = -1;
+
+#if !defined(CONFIG_USER_ONLY)
+ switch (i) {
+ case EXCP_RESET:
+ i = 0x0000;
+ break;
+ case EXCP_MCHK:
+ i = 0x0080;
+ break;
+ case EXCP_CLK_INTERRUPT:
+ i = 0x0100;
+ break;
+ case EXCP_DEV_INTERRUPT:
+ i = 0x0180;
+ break;
+ case EXCP_MMFAULT:
+ i = 0x0200;
+ break;
+ case EXCP_UNALIGN:
+ i = 0x0280;
+ break;
+ case EXCP_OPCDEC:
+ i = 0x0300;
+ break;
+ case EXCP_ARITH:
+ i = 0x0380;
+ break;
+ case EXCP_FEN:
+ i = 0x0400;
+ break;
+ case EXCP_CALL_PAL:
+ i = env->error_code;
+ /* There are 64 entry points for both privilaged and unprivlaged,
+ with bit 0x80 indicating unprivlaged. Each entry point gets
+ 64 bytes to do its job. */
+ if (i & 0x80) {
+ i = 0x2000 + (i - 0x80) * 64;
+ } else {
+ i = 0x1000 + i * 64;
+ }
+ break;
+ default:
+ cpu_abort(env, "Unhandled CPU exception");
+ }
+
+ /* Remember where the exception happened. Emulate real hardware in
+ that the low bit of the PC indicates PALmode. */
+ env->exc_addr = env->pc | env->pal_mode;
+
+ /* Continue execution at the PALcode entry point. */
+ env->pc = env->palbr + i;
+
+ /* Switch to PALmode. */
+ env->pal_mode = 1;
+#endif /* !USER_ONLY */
}
-#endif
void cpu_dump_state (CPUState *env, FILE *f, fprintf_function cpu_fprintf,
int flags)
--
1.7.3.4
- [Qemu-devel] [PATCH 09/24] target-alpha: Add IPRs to be used by the emulation PALcode., (continued)
- [Qemu-devel] [PATCH 09/24] target-alpha: Add IPRs to be used by the emulation PALcode., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 22/24] target-alpha: Implement TLB flush primitives., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 19/24] target-alpha: Implement cpu_alpha_handle_mmu_fault for system mode., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 05/24] target-alpha: Tidy exception constants., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 17/24] target-alpha: Implement more CALL_PAL values inline., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 11/24] target-alpha: Merge HW_REI and HW_RET implementations., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 24/24] target-alpha: Add SX164 emulation., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 15/24] target-alpha: All ISA checks to use TB->FLAGS., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 03/24] pci: Export pci_to_cpu_addr., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 14/24] target-alpha: Add various symbolic constants., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 12/24] target-alpha: Implement do_interrupt for system mode.,
Richard Henderson <=
- [Qemu-devel] [PATCH 01/24] Export the unassigned_mem read/write functions., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 23/24] target-alpha: Enable the alpha-softmmu target., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 16/24] target-alpha: Disable interrupts properly., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 08/24] target-alpha: Fixup translation of PALmode instructions., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 06/24] target-alpha: Rationalize internal processor registers., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 02/24] target-alpha: Disassemble EV6 PALcode instructions., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 13/24] target-alpha: Swap shadow registers moving to/from PALmode., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 04/24] target-alpha: Remove partial support for palcode emulation., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 18/24] target-alpha: Add custom PALcode image for SX164 emulation., Richard Henderson, 2011/04/19
- [Qemu-devel] [PATCH 20/24] target-alpha: Trap for unassigned and unaligned addresses., Richard Henderson, 2011/04/19