1*6842bc34SLaurent Vivier /* 2*6842bc34SLaurent Vivier * processor control and status function 3*6842bc34SLaurent Vivier */ 4*6842bc34SLaurent Vivier 5*6842bc34SLaurent Vivier #include <libcflat.h> 6*6842bc34SLaurent Vivier #include <asm/processor.h> 7*6842bc34SLaurent Vivier #include <asm/ptrace.h> 8*6842bc34SLaurent Vivier 9*6842bc34SLaurent Vivier static struct { 10*6842bc34SLaurent Vivier void (*func)(struct pt_regs *, void *data); 11*6842bc34SLaurent Vivier void *data; 12*6842bc34SLaurent Vivier } handlers[16]; 13*6842bc34SLaurent Vivier 14*6842bc34SLaurent Vivier void handle_exception(int trap, void (*func)(struct pt_regs *, void *), 15*6842bc34SLaurent Vivier void * data) 16*6842bc34SLaurent Vivier { 17*6842bc34SLaurent Vivier trap >>= 8; 18*6842bc34SLaurent Vivier 19*6842bc34SLaurent Vivier if (trap < 16) { 20*6842bc34SLaurent Vivier handlers[trap].func = func; 21*6842bc34SLaurent Vivier handlers[trap].data = data; 22*6842bc34SLaurent Vivier } 23*6842bc34SLaurent Vivier } 24*6842bc34SLaurent Vivier 25*6842bc34SLaurent Vivier void do_handle_exception(struct pt_regs *regs) 26*6842bc34SLaurent Vivier { 27*6842bc34SLaurent Vivier unsigned char v; 28*6842bc34SLaurent Vivier 29*6842bc34SLaurent Vivier v = regs->trap >> 8; 30*6842bc34SLaurent Vivier 31*6842bc34SLaurent Vivier if (v < 16 && handlers[v].func) { 32*6842bc34SLaurent Vivier handlers[v].func(regs, handlers[v].data); 33*6842bc34SLaurent Vivier return; 34*6842bc34SLaurent Vivier } 35*6842bc34SLaurent Vivier 36*6842bc34SLaurent Vivier printf("unhandled cpu exception 0x%lx\n", regs->trap); 37*6842bc34SLaurent Vivier abort(); 38*6842bc34SLaurent Vivier } 39