X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=exception.c;h=c1ccc9584bc0d40e27ed9343e49a7c51fe8fa59d;hb=19a85313de2d066eff09387bade41a016ad2a6a2;hp=44055f119c13c0c07fe151506582472676b9f86f;hpb=3169c95c4ddd84c74a397760d617e840530c13e0;p=ppcskel.git diff --git a/exception.c b/exception.c index 44055f1..c1ccc95 100644 --- a/exception.c +++ b/exception.c @@ -12,57 +12,50 @@ Copyright (C) 2008 Segher Boessenkool #include "string.h" #include "irq.h" +#include "hollywood.h" extern char exception_2200_start, exception_2200_end; void exception_handler(int exception) { - // check if the exception was actually an interrupt + u32 cookie = irq_kill(); + // check if the exception was actually an external interrupt if (exception == 0x500) { - u32 cookie; - - _CPU_ISR_Disable(cookie); - printf("\nInterrupt occured ;-) Which one? -> "); - u32 enabled = read32(BW_PI_IRQMASK); - u32 flags = read32(BW_PI_IRQFLAG); - flags = flags & enabled; - if (flags & (1<<1)) { // RESET - write32(BW_PI_IRQFLAG, 1<<1); - printf("RESET :)\n"); - } - if (flags & (1<<14)) { // Hollywood-PIC IRQ - write32(BW_PI_IRQFLAG, 1<<14); - write32(HW_PPCIRQFLAG, ~0); // dirty - printf("Hollywood-PIC :)\n"); - } - _CPU_ISR_Restore(cookie); + irq_handler(); + } - return; + // check if exception happened due to the decrementer + else if (exception == 0x900) { + //printf("\nDecrementer exception occured - who cares?\n"); } - u32 *x; - u32 i; + else { + u32 *x; + u32 i; - printf("\nException %04x occurred!\n", exception); + printf("\nException %04X occurred!\n", exception); - x = (u32 *)0x80002000; + x = (u32 *)0x80002000; - printf("\n R0..R7 R8..R15 R16..R23 R24..R31\n"); - for (i = 0; i < 8; i++) { - printf("%08x %08x %08x %08x\n", x[0], x[8], x[16], x[24]); - x++; - } - x = (u32 *)0x80002080; + printf("\n R0..R7 R8..R15 R16..R23 R24..R31\n"); + for (i = 0; i < 8; i++) { + printf("%08x %08x %08x %08x\n", x[0], x[8], x[16], x[24]); + x++; + } + x = (u32 *)0x80002080; + + printf("\n CR/XER LR/CTR SRR0/SRR1 DAR/DSISR\n"); + for (i = 0; i < 2; i++) { + printf("%08x %08x %08x %08x\n", x[0], x[2], x[4], x[6]); + x++; + } - printf("\n CR/XER LR/CTR SRR0/SRR1 DAR/DSISR\n"); - for (i = 0; i < 2; i++) { - printf("%08x %08x %08x %08x\n", x[0], x[2], x[4], x[6]); - x++; + // Hang. + for (;;) + ; } - // Hang. - for (;;) - ; + irq_restore(cookie); } void exception_init(void)