|
|||
Prex Home / Browse Source - Prex Version: 0.9.0 |
|||
root/bsp/hal/ppc/arch/trap.c/* [<][>][^][v][top][bottom][index][help] */DEFINITIONSThis source file includes following definitions.1 /*- 2 * Copyright (c) 2009, Kohsuke Ohtani 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of the author nor the names of any co-contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30 /* 31 * trap.c - called from the trap handler when a processor trap occurs. 32 */ 33 34 #include <kernel.h> 35 #include <task.h> 36 #include <hal.h> 37 #include <exception.h> 38 #include <cpu.h> 39 #include <trap.h> 40 #include <cpufunc.h> 41 #include <context.h> 42 #include <locore.h> 43 44 #include <sys/signal.h> 45 46 #ifdef DEBUG 47 /* 48 * Trap name. 49 */ 50 static const char *const trap_name[] = { 51 "", /* 0 */ 52 "System reset", /* 1 */ 53 "Machine check", /* 2 */ 54 "DSI", /* 3 */ 55 "ISI", /* 4 */ 56 "External interrupt", /* 5 */ 57 "Alignment", /* 6 */ 58 "Program", /* 7 */ 59 "Floating point unavailable", /* 8 */ 60 "Decrementer", /* 9 */ 61 "Reserved", /* a */ 62 "Reserved", /* b */ 63 "System call", /* c */ 64 "Trace", /* d */ 65 "Floating point assist", /* e */ 66 }; 67 #define MAXTRAP (sizeof(trap_name) / sizeof(void *) - 1) 68 #endif /* DEBUG */ 69 70 /* 71 * Exception mapping table. 72 * PPC exception is translated to the architecture 73 * independent exception code. 74 */ 75 static const int exception_map[] = { 76 SIGILL, 77 SIGILL, 78 SIGSEGV, /* machine check */ 79 SIGSEGV, /* address error (store) */ 80 SIGBUS, /* instruction bus error */ 81 SIGINT, /* external interrupt */ 82 SIGBUS, /* alingment */ 83 SIGTRAP, /* breakpoint trap */ 84 SIGFPE, /* fpu unavail */ 85 SIGALRM, /* decrementer */ 86 SIGILL, /* reserved */ 87 SIGILL, /* reserved */ 88 SIGCHLD, /* syscall */ 89 SIGTRAP, /* debug trap */ 90 SIGFPE, /* fp assist */ 91 }; 92 93 /* 94 * Trap handler 95 * Invoke the exception handler if it is needed. 96 */ 97 void 98 trap_handler(struct cpu_regs *regs) 99 { 100 uint32_t trap_no = regs->trap_no; 101 102 #ifdef DEBUG 103 printf("============================\n"); 104 printf("Trap %x: %s\n", trap_no, trap_name[trap_no]); 105 printf("============================\n"); 106 107 trap_dump(regs); 108 for (;;) ; 109 #endif 110 if ((regs->srr1 & MSR_PR) != MSR_PR) 111 panic("Kernel exception"); 112 113 exception_mark(exception_map[trap_no]); 114 exception_deliver(); 115 } 116 117 #ifdef DEBUG 118 void 119 trap_dump(struct cpu_regs *r) 120 { 121 122 printf("Trap frame %x\n", r); 123 printf(" r0 %08x r1 %08x r2 %08x r3 %08x r4 %08x r5 %08x\n", 124 r->gr[0], r->gr[1], r->gr[2], r->gr[3], r->gr[4], r->gr[5]); 125 printf(" r6 %08x r7 %08x r8 %08x r9 %08x r10 %08x r11 %08x\n", 126 r->gr[6], r->gr[7], r->gr[8], r->gr[9], r->gr[10], r->gr[11]); 127 printf(" r12 %08x r13 %08x r14 %08x r15 %08x r16 %08x r17 %08x\n", 128 r->gr[12], r->gr[13], r->gr[14], r->gr[15], r->gr[16], r->gr[17]); 129 printf(" r18 %08x r19 %08x r20 %08x r21 %08x r22 %08x r23 %08x\n", 130 r->gr[18], r->gr[19], r->gr[20], r->gr[21], r->gr[22], r->gr[23]); 131 printf(" r24 %08x r25 %08x r26 %08x r27 %08x r28 %08x r29 %08x\n", 132 r->gr[24], r->gr[25], r->gr[26], r->gr[27], r->gr[28], r->gr[29]); 133 printf(" r30 %08x r31 %08x lr %08x cr %08x xer %08x ctr %08x\n", 134 r->gr[30], r->gr[31], r->lr, r->cr, r->xer, r->ctr); 135 printf(" srr0 %08x srr1 %08x\n", r->srr0, r->srr1); 136 137 printf(" >> interrupt is %s\n", 138 (r->srr1 & MSR_EE) ? "enabled" : "disabled"); 139 140 printf(" >> task=%s\n", curtask->name); 141 } 142 #endif /* !DEBUG */ /* [<][>][^][v][top][bottom][index][help] */ | |||
Copyright© 2005-2009 Kohsuke Ohtani |