Commit 0b09be2b2fa08a572ff95fc264b1acfea19f6dab

Authored by blueswir1
1 parent b8aa4598

Nicer debug output for exceptions


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3878 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 104 additions and 4 deletions
target-sparc/op_helper.c
... ... @@ -1681,13 +1681,66 @@ void cpu_set_cwp(CPUState *env1, int new_cwp)
1681 1681 }
1682 1682  
1683 1683 #ifdef TARGET_SPARC64
  1684 +#ifdef DEBUG_PCALL
  1685 +static const char * const excp_names[0x50] = {
  1686 + [TT_TFAULT] = "Instruction Access Fault",
  1687 + [TT_TMISS] = "Instruction Access MMU Miss",
  1688 + [TT_CODE_ACCESS] = "Instruction Access Error",
  1689 + [TT_ILL_INSN] = "Illegal Instruction",
  1690 + [TT_PRIV_INSN] = "Privileged Instruction",
  1691 + [TT_NFPU_INSN] = "FPU Disabled",
  1692 + [TT_FP_EXCP] = "FPU Exception",
  1693 + [TT_TOVF] = "Tag Overflow",
  1694 + [TT_CLRWIN] = "Clean Windows",
  1695 + [TT_DIV_ZERO] = "Division By Zero",
  1696 + [TT_DFAULT] = "Data Access Fault",
  1697 + [TT_DMISS] = "Data Access MMU Miss",
  1698 + [TT_DATA_ACCESS] = "Data Access Error",
  1699 + [TT_DPROT] = "Data Protection Error",
  1700 + [TT_UNALIGNED] = "Unaligned Memory Access",
  1701 + [TT_PRIV_ACT] = "Privileged Action",
  1702 + [TT_EXTINT | 0x1] = "External Interrupt 1",
  1703 + [TT_EXTINT | 0x2] = "External Interrupt 2",
  1704 + [TT_EXTINT | 0x3] = "External Interrupt 3",
  1705 + [TT_EXTINT | 0x4] = "External Interrupt 4",
  1706 + [TT_EXTINT | 0x5] = "External Interrupt 5",
  1707 + [TT_EXTINT | 0x6] = "External Interrupt 6",
  1708 + [TT_EXTINT | 0x7] = "External Interrupt 7",
  1709 + [TT_EXTINT | 0x8] = "External Interrupt 8",
  1710 + [TT_EXTINT | 0x9] = "External Interrupt 9",
  1711 + [TT_EXTINT | 0xa] = "External Interrupt 10",
  1712 + [TT_EXTINT | 0xb] = "External Interrupt 11",
  1713 + [TT_EXTINT | 0xc] = "External Interrupt 12",
  1714 + [TT_EXTINT | 0xd] = "External Interrupt 13",
  1715 + [TT_EXTINT | 0xe] = "External Interrupt 14",
  1716 + [TT_EXTINT | 0xf] = "External Interrupt 15",
  1717 +};
  1718 +#endif
  1719 +
1684 1720 void do_interrupt(int intno)
1685 1721 {
1686 1722 #ifdef DEBUG_PCALL
1687 1723 if (loglevel & CPU_LOG_INT) {
1688 1724 static int count;
1689   - fprintf(logfile, "%6d: v=%04x pc=%016" PRIx64 " npc=%016" PRIx64 " SP=%016" PRIx64 "\n",
1690   - count, intno,
  1725 + const char *name;
  1726 +
  1727 + if (intno < 0 || intno >= 0x180 || (intno > 0x4f && intno < 0x80))
  1728 + name = "Unknown";
  1729 + else if (intno >= 0x100)
  1730 + name = "Trap Instruction";
  1731 + else if (intno >= 0xc0)
  1732 + name = "Window Fill";
  1733 + else if (intno >= 0x80)
  1734 + name = "Window Spill";
  1735 + else {
  1736 + name = excp_names[intno];
  1737 + if (!name)
  1738 + name = "Unknown";
  1739 + }
  1740 +
  1741 + fprintf(logfile, "%6d: %s (v=%04x) pc=%016" PRIx64 " npc=%016" PRIx64
  1742 + " SP=%016" PRIx64 "\n",
  1743 + count, name, intno,
1691 1744 env->pc,
1692 1745 env->npc, env->regwptr[6]);
1693 1746 cpu_dump_state(env, logfile, fprintf, 0);
... ... @@ -1740,6 +1793,41 @@ void do_interrupt(int intno)
1740 1793 env->exception_index = 0;
1741 1794 }
1742 1795 #else
  1796 +#ifdef DEBUG_PCALL
  1797 +static const char * const excp_names[0x80] = {
  1798 + [TT_TFAULT] = "Instruction Access Fault",
  1799 + [TT_ILL_INSN] = "Illegal Instruction",
  1800 + [TT_PRIV_INSN] = "Privileged Instruction",
  1801 + [TT_NFPU_INSN] = "FPU Disabled",
  1802 + [TT_WIN_OVF] = "Window Overflow",
  1803 + [TT_WIN_UNF] = "Window Underflow",
  1804 + [TT_UNALIGNED] = "Unaligned Memory Access",
  1805 + [TT_FP_EXCP] = "FPU Exception",
  1806 + [TT_DFAULT] = "Data Access Fault",
  1807 + [TT_TOVF] = "Tag Overflow",
  1808 + [TT_EXTINT | 0x1] = "External Interrupt 1",
  1809 + [TT_EXTINT | 0x2] = "External Interrupt 2",
  1810 + [TT_EXTINT | 0x3] = "External Interrupt 3",
  1811 + [TT_EXTINT | 0x4] = "External Interrupt 4",
  1812 + [TT_EXTINT | 0x5] = "External Interrupt 5",
  1813 + [TT_EXTINT | 0x6] = "External Interrupt 6",
  1814 + [TT_EXTINT | 0x7] = "External Interrupt 7",
  1815 + [TT_EXTINT | 0x8] = "External Interrupt 8",
  1816 + [TT_EXTINT | 0x9] = "External Interrupt 9",
  1817 + [TT_EXTINT | 0xa] = "External Interrupt 10",
  1818 + [TT_EXTINT | 0xb] = "External Interrupt 11",
  1819 + [TT_EXTINT | 0xc] = "External Interrupt 12",
  1820 + [TT_EXTINT | 0xd] = "External Interrupt 13",
  1821 + [TT_EXTINT | 0xe] = "External Interrupt 14",
  1822 + [TT_EXTINT | 0xf] = "External Interrupt 15",
  1823 + [TT_TOVF] = "Tag Overflow",
  1824 + [TT_CODE_ACCESS] = "Instruction Access Error",
  1825 + [TT_DATA_ACCESS] = "Data Access Error",
  1826 + [TT_DIV_ZERO] = "Division By Zero",
  1827 + [TT_NCP_INSN] = "Coprocessor Disabled",
  1828 +};
  1829 +#endif
  1830 +
1743 1831 void do_interrupt(int intno)
1744 1832 {
1745 1833 int cwp;
... ... @@ -1747,8 +1835,20 @@ void do_interrupt(int intno)
1747 1835 #ifdef DEBUG_PCALL
1748 1836 if (loglevel & CPU_LOG_INT) {
1749 1837 static int count;
1750   - fprintf(logfile, "%6d: v=%02x pc=%08x npc=%08x SP=%08x\n",
1751   - count, intno,
  1838 + const char *name;
  1839 +
  1840 + if (intno < 0 || intno >= 0x100)
  1841 + name = "Unknown";
  1842 + else if (intno >= 0x80)
  1843 + name = "Trap Instruction";
  1844 + else {
  1845 + name = excp_names[intno];
  1846 + if (!name)
  1847 + name = "Unknown";
  1848 + }
  1849 +
  1850 + fprintf(logfile, "%6d: %s (v=%02x) pc=%08x npc=%08x SP=%08x\n",
  1851 + count, name, intno,
1752 1852 env->pc,
1753 1853 env->npc, env->regwptr[6]);
1754 1854 cpu_dump_state(env, logfile, fprintf, 0);
... ...