1
2 #ifndef _ASM_POWERPC_HEAD_64_H
3 #define _ASM_POWERPC_HEAD_64_H
4
5 #include <asm/cache.h>
6
7 #ifdef __ASSEMBLY__
8
9
10
11
12 .macro define_ftsec name
13 .section ".head.text.\name\()","ax",@progbits
14 .endm
15 .macro define_data_ftsec name
16 .section ".head.data.\name\()","a",@progbits
17 .endm
18 .macro use_ftsec name
19 .section ".head.text.\name\()"
20 .endm
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 #define OPEN_FIXED_SECTION(sname, start, end) \
61 sname##_start = (start); \
62 sname##_end = (end); \
63 sname##_len = (end) - (start); \
64 define_ftsec sname; \
65 . = 0x0; \
66 start_##sname:
67
68
69
70
71
72
73
74
75 #ifdef CONFIG_LD_HEAD_STUB_CATCH
76 #define OPEN_TEXT_SECTION(start) \
77 .section ".linker_stub_catch","ax",@progbits; \
78 linker_stub_catch: \
79 . = 0x4; \
80 text_start = (start) + 0x100; \
81 .section ".text","ax",@progbits; \
82 .balign 0x100; \
83 start_text:
84 #else
85 #define OPEN_TEXT_SECTION(start) \
86 text_start = (start); \
87 .section ".text","ax",@progbits; \
88 . = 0x0; \
89 start_text:
90 #endif
91
92 #define ZERO_FIXED_SECTION(sname, start, end) \
93 sname##_start = (start); \
94 sname##_end = (end); \
95 sname##_len = (end) - (start); \
96 define_data_ftsec sname; \
97 . = 0x0; \
98 . = sname##_len;
99
100 #define USE_FIXED_SECTION(sname) \
101 fs_label = start_##sname; \
102 fs_start = sname##_start; \
103 use_ftsec sname;
104
105 #define USE_TEXT_SECTION() \
106 fs_label = start_text; \
107 fs_start = text_start; \
108 .text
109
110 #define CLOSE_FIXED_SECTION(sname) \
111 USE_FIXED_SECTION(sname); \
112 . = sname##_len; \
113 end_##sname:
114
115
116 #define __FIXED_SECTION_ENTRY_BEGIN(sname, name, __align) \
117 USE_FIXED_SECTION(sname); \
118 .balign __align; \
119 .global name; \
120 name:
121
122 #define FIXED_SECTION_ENTRY_BEGIN(sname, name) \
123 __FIXED_SECTION_ENTRY_BEGIN(sname, name, IFETCH_ALIGN_BYTES)
124
125 #define FIXED_SECTION_ENTRY_BEGIN_LOCATION(sname, name, start, size) \
126 USE_FIXED_SECTION(sname); \
127 name##_start = (start); \
128 .if ((start) % (size) != 0); \
129 .error "Fixed section exception vector misalignment"; \
130 .endif; \
131 .if ((size) != 0x20) && ((size) != 0x80) && ((size) != 0x100); \
132 .error "Fixed section exception vector bad size"; \
133 .endif; \
134 .if (start) < sname##_start; \
135 .error "Fixed section underflow"; \
136 .abort; \
137 .endif; \
138 . = (start) - sname##_start; \
139 .global name; \
140 name:
141
142 #define FIXED_SECTION_ENTRY_END_LOCATION(sname, name, start, size) \
143 .if (start) + (size) > sname##_end; \
144 .error "Fixed section overflow"; \
145 .abort; \
146 .endif; \
147 .if (. - name > (start) + (size) - name##_start); \
148 .error "Fixed entry overflow"; \
149 .abort; \
150 .endif; \
151 . = ((start) + (size) - sname##_start); \
152
153
154
155
156
157
158
159
160
161
162
163
164 #define DEFINE_FIXED_SYMBOL(label) \
165 label##_absolute = (label - fs_label + fs_start)
166
167 #define FIXED_SYMBOL_ABS_ADDR(label) \
168 (label##_absolute)
169
170 #define ABS_ADDR(label) (label - fs_label + fs_start)
171
172 #endif
173
174 #endif