Commit 8543e2cfce168af5499f27f322a3433888a62a18
1 parent
80be36b8
Improved ASI debugging (Robert Reif)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3868 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
58 additions
and
14 deletions
target-sparc/op_helper.c
... | ... | @@ -6,6 +6,7 @@ |
6 | 6 | //#define DEBUG_MXCC |
7 | 7 | //#define DEBUG_UNALIGNED |
8 | 8 | //#define DEBUG_UNASSIGNED |
9 | +//#define DEBUG_ASI | |
9 | 10 | |
10 | 11 | #ifdef DEBUG_MMU |
11 | 12 | #define DPRINTF_MMU(fmt, args...) \ |
... | ... | @@ -21,6 +22,13 @@ do { printf("MXCC: " fmt , ##args); } while (0) |
21 | 22 | #define DPRINTF_MXCC(fmt, args...) |
22 | 23 | #endif |
23 | 24 | |
25 | +#ifdef DEBUG_ASI | |
26 | +#define DPRINTF_ASI(fmt, args...) \ | |
27 | +do { printf("ASI: " fmt , ##args); } while (0) | |
28 | +#else | |
29 | +#define DPRINTF_ASI(fmt, args...) | |
30 | +#endif | |
31 | + | |
24 | 32 | void raise_exception(int tt) |
25 | 33 | { |
26 | 34 | env->exception_index = tt; |
... | ... | @@ -229,11 +237,34 @@ static void dump_mxcc(CPUState *env) |
229 | 237 | } |
230 | 238 | #endif |
231 | 239 | |
240 | +#ifdef DEBUG_ASI | |
241 | +static void dump_asi(const char * txt, uint32_t addr, int asi, int size, | |
242 | + uint32_t r1, uint32_t r2) | |
243 | +{ | |
244 | + switch (size) | |
245 | + { | |
246 | + case 1: | |
247 | + DPRINTF_ASI("%s %08x asi 0x%02x = %02x\n", txt, addr, asi, r1 & 0xff); | |
248 | + break; | |
249 | + case 2: | |
250 | + DPRINTF_ASI("%s %08x asi 0x%02x = %04x\n", txt, addr, asi, r1 & 0xffff); | |
251 | + break; | |
252 | + case 4: | |
253 | + DPRINTF_ASI("%s %08x asi 0x%02x = %08x\n", txt, addr, asi, r1); | |
254 | + break; | |
255 | + case 8: | |
256 | + DPRINTF_ASI("%s %08x asi 0x%02x = %016llx\n", txt, addr, asi, | |
257 | + r2 | ((uint64_t)r1 << 32)); | |
258 | + break; | |
259 | + } | |
260 | +} | |
261 | +#endif | |
262 | + | |
232 | 263 | void helper_ld_asi(int asi, int size, int sign) |
233 | 264 | { |
234 | 265 | uint32_t ret = 0; |
235 | 266 | uint64_t tmp; |
236 | -#ifdef DEBUG_MXCC | |
267 | +#if defined(DEBUG_MXCC) || defined(DEBUG_ASI) | |
237 | 268 | uint32_t last_T0 = T0; |
238 | 269 | #endif |
239 | 270 | |
... | ... | @@ -416,7 +447,7 @@ void helper_ld_asi(int asi, int size, int sign) |
416 | 447 | break; |
417 | 448 | case 0x21 ... 0x2d: /* MMU passthrough, unassigned */ |
418 | 449 | default: |
419 | - do_unassigned_access(T0, 0, 0, 1); | |
450 | + do_unassigned_access(T0, 0, 0, asi); | |
420 | 451 | ret = 0; |
421 | 452 | break; |
422 | 453 | } |
... | ... | @@ -435,6 +466,9 @@ void helper_ld_asi(int asi, int size, int sign) |
435 | 466 | } |
436 | 467 | else |
437 | 468 | T1 = ret; |
469 | +#ifdef DEBUG_ASI | |
470 | + dump_asi("read ", last_T0, asi, size, T1, T0); | |
471 | +#endif | |
438 | 472 | } |
439 | 473 | |
440 | 474 | void helper_st_asi(int asi, int size) |
... | ... | @@ -542,8 +576,8 @@ void helper_st_asi(int asi, int size) |
542 | 576 | #ifdef DEBUG_MMU |
543 | 577 | dump_mmu(env); |
544 | 578 | #endif |
545 | - return; | |
546 | 579 | } |
580 | + break; | |
547 | 581 | case 4: /* write MMU regs */ |
548 | 582 | { |
549 | 583 | int reg = (T0 >> 8) & 0x1f; |
... | ... | @@ -587,8 +621,8 @@ void helper_st_asi(int asi, int size) |
587 | 621 | #ifdef DEBUG_MMU |
588 | 622 | dump_mmu(env); |
589 | 623 | #endif |
590 | - return; | |
591 | 624 | } |
625 | + break; | |
592 | 626 | case 0xa: /* User data access */ |
593 | 627 | switch(size) { |
594 | 628 | case 1: |
... | ... | @@ -646,7 +680,7 @@ void helper_st_asi(int asi, int size) |
646 | 680 | stl_kernel(dst, temp); |
647 | 681 | } |
648 | 682 | } |
649 | - return; | |
683 | + break; | |
650 | 684 | case 0x1f: /* Block fill, stda access */ |
651 | 685 | { |
652 | 686 | // value (T1, T2) |
... | ... | @@ -661,7 +695,7 @@ void helper_st_asi(int asi, int size) |
661 | 695 | for (i = 0; i < 32; i += 8, dst += 8) |
662 | 696 | stq_kernel(dst, val); |
663 | 697 | } |
664 | - return; | |
698 | + break; | |
665 | 699 | case 0x20: /* MMU passthrough */ |
666 | 700 | { |
667 | 701 | switch(size) { |
... | ... | @@ -680,7 +714,7 @@ void helper_st_asi(int asi, int size) |
680 | 714 | break; |
681 | 715 | } |
682 | 716 | } |
683 | - return; | |
717 | + break; | |
684 | 718 | case 0x2e: /* MMU passthrough, 0xexxxxxxxx */ |
685 | 719 | case 0x2f: /* MMU passthrough, 0xfxxxxxxxx */ |
686 | 720 | { |
... | ... | @@ -705,7 +739,7 @@ void helper_st_asi(int asi, int size) |
705 | 739 | break; |
706 | 740 | } |
707 | 741 | } |
708 | - return; | |
742 | + break; | |
709 | 743 | case 0x30: /* store buffer tags */ |
710 | 744 | case 0x31: /* store buffer data or Ross RT620 I-cache flush */ |
711 | 745 | case 0x32: /* store buffer control */ |
... | ... | @@ -717,9 +751,12 @@ void helper_st_asi(int asi, int size) |
717 | 751 | case 9: /* Supervisor code access, XXX */ |
718 | 752 | case 0x21 ... 0x2d: /* MMU passthrough, unassigned */ |
719 | 753 | default: |
720 | - do_unassigned_access(T0, 1, 0, 1); | |
721 | - return; | |
754 | + do_unassigned_access(T0, 1, 0, asi); | |
755 | + break; | |
722 | 756 | } |
757 | +#ifdef DEBUG_ASI | |
758 | + dump_asi("write", T0, asi, size, T1, T2); | |
759 | +#endif | |
723 | 760 | } |
724 | 761 | |
725 | 762 | #endif /* CONFIG_USER_ONLY */ |
... | ... | @@ -1832,6 +1869,17 @@ void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec, |
1832 | 1869 | generated code */ |
1833 | 1870 | saved_env = env; |
1834 | 1871 | env = cpu_single_env; |
1872 | +#ifdef DEBUG_UNASSIGNED | |
1873 | + if (is_asi) | |
1874 | + printf("Unassigned mem %s access to " TARGET_FMT_plx " asi 0x%02x from " | |
1875 | + TARGET_FMT_lx "\n", | |
1876 | + is_exec ? "exec" : is_write ? "write" : "read", addr, is_asi, | |
1877 | + env->pc); | |
1878 | + else | |
1879 | + printf("Unassigned mem %s access to " TARGET_FMT_plx " from " | |
1880 | + TARGET_FMT_lx "\n", | |
1881 | + is_exec ? "exec" : is_write ? "write" : "read", addr, env->pc); | |
1882 | +#endif | |
1835 | 1883 | if (env->mmuregs[3]) /* Fault status register */ |
1836 | 1884 | env->mmuregs[3] = 1; /* overflow (not read before another fault) */ |
1837 | 1885 | if (is_asi) |
... | ... | @@ -1845,10 +1893,6 @@ void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec, |
1845 | 1893 | env->mmuregs[3] |= (5 << 2) | 2; |
1846 | 1894 | env->mmuregs[4] = addr; /* Fault address register */ |
1847 | 1895 | if ((env->mmuregs[0] & MMU_E) && !(env->mmuregs[0] & MMU_NF)) { |
1848 | -#ifdef DEBUG_UNASSIGNED | |
1849 | - printf("Unassigned mem access to " TARGET_FMT_plx " from " TARGET_FMT_lx | |
1850 | - "\n", addr, env->pc); | |
1851 | -#endif | |
1852 | 1896 | if (is_exec) |
1853 | 1897 | raise_exception(TT_CODE_ACCESS); |
1854 | 1898 | else | ... | ... |