Commit 14e51cc7a42870f9e64084ee4f1a579ffea5788b
1 parent
85016c98
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
Showing
2 changed files
with
65 additions
and
26 deletions
target-mips/cpu.h
... | ... | @@ -523,40 +523,37 @@ enum { |
523 | 523 | EXCP_SRESET, |
524 | 524 | EXCP_DSS, |
525 | 525 | EXCP_DINT, |
526 | + EXCP_DDBL, | |
527 | + EXCP_DDBS, | |
526 | 528 | EXCP_NMI, |
527 | 529 | EXCP_MCHECK, |
528 | - EXCP_EXT_INTERRUPT, | |
530 | + EXCP_EXT_INTERRUPT, /* 8 */ | |
529 | 531 | EXCP_DFWATCH, |
530 | - EXCP_DIB, /* 8 */ | |
532 | + EXCP_DIB, | |
531 | 533 | EXCP_IWATCH, |
532 | 534 | EXCP_AdEL, |
533 | 535 | EXCP_AdES, |
534 | 536 | EXCP_TLBF, |
535 | 537 | EXCP_IBE, |
536 | - EXCP_DBp, | |
538 | + EXCP_DBp, /* 16 */ | |
537 | 539 | EXCP_SYSCALL, |
538 | - EXCP_BREAK, /* 16 */ | |
540 | + EXCP_BREAK, | |
539 | 541 | EXCP_CpU, |
540 | 542 | EXCP_RI, |
541 | 543 | EXCP_OVERFLOW, |
542 | 544 | EXCP_TRAP, |
543 | 545 | EXCP_FPE, |
544 | - EXCP_DDBS, | |
545 | - EXCP_DWATCH, | |
546 | - EXCP_LAE, /* 24 */ | |
547 | - EXCP_SAE, | |
546 | + EXCP_DWATCH, /* 24 */ | |
548 | 547 | EXCP_LTLBL, |
549 | 548 | EXCP_TLBL, |
550 | 549 | EXCP_TLBS, |
551 | 550 | EXCP_DBE, |
552 | - EXCP_DDBL, | |
553 | 551 | EXCP_THREAD, |
554 | - EXCP_MTCP0 = 0x104, /* mtmsr instruction: */ | |
555 | - /* may change privilege level */ | |
556 | - EXCP_BRANCH = 0x108, /* branch instruction */ | |
557 | - EXCP_ERET = 0x10C, /* return from interrupt */ | |
558 | - EXCP_SYSCALL_USER = 0x110, /* System call in user mode only */ | |
559 | - EXCP_FLUSH = 0x109, | |
552 | + EXCP_MDMX, | |
553 | + EXCP_C2E, | |
554 | + EXCP_CACHE, /* 32 */ | |
555 | + | |
556 | + EXCP_LAST = EXCP_CACHE, | |
560 | 557 | }; |
561 | 558 | |
562 | 559 | int cpu_mips_exec(CPUMIPSState *s); | ... | ... |
target-mips/helper.c
... | ... | @@ -318,20 +318,62 @@ int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw, |
318 | 318 | return ret; |
319 | 319 | } |
320 | 320 | |
321 | -#if defined(CONFIG_USER_ONLY) | |
322 | -void do_interrupt (CPUState *env) | |
323 | -{ | |
324 | - env->exception_index = EXCP_NONE; | |
325 | -} | |
326 | -#else | |
321 | +#if !defined(CONFIG_USER_ONLY) | |
322 | +static struct _excp_names { | |
323 | + int excp; | |
324 | + char *name; | |
325 | +} excp_names[EXCP_LAST + 1] = { | |
326 | + { EXCP_RESET, "reset" }, | |
327 | + { EXCP_SRESET, "soft reset" }, | |
328 | + { EXCP_DSS, "debug single step" }, | |
329 | + { EXCP_DINT, "debug interrupt" }, | |
330 | + { EXCP_NMI, "non-maskable interrupt" }, | |
331 | + { EXCP_MCHECK, "machine check" }, | |
332 | + { EXCP_EXT_INTERRUPT, "interrupt" }, | |
333 | + { EXCP_DFWATCH, "deferred watchpoint" }, | |
334 | + { EXCP_DIB, "debug instruction breakpoint" }, | |
335 | + { EXCP_IWATCH, "instruction fetch watchpoint" }, | |
336 | + { EXCP_AdEL, "address error load" }, | |
337 | + { EXCP_AdES, "address error store" }, | |
338 | + { EXCP_TLBF, "TLB refill" }, | |
339 | + { EXCP_IBE, "instruction bus error" }, | |
340 | + { EXCP_DBp, "debug breakpoint" }, | |
341 | + { EXCP_SYSCALL, "syscall" }, | |
342 | + { EXCP_BREAK, "break" }, | |
343 | + { EXCP_CpU, "coprocessor unusable" }, | |
344 | + { EXCP_RI, "reserved instruction" }, | |
345 | + { EXCP_OVERFLOW, "arithmetic overflow" }, | |
346 | + { EXCP_TRAP, "trap" }, | |
347 | + { EXCP_FPE, "floating point" }, | |
348 | + { EXCP_DDBS, "debug data break store" }, | |
349 | + { EXCP_DWATCH, "data watchpoint" }, | |
350 | + { EXCP_LTLBL, "TLB modify" }, | |
351 | + { EXCP_TLBL, "TLB load" }, | |
352 | + { EXCP_TLBS, "TLB store" }, | |
353 | + { EXCP_DBE, "data bus error" }, | |
354 | + { EXCP_DDBL, "debug data break load" }, | |
355 | + { EXCP_THREAD, "thread" }, | |
356 | + { EXCP_MDMX, "MDMX" }, | |
357 | + { EXCP_C2E, "precise coprocessor 2" }, | |
358 | + { EXCP_CACHE, "cache error" }, | |
359 | +}; | |
360 | +#endif | |
361 | + | |
327 | 362 | void do_interrupt (CPUState *env) |
328 | 363 | { |
364 | +#if !defined(CONFIG_USER_ONLY) | |
329 | 365 | target_ulong offset; |
330 | 366 | int cause = -1; |
367 | + char *name; | |
331 | 368 | |
332 | 369 | if (logfile && env->exception_index != EXCP_EXT_INTERRUPT) { |
333 | - fprintf(logfile, "%s enter: PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx " cause %d excp %d\n", | |
334 | - __func__, env->PC[env->current_tc], env->CP0_EPC, cause, env->exception_index); | |
370 | + if (env->exception_index < 0 || env->exception_index > EXCP_LAST) | |
371 | + name = "unknown"; | |
372 | + else | |
373 | + name = excp_names[env->exception_index].name; | |
374 | + | |
375 | + fprintf(logfile, "%s enter: PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx " %s exception\n", | |
376 | + __func__, env->PC[env->current_tc], env->CP0_EPC, name); | |
335 | 377 | } |
336 | 378 | if (env->exception_index == EXCP_EXT_INTERRUPT && |
337 | 379 | (env->hflags & MIPS_HFLAG_DM)) |
... | ... | @@ -520,15 +562,15 @@ void do_interrupt (CPUState *env) |
520 | 562 | exit(1); |
521 | 563 | } |
522 | 564 | if (logfile && env->exception_index != EXCP_EXT_INTERRUPT) { |
523 | - fprintf(logfile, "%s: PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx " cause %d excp %d\n" | |
565 | + fprintf(logfile, "%s: PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx " cause %d\n" | |
524 | 566 | " S %08x C %08x A " TARGET_FMT_lx " D " TARGET_FMT_lx "\n", |
525 | - __func__, env->PC[env->current_tc], env->CP0_EPC, cause, env->exception_index, | |
567 | + __func__, env->PC[env->current_tc], env->CP0_EPC, cause, | |
526 | 568 | env->CP0_Status, env->CP0_Cause, env->CP0_BadVAddr, |
527 | 569 | env->CP0_DEPC); |
528 | 570 | } |
571 | +#endif /* !defined(CONFIG_USER_ONLY) */ | |
529 | 572 | env->exception_index = EXCP_NONE; |
530 | 573 | } |
531 | -#endif /* !defined(CONFIG_USER_ONLY) */ | |
532 | 574 | |
533 | 575 | void r4k_invalidate_tlb (CPUState *env, int idx, int use_extra) |
534 | 576 | { | ... | ... |