1 | #include <libcpu/cpuIdent.h> |
---|
2 | #include <libcpu/raw_exception.h> |
---|
3 | |
---|
4 | #define MTIVOR(x, vec) asm volatile("mtivor"#x" %0"::"r"(vec)); |
---|
5 | |
---|
6 | /* Use during early init for initializing the e500 IVOR/IVPR registers */ |
---|
7 | void |
---|
8 | e500_setup_raw_exceptions() |
---|
9 | { |
---|
10 | unsigned c; |
---|
11 | if ( ! (c = ppc_cpu_is_bookE()) || PPC_BOOKE_405 == c ) |
---|
12 | return; |
---|
13 | asm volatile("mtivpr %0"::"r"(0)); |
---|
14 | /* setup vectors to be compatible with classic PPC */ |
---|
15 | MTIVOR(0, ppc_get_vector_addr(ASM_BOOKE_CRIT_VECTOR)); /* Critical input not (yet) supported; use reset vector */ |
---|
16 | MTIVOR(1, ppc_get_vector_addr(ASM_MACH_VECTOR)); |
---|
17 | MTIVOR(2, ppc_get_vector_addr(ASM_PROT_VECTOR)); |
---|
18 | MTIVOR(3, ppc_get_vector_addr(ASM_ISI_VECTOR)); |
---|
19 | MTIVOR(4, ppc_get_vector_addr(ASM_EXT_VECTOR)); |
---|
20 | MTIVOR(5, ppc_get_vector_addr(ASM_ALIGN_VECTOR)); |
---|
21 | MTIVOR(6, ppc_get_vector_addr(ASM_PROG_VECTOR)); |
---|
22 | MTIVOR(7, ppc_get_vector_addr(ASM_FLOAT_VECTOR)); |
---|
23 | MTIVOR(8, ppc_get_vector_addr(ASM_SYS_VECTOR)); |
---|
24 | MTIVOR(9, ppc_get_vector_addr(0x0b)); |
---|
25 | MTIVOR(10, ppc_get_vector_addr(ASM_DEC_VECTOR)); |
---|
26 | MTIVOR(11, ppc_get_vector_addr(ASM_BOOKE_PIT_VECTOR)); |
---|
27 | MTIVOR(12, ppc_get_vector_addr(ASM_BOOKE_WDOG_VECTOR)); |
---|
28 | MTIVOR(13, ppc_get_vector_addr(ASM_60X_DSMISS_VECTOR)); |
---|
29 | MTIVOR(14, ppc_get_vector_addr(ASM_60X_DLMISS_VECTOR)); |
---|
30 | MTIVOR(15, ppc_get_vector_addr(ASM_TRACE_VECTOR)); |
---|
31 | MTIVOR(32, ppc_get_vector_addr(ASM_60X_VEC_VECTOR)); |
---|
32 | MTIVOR(33, ppc_get_vector_addr(0x16)); |
---|
33 | MTIVOR(34, ppc_get_vector_addr(0x15)); |
---|
34 | MTIVOR(35, ppc_get_vector_addr(ASM_60X_PERFMON_VECTOR)); |
---|
35 | } |
---|