diff options
author | ths <ths@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-12-26 19:34:03 +0000 |
---|---|---|
committer | ths <ths@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-12-26 19:34:03 +0000 |
commit | 14e51cc7a42870f9e64084ee4f1a579ffea5788b (patch) | |
tree | 7c6509f37e3a5594645784f7ffbaab86118e3c17 /target-mips/helper.c | |
parent | 85016c983cc25b31b548fd2d146257756b3ac3d9 (diff) |
De-cruft exception definitions, and implement nicer debug output.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3861 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-mips/helper.c')
-rw-r--r-- | target-mips/helper.c | 64 |
1 files changed, 53 insertions, 11 deletions
diff --git a/target-mips/helper.c b/target-mips/helper.c index 3151e0ae96..a7252a07bc 100644 --- a/target-mips/helper.c +++ b/target-mips/helper.c @@ -318,20 +318,62 @@ int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw, return ret; } -#if defined(CONFIG_USER_ONLY) -void do_interrupt (CPUState *env) -{ - env->exception_index = EXCP_NONE; -} -#else +#if !defined(CONFIG_USER_ONLY) +static struct _excp_names { + int excp; + char *name; +} excp_names[EXCP_LAST + 1] = { + { EXCP_RESET, "reset" }, + { EXCP_SRESET, "soft reset" }, + { EXCP_DSS, "debug single step" }, + { EXCP_DINT, "debug interrupt" }, + { EXCP_NMI, "non-maskable interrupt" }, + { EXCP_MCHECK, "machine check" }, + { EXCP_EXT_INTERRUPT, "interrupt" }, + { EXCP_DFWATCH, "deferred watchpoint" }, + { EXCP_DIB, "debug instruction breakpoint" }, + { EXCP_IWATCH, "instruction fetch watchpoint" }, + { EXCP_AdEL, "address error load" }, + { EXCP_AdES, "address error store" }, + { EXCP_TLBF, "TLB refill" }, + { EXCP_IBE, "instruction bus error" }, + { EXCP_DBp, "debug breakpoint" }, + { EXCP_SYSCALL, "syscall" }, + { EXCP_BREAK, "break" }, + { EXCP_CpU, "coprocessor unusable" }, + { EXCP_RI, "reserved instruction" }, + { EXCP_OVERFLOW, "arithmetic overflow" }, + { EXCP_TRAP, "trap" }, + { EXCP_FPE, "floating point" }, + { EXCP_DDBS, "debug data break store" }, + { EXCP_DWATCH, "data watchpoint" }, + { EXCP_LTLBL, "TLB modify" }, + { EXCP_TLBL, "TLB load" }, + { EXCP_TLBS, "TLB store" }, + { EXCP_DBE, "data bus error" }, + { EXCP_DDBL, "debug data break load" }, + { EXCP_THREAD, "thread" }, + { EXCP_MDMX, "MDMX" }, + { EXCP_C2E, "precise coprocessor 2" }, + { EXCP_CACHE, "cache error" }, +}; +#endif + void do_interrupt (CPUState *env) { +#if !defined(CONFIG_USER_ONLY) target_ulong offset; int cause = -1; + char *name; if (logfile && env->exception_index != EXCP_EXT_INTERRUPT) { - fprintf(logfile, "%s enter: PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx " cause %d excp %d\n", - __func__, env->PC[env->current_tc], env->CP0_EPC, cause, env->exception_index); + if (env->exception_index < 0 || env->exception_index > EXCP_LAST) + name = "unknown"; + else + name = excp_names[env->exception_index].name; + + fprintf(logfile, "%s enter: PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx " %s exception\n", + __func__, env->PC[env->current_tc], env->CP0_EPC, name); } if (env->exception_index == EXCP_EXT_INTERRUPT && (env->hflags & MIPS_HFLAG_DM)) @@ -520,15 +562,15 @@ void do_interrupt (CPUState *env) exit(1); } if (logfile && env->exception_index != EXCP_EXT_INTERRUPT) { - fprintf(logfile, "%s: PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx " cause %d excp %d\n" + fprintf(logfile, "%s: PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx " cause %d\n" " S %08x C %08x A " TARGET_FMT_lx " D " TARGET_FMT_lx "\n", - __func__, env->PC[env->current_tc], env->CP0_EPC, cause, env->exception_index, + __func__, env->PC[env->current_tc], env->CP0_EPC, cause, env->CP0_Status, env->CP0_Cause, env->CP0_BadVAddr, env->CP0_DEPC); } +#endif /* !defined(CONFIG_USER_ONLY) */ env->exception_index = EXCP_NONE; } -#endif /* !defined(CONFIG_USER_ONLY) */ void r4k_invalidate_tlb (CPUState *env, int idx, int use_extra) { |