Commit | Line | Data |
---|---|---|
da2bc464 ME |
1 | #ifndef _ASM_POWERPC_HEAD_64_H |
2 | #define _ASM_POWERPC_HEAD_64_H | |
3 | ||
4 | #include <asm/cache.h> | |
5 | ||
6 | #define EXC_REAL_BEGIN(name, start, end) \ | |
7 | . = start ; \ | |
8 | .global exc_real_##start##_##name ; \ | |
9 | exc_real_##start##_##name: | |
10 | ||
11 | #define EXC_REAL_END(name, start, end) | |
12 | ||
13 | #define EXC_VIRT_BEGIN(name, start, end) \ | |
14 | . = start ; \ | |
15 | .global exc_virt_##start##_##name ; \ | |
16 | exc_virt_##start##_##name: | |
17 | ||
18 | #define EXC_VIRT_END(name, start, end) | |
19 | ||
20 | #define EXC_COMMON_BEGIN(name) \ | |
be642c34 | 21 | .align 7; \ |
da2bc464 ME |
22 | .global name; \ |
23 | name: | |
24 | ||
25 | #define TRAMP_REAL_BEGIN(name) \ | |
26 | .global name ; \ | |
27 | name: | |
28 | ||
29 | #ifdef CONFIG_KVM_BOOK3S_64_HANDLER | |
30 | #define TRAMP_KVM_BEGIN(name) \ | |
31 | TRAMP_REAL_BEGIN(name) | |
32 | #else | |
33 | #define TRAMP_KVM_BEGIN(name) | |
34 | #endif | |
35 | ||
36 | #define EXC_REAL_NONE(start, end) | |
37 | ||
38 | #define EXC_VIRT_NONE(start, end) | |
39 | ||
40 | ||
41 | #define EXC_REAL(name, start, end) \ | |
42 | EXC_REAL_BEGIN(name, start, end); \ | |
43 | STD_EXCEPTION_PSERIES(start, name##_common); \ | |
44 | EXC_REAL_END(name, start, end); | |
45 | ||
46 | #define EXC_VIRT(name, start, end, realvec) \ | |
47 | EXC_VIRT_BEGIN(name, start, end); \ | |
48 | STD_RELON_EXCEPTION_PSERIES(start, realvec, name##_common); \ | |
49 | EXC_VIRT_END(name, start, end); | |
50 | ||
51 | #define EXC_REAL_MASKABLE(name, start, end) \ | |
52 | EXC_REAL_BEGIN(name, start, end); \ | |
53 | MASKABLE_EXCEPTION_PSERIES(start, start, name##_common); \ | |
54 | EXC_REAL_END(name, start, end); | |
55 | ||
56 | #define EXC_VIRT_MASKABLE(name, start, end, realvec) \ | |
57 | EXC_VIRT_BEGIN(name, start, end); \ | |
58 | MASKABLE_RELON_EXCEPTION_PSERIES(start, realvec, name##_common); \ | |
59 | EXC_VIRT_END(name, start, end); | |
60 | ||
61 | #define EXC_REAL_HV(name, start, end) \ | |
62 | EXC_REAL_BEGIN(name, start, end); \ | |
63 | STD_EXCEPTION_HV(start, start, name##_common); \ | |
64 | EXC_REAL_END(name, start, end); | |
65 | ||
66 | #define EXC_VIRT_HV(name, start, end, realvec) \ | |
67 | EXC_VIRT_BEGIN(name, start, end); \ | |
68 | STD_RELON_EXCEPTION_HV(start, realvec, name##_common); \ | |
69 | EXC_VIRT_END(name, start, end); | |
70 | ||
71 | #define __EXC_REAL_OOL(name, start, end) \ | |
72 | EXC_REAL_BEGIN(name, start, end); \ | |
73 | __OOL_EXCEPTION(start, label, tramp_real_##name); \ | |
74 | EXC_REAL_END(name, start, end); | |
75 | ||
76 | #define __TRAMP_REAL_REAL_OOL(name, vec) \ | |
77 | TRAMP_REAL_BEGIN(tramp_real_##name); \ | |
78 | STD_EXCEPTION_PSERIES_OOL(vec, name##_common); \ | |
79 | ||
80 | #define __EXC_REAL_OOL_MASKABLE(name, start, end) \ | |
81 | __EXC_REAL_OOL(name, start, end); | |
82 | ||
83 | #define __TRAMP_REAL_REAL_OOL_MASKABLE(name, vec) \ | |
84 | TRAMP_REAL_BEGIN(tramp_real_##name); \ | |
85 | MASKABLE_EXCEPTION_PSERIES_OOL(vec, name##_common); \ | |
86 | ||
87 | #define __EXC_REAL_OOL_HV_DIRECT(name, start, end, handler) \ | |
88 | EXC_REAL_BEGIN(name, start, end); \ | |
89 | __OOL_EXCEPTION(start, label, handler); \ | |
90 | EXC_REAL_END(name, start, end); | |
91 | ||
92 | #define __EXC_REAL_OOL_HV(name, start, end) \ | |
93 | __EXC_REAL_OOL(name, start, end); | |
94 | ||
95 | #define __TRAMP_REAL_REAL_OOL_HV(name, vec) \ | |
96 | TRAMP_REAL_BEGIN(tramp_real_##name); \ | |
97 | STD_EXCEPTION_HV_OOL(vec, name##_common); \ | |
98 | ||
99 | #define __EXC_REAL_OOL_MASKABLE_HV(name, start, end) \ | |
100 | __EXC_REAL_OOL(name, start, end); | |
101 | ||
102 | #define __TRAMP_REAL_REAL_OOL_MASKABLE_HV(name, vec) \ | |
103 | TRAMP_REAL_BEGIN(tramp_real_##name); \ | |
104 | MASKABLE_EXCEPTION_HV_OOL(vec, name##_common); \ | |
105 | ||
106 | #define __EXC_VIRT_OOL(name, start, end) \ | |
107 | EXC_VIRT_BEGIN(name, start, end); \ | |
108 | __OOL_EXCEPTION(start, label, tramp_virt_##name); \ | |
109 | EXC_VIRT_END(name, start, end); | |
110 | ||
111 | #define __TRAMP_REAL_VIRT_OOL(name, realvec) \ | |
112 | TRAMP_REAL_BEGIN(tramp_virt_##name); \ | |
113 | STD_RELON_EXCEPTION_PSERIES_OOL(realvec, name##_common); \ | |
114 | ||
115 | #define __EXC_VIRT_OOL_MASKABLE(name, start, end) \ | |
116 | __EXC_VIRT_OOL(name, start, end); | |
117 | ||
118 | #define __TRAMP_REAL_VIRT_OOL_MASKABLE(name, realvec) \ | |
119 | TRAMP_REAL_BEGIN(tramp_virt_##name); \ | |
120 | MASKABLE_RELON_EXCEPTION_PSERIES_OOL(realvec, name##_common); \ | |
121 | ||
122 | #define __EXC_VIRT_OOL_HV(name, start, end) \ | |
123 | __EXC_VIRT_OOL(name, start, end); | |
124 | ||
125 | #define __TRAMP_REAL_VIRT_OOL_HV(name, realvec) \ | |
126 | TRAMP_REAL_BEGIN(tramp_virt_##name); \ | |
127 | STD_RELON_EXCEPTION_HV_OOL(realvec, name##_common); \ | |
128 | ||
129 | #define __EXC_VIRT_OOL_MASKABLE_HV(name, start, end) \ | |
130 | __EXC_VIRT_OOL(name, start, end); | |
131 | ||
132 | #define __TRAMP_REAL_VIRT_OOL_MASKABLE_HV(name, realvec) \ | |
133 | TRAMP_REAL_BEGIN(tramp_virt_##name); \ | |
134 | MASKABLE_RELON_EXCEPTION_HV_OOL(realvec, name##_common); \ | |
135 | ||
136 | #define TRAMP_KVM(area, n) \ | |
137 | TRAMP_KVM_BEGIN(do_kvm_##n); \ | |
138 | KVM_HANDLER(area, EXC_STD, n); \ | |
139 | ||
140 | #define TRAMP_KVM_SKIP(area, n) \ | |
141 | TRAMP_KVM_BEGIN(do_kvm_##n); \ | |
142 | KVM_HANDLER_SKIP(area, EXC_STD, n); \ | |
143 | ||
144 | #define TRAMP_KVM_HV(area, n) \ | |
145 | TRAMP_KVM_BEGIN(do_kvm_H##n); \ | |
146 | KVM_HANDLER(area, EXC_HV, n + 0x2); \ | |
147 | ||
148 | #define TRAMP_KVM_HV_SKIP(area, n) \ | |
149 | TRAMP_KVM_BEGIN(do_kvm_H##n); \ | |
150 | KVM_HANDLER_SKIP(area, EXC_HV, n + 0x2); \ | |
151 | ||
152 | #define EXC_COMMON(name, realvec, hdlr) \ | |
153 | EXC_COMMON_BEGIN(name); \ | |
154 | STD_EXCEPTION_COMMON(realvec, name, hdlr); \ | |
155 | ||
156 | #define EXC_COMMON_ASYNC(name, realvec, hdlr) \ | |
157 | EXC_COMMON_BEGIN(name); \ | |
158 | STD_EXCEPTION_COMMON_ASYNC(realvec, name, hdlr); \ | |
159 | ||
160 | #define EXC_COMMON_HV(name, realvec, hdlr) \ | |
161 | EXC_COMMON_BEGIN(name); \ | |
162 | STD_EXCEPTION_COMMON(realvec + 0x2, name, hdlr); \ | |
163 | ||
164 | #endif /* _ASM_POWERPC_HEAD_64_H */ |