xref: /kvm-unit-tests/lib/powerpc/processor.c (revision 6842bc34fcfd218b2e937e421bd98b5cd56dd872)
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