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,40 +523,37 @@ enum { | ||
| 523 | EXCP_SRESET, | 523 | EXCP_SRESET, |
| 524 | EXCP_DSS, | 524 | EXCP_DSS, |
| 525 | EXCP_DINT, | 525 | EXCP_DINT, |
| 526 | + EXCP_DDBL, | ||
| 527 | + EXCP_DDBS, | ||
| 526 | EXCP_NMI, | 528 | EXCP_NMI, |
| 527 | EXCP_MCHECK, | 529 | EXCP_MCHECK, |
| 528 | - EXCP_EXT_INTERRUPT, | 530 | + EXCP_EXT_INTERRUPT, /* 8 */ |
| 529 | EXCP_DFWATCH, | 531 | EXCP_DFWATCH, |
| 530 | - EXCP_DIB, /* 8 */ | 532 | + EXCP_DIB, |
| 531 | EXCP_IWATCH, | 533 | EXCP_IWATCH, |
| 532 | EXCP_AdEL, | 534 | EXCP_AdEL, |
| 533 | EXCP_AdES, | 535 | EXCP_AdES, |
| 534 | EXCP_TLBF, | 536 | EXCP_TLBF, |
| 535 | EXCP_IBE, | 537 | EXCP_IBE, |
| 536 | - EXCP_DBp, | 538 | + EXCP_DBp, /* 16 */ |
| 537 | EXCP_SYSCALL, | 539 | EXCP_SYSCALL, |
| 538 | - EXCP_BREAK, /* 16 */ | 540 | + EXCP_BREAK, |
| 539 | EXCP_CpU, | 541 | EXCP_CpU, |
| 540 | EXCP_RI, | 542 | EXCP_RI, |
| 541 | EXCP_OVERFLOW, | 543 | EXCP_OVERFLOW, |
| 542 | EXCP_TRAP, | 544 | EXCP_TRAP, |
| 543 | EXCP_FPE, | 545 | EXCP_FPE, |
| 544 | - EXCP_DDBS, | ||
| 545 | - EXCP_DWATCH, | ||
| 546 | - EXCP_LAE, /* 24 */ | ||
| 547 | - EXCP_SAE, | 546 | + EXCP_DWATCH, /* 24 */ |
| 548 | EXCP_LTLBL, | 547 | EXCP_LTLBL, |
| 549 | EXCP_TLBL, | 548 | EXCP_TLBL, |
| 550 | EXCP_TLBS, | 549 | EXCP_TLBS, |
| 551 | EXCP_DBE, | 550 | EXCP_DBE, |
| 552 | - EXCP_DDBL, | ||
| 553 | EXCP_THREAD, | 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 | int cpu_mips_exec(CPUMIPSState *s); | 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,20 +318,62 @@ int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | ||
| 318 | return ret; | 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 | void do_interrupt (CPUState *env) | 362 | void do_interrupt (CPUState *env) |
| 328 | { | 363 | { |
| 364 | +#if !defined(CONFIG_USER_ONLY) | ||
| 329 | target_ulong offset; | 365 | target_ulong offset; |
| 330 | int cause = -1; | 366 | int cause = -1; |
| 367 | + char *name; | ||
| 331 | 368 | ||
| 332 | if (logfile && env->exception_index != EXCP_EXT_INTERRUPT) { | 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 | if (env->exception_index == EXCP_EXT_INTERRUPT && | 378 | if (env->exception_index == EXCP_EXT_INTERRUPT && |
| 337 | (env->hflags & MIPS_HFLAG_DM)) | 379 | (env->hflags & MIPS_HFLAG_DM)) |
| @@ -520,15 +562,15 @@ void do_interrupt (CPUState *env) | @@ -520,15 +562,15 @@ void do_interrupt (CPUState *env) | ||
| 520 | exit(1); | 562 | exit(1); |
| 521 | } | 563 | } |
| 522 | if (logfile && env->exception_index != EXCP_EXT_INTERRUPT) { | 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 | " S %08x C %08x A " TARGET_FMT_lx " D " TARGET_FMT_lx "\n", | 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 | env->CP0_Status, env->CP0_Cause, env->CP0_BadVAddr, | 568 | env->CP0_Status, env->CP0_Cause, env->CP0_BadVAddr, |
| 527 | env->CP0_DEPC); | 569 | env->CP0_DEPC); |
| 528 | } | 570 | } |
| 571 | +#endif /* !defined(CONFIG_USER_ONLY) */ | ||
| 529 | env->exception_index = EXCP_NONE; | 572 | env->exception_index = EXCP_NONE; |
| 530 | } | 573 | } |
| 531 | -#endif /* !defined(CONFIG_USER_ONLY) */ | ||
| 532 | 574 | ||
| 533 | void r4k_invalidate_tlb (CPUState *env, int idx, int use_extra) | 575 | void r4k_invalidate_tlb (CPUState *env, int idx, int use_extra) |
| 534 | { | 576 | { |