0001
0002 #ifndef _ASM_POWERPC_HEAD_64_H
0003 #define _ASM_POWERPC_HEAD_64_H
0004
0005 #include <asm/cache.h>
0006
0007 #ifdef __ASSEMBLY__
0008
0009
0010
0011
0012 .macro define_ftsec name
0013 .section ".head.text.\name\()","ax",@progbits
0014 .endm
0015 .macro define_data_ftsec name
0016 .section ".head.data.\name\()","a",@progbits
0017 .endm
0018 .macro use_ftsec name
0019 .section ".head.text.\name\()","ax",@progbits
0020 .endm
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060 #define OPEN_FIXED_SECTION(sname, start, end) \
0061 sname##_start = (start); \
0062 sname##_end = (end); \
0063 sname##_len = (end) - (start); \
0064 define_ftsec sname; \
0065 . = 0x0; \
0066 start_##sname:
0067
0068
0069
0070
0071
0072
0073
0074
0075 #ifdef CONFIG_LD_HEAD_STUB_CATCH
0076 #define OPEN_TEXT_SECTION(start) \
0077 .section ".linker_stub_catch","ax",@progbits; \
0078 linker_stub_catch: \
0079 . = 0x4; \
0080 text_start = (start) + 0x100; \
0081 .section ".text","ax",@progbits; \
0082 .balign 0x100; \
0083 start_text:
0084 #else
0085 #define OPEN_TEXT_SECTION(start) \
0086 text_start = (start); \
0087 .section ".text","ax",@progbits; \
0088 . = 0x0; \
0089 start_text:
0090 #endif
0091
0092 #define ZERO_FIXED_SECTION(sname, start, end) \
0093 sname##_start = (start); \
0094 sname##_end = (end); \
0095 sname##_len = (end) - (start); \
0096 define_data_ftsec sname; \
0097 . = 0x0; \
0098 . = sname##_len;
0099
0100 #define USE_FIXED_SECTION(sname) \
0101 use_ftsec sname;
0102
0103 #define USE_TEXT_SECTION() \
0104 .text
0105
0106 #define CLOSE_FIXED_SECTION(sname) \
0107 USE_FIXED_SECTION(sname); \
0108 . = sname##_len; \
0109 end_##sname:
0110
0111
0112 #define __FIXED_SECTION_ENTRY_BEGIN(sname, name, __align) \
0113 USE_FIXED_SECTION(sname); \
0114 .balign __align; \
0115 .global name; \
0116 name:
0117
0118 #define FIXED_SECTION_ENTRY_BEGIN(sname, name) \
0119 __FIXED_SECTION_ENTRY_BEGIN(sname, name, IFETCH_ALIGN_BYTES)
0120
0121 #define FIXED_SECTION_ENTRY_BEGIN_LOCATION(sname, name, start, size) \
0122 USE_FIXED_SECTION(sname); \
0123 name##_start = (start); \
0124 .if ((start) % (size) != 0); \
0125 .error "Fixed section exception vector misalignment"; \
0126 .endif; \
0127 .if ((size) != 0x20) && ((size) != 0x80) && ((size) != 0x100) && ((size) != 0x1000); \
0128 .error "Fixed section exception vector bad size"; \
0129 .endif; \
0130 .if (start) < sname##_start; \
0131 .error "Fixed section underflow"; \
0132 .abort; \
0133 .endif; \
0134 . = (start) - sname##_start; \
0135 .global name; \
0136 name:
0137
0138 #define FIXED_SECTION_ENTRY_END_LOCATION(sname, name, start, size) \
0139 .if (start) + (size) > sname##_end; \
0140 .error "Fixed section overflow"; \
0141 .abort; \
0142 .endif; \
0143 .if (. - name > (start) + (size) - name##_start); \
0144 .error "Fixed entry overflow"; \
0145 .abort; \
0146 .endif; \
0147 . = ((start) + (size) - sname##_start); \
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161 #define DEFINE_FIXED_SYMBOL(label, sname) \
0162 label##_absolute = (label - start_ ## sname + sname ## _start)
0163
0164 #define FIXED_SYMBOL_ABS_ADDR(label) \
0165 (label##_absolute)
0166
0167
0168 #define ABS_ADDR(label, sname) (label - start_ ## sname + sname ## _start)
0169
0170 #endif
0171
0172 #endif