Nicer debug output for exceptions
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3878 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
		
							parent
							
								
									b8aa4598e2
								
							
						
					
					
						commit
						0b09be2b2f
					
				| 
						 | 
				
			
			@ -1681,13 +1681,66 @@ void cpu_set_cwp(CPUState *env1, int new_cwp)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
#ifdef TARGET_SPARC64
 | 
			
		||||
#ifdef DEBUG_PCALL
 | 
			
		||||
static const char * const excp_names[0x50] = {
 | 
			
		||||
    [TT_TFAULT] = "Instruction Access Fault",
 | 
			
		||||
    [TT_TMISS] = "Instruction Access MMU Miss",
 | 
			
		||||
    [TT_CODE_ACCESS] = "Instruction Access Error",
 | 
			
		||||
    [TT_ILL_INSN] = "Illegal Instruction",
 | 
			
		||||
    [TT_PRIV_INSN] = "Privileged Instruction",
 | 
			
		||||
    [TT_NFPU_INSN] = "FPU Disabled",
 | 
			
		||||
    [TT_FP_EXCP] = "FPU Exception",
 | 
			
		||||
    [TT_TOVF] = "Tag Overflow",
 | 
			
		||||
    [TT_CLRWIN] = "Clean Windows",
 | 
			
		||||
    [TT_DIV_ZERO] = "Division By Zero",
 | 
			
		||||
    [TT_DFAULT] = "Data Access Fault",
 | 
			
		||||
    [TT_DMISS] = "Data Access MMU Miss",
 | 
			
		||||
    [TT_DATA_ACCESS] = "Data Access Error",
 | 
			
		||||
    [TT_DPROT] = "Data Protection Error",
 | 
			
		||||
    [TT_UNALIGNED] = "Unaligned Memory Access",
 | 
			
		||||
    [TT_PRIV_ACT] = "Privileged Action",
 | 
			
		||||
    [TT_EXTINT | 0x1] = "External Interrupt 1",
 | 
			
		||||
    [TT_EXTINT | 0x2] = "External Interrupt 2",
 | 
			
		||||
    [TT_EXTINT | 0x3] = "External Interrupt 3",
 | 
			
		||||
    [TT_EXTINT | 0x4] = "External Interrupt 4",
 | 
			
		||||
    [TT_EXTINT | 0x5] = "External Interrupt 5",
 | 
			
		||||
    [TT_EXTINT | 0x6] = "External Interrupt 6",
 | 
			
		||||
    [TT_EXTINT | 0x7] = "External Interrupt 7",
 | 
			
		||||
    [TT_EXTINT | 0x8] = "External Interrupt 8",
 | 
			
		||||
    [TT_EXTINT | 0x9] = "External Interrupt 9",
 | 
			
		||||
    [TT_EXTINT | 0xa] = "External Interrupt 10",
 | 
			
		||||
    [TT_EXTINT | 0xb] = "External Interrupt 11",
 | 
			
		||||
    [TT_EXTINT | 0xc] = "External Interrupt 12",
 | 
			
		||||
    [TT_EXTINT | 0xd] = "External Interrupt 13",
 | 
			
		||||
    [TT_EXTINT | 0xe] = "External Interrupt 14",
 | 
			
		||||
    [TT_EXTINT | 0xf] = "External Interrupt 15",
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void do_interrupt(int intno)
 | 
			
		||||
{
 | 
			
		||||
#ifdef DEBUG_PCALL
 | 
			
		||||
    if (loglevel & CPU_LOG_INT) {
 | 
			
		||||
        static int count;
 | 
			
		||||
        fprintf(logfile, "%6d: v=%04x pc=%016" PRIx64 " npc=%016" PRIx64 " SP=%016" PRIx64 "\n",
 | 
			
		||||
                count, intno,
 | 
			
		||||
        const char *name;
 | 
			
		||||
 | 
			
		||||
        if (intno < 0 || intno >= 0x180 || (intno > 0x4f && intno < 0x80))
 | 
			
		||||
            name = "Unknown";
 | 
			
		||||
        else if (intno >= 0x100)
 | 
			
		||||
            name = "Trap Instruction";
 | 
			
		||||
        else if (intno >= 0xc0)
 | 
			
		||||
            name = "Window Fill";
 | 
			
		||||
        else if (intno >= 0x80)
 | 
			
		||||
            name = "Window Spill";
 | 
			
		||||
        else {
 | 
			
		||||
            name = excp_names[intno];
 | 
			
		||||
            if (!name)
 | 
			
		||||
                name = "Unknown";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fprintf(logfile, "%6d: %s (v=%04x) pc=%016" PRIx64 " npc=%016" PRIx64
 | 
			
		||||
                " SP=%016" PRIx64 "\n",
 | 
			
		||||
                count, name, intno,
 | 
			
		||||
                env->pc,
 | 
			
		||||
                env->npc, env->regwptr[6]);
 | 
			
		||||
        cpu_dump_state(env, logfile, fprintf, 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -1740,6 +1793,41 @@ void do_interrupt(int intno)
 | 
			
		|||
    env->exception_index = 0;
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
#ifdef DEBUG_PCALL
 | 
			
		||||
static const char * const excp_names[0x80] = {
 | 
			
		||||
    [TT_TFAULT] = "Instruction Access Fault",
 | 
			
		||||
    [TT_ILL_INSN] = "Illegal Instruction",
 | 
			
		||||
    [TT_PRIV_INSN] = "Privileged Instruction",
 | 
			
		||||
    [TT_NFPU_INSN] = "FPU Disabled",
 | 
			
		||||
    [TT_WIN_OVF] = "Window Overflow",
 | 
			
		||||
    [TT_WIN_UNF] = "Window Underflow",
 | 
			
		||||
    [TT_UNALIGNED] = "Unaligned Memory Access",
 | 
			
		||||
    [TT_FP_EXCP] = "FPU Exception",
 | 
			
		||||
    [TT_DFAULT] = "Data Access Fault",
 | 
			
		||||
    [TT_TOVF] = "Tag Overflow",
 | 
			
		||||
    [TT_EXTINT | 0x1] = "External Interrupt 1",
 | 
			
		||||
    [TT_EXTINT | 0x2] = "External Interrupt 2",
 | 
			
		||||
    [TT_EXTINT | 0x3] = "External Interrupt 3",
 | 
			
		||||
    [TT_EXTINT | 0x4] = "External Interrupt 4",
 | 
			
		||||
    [TT_EXTINT | 0x5] = "External Interrupt 5",
 | 
			
		||||
    [TT_EXTINT | 0x6] = "External Interrupt 6",
 | 
			
		||||
    [TT_EXTINT | 0x7] = "External Interrupt 7",
 | 
			
		||||
    [TT_EXTINT | 0x8] = "External Interrupt 8",
 | 
			
		||||
    [TT_EXTINT | 0x9] = "External Interrupt 9",
 | 
			
		||||
    [TT_EXTINT | 0xa] = "External Interrupt 10",
 | 
			
		||||
    [TT_EXTINT | 0xb] = "External Interrupt 11",
 | 
			
		||||
    [TT_EXTINT | 0xc] = "External Interrupt 12",
 | 
			
		||||
    [TT_EXTINT | 0xd] = "External Interrupt 13",
 | 
			
		||||
    [TT_EXTINT | 0xe] = "External Interrupt 14",
 | 
			
		||||
    [TT_EXTINT | 0xf] = "External Interrupt 15",
 | 
			
		||||
    [TT_TOVF] = "Tag Overflow",
 | 
			
		||||
    [TT_CODE_ACCESS] = "Instruction Access Error",
 | 
			
		||||
    [TT_DATA_ACCESS] = "Data Access Error",
 | 
			
		||||
    [TT_DIV_ZERO] = "Division By Zero",
 | 
			
		||||
    [TT_NCP_INSN] = "Coprocessor Disabled",
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void do_interrupt(int intno)
 | 
			
		||||
{
 | 
			
		||||
    int cwp;
 | 
			
		||||
| 
						 | 
				
			
			@ -1747,8 +1835,20 @@ void do_interrupt(int intno)
 | 
			
		|||
#ifdef DEBUG_PCALL
 | 
			
		||||
    if (loglevel & CPU_LOG_INT) {
 | 
			
		||||
        static int count;
 | 
			
		||||
        fprintf(logfile, "%6d: v=%02x pc=%08x npc=%08x SP=%08x\n",
 | 
			
		||||
                count, intno,
 | 
			
		||||
        const char *name;
 | 
			
		||||
 | 
			
		||||
        if (intno < 0 || intno >= 0x100)
 | 
			
		||||
            name = "Unknown";
 | 
			
		||||
        else if (intno >= 0x80)
 | 
			
		||||
            name = "Trap Instruction";
 | 
			
		||||
        else {
 | 
			
		||||
            name = excp_names[intno];
 | 
			
		||||
            if (!name)
 | 
			
		||||
                name = "Unknown";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fprintf(logfile, "%6d: %s (v=%02x) pc=%08x npc=%08x SP=%08x\n",
 | 
			
		||||
                count, name, intno,
 | 
			
		||||
                env->pc,
 | 
			
		||||
                env->npc, env->regwptr[6]);
 | 
			
		||||
        cpu_dump_state(env, logfile, fprintf, 0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue