powerpc/64: Change the way relocation copy is calculated
[linux-2.6-block.git] / arch / powerpc / include / asm / head-64.h
CommitLineData
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 ; \
9exc_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 ; \
16exc_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; \
23name:
24
25#define TRAMP_REAL_BEGIN(name) \
26 .global name ; \
27name:
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 */