^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef _ASM_POWERPC_HEAD_64_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _ASM_POWERPC_HEAD_64_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <asm/cache.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #ifdef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * We can't do CPP stringification and concatination directly into the section
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * name for some reason, so these macros can do it for us.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) .macro define_ftsec name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) .section ".head.text.\name\()","ax",@progbits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) .macro define_data_ftsec name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) .section ".head.data.\name\()","a",@progbits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) .macro use_ftsec name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) .section ".head.text.\name\()"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * Fixed (location) sections are used by opening fixed sections and emitting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * fixed section entries into them before closing them. Multiple fixed sections
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * can be open at any time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * Each fixed section created in a .S file must have corresponding linkage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * directives including location, added to arch/powerpc/kernel/vmlinux.lds.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * For each fixed section, code is generated into it in the order which it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * appears in the source. Fixed section entries can be placed at a fixed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * location within the section using _LOCATION postifx variants. These must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * be ordered according to their relative placements within the section.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * OPEN_FIXED_SECTION(section_name, start_address, end_address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * FIXED_SECTION_ENTRY_BEGIN(section_name, label1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * USE_FIXED_SECTION(section_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * label3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * li r10,128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * mv r11,r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * FIXED_SECTION_ENTRY_BEGIN_LOCATION(section_name, label2, start_address, size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * FIXED_SECTION_ENTRY_END_LOCATION(section_name, label2, start_address, size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * CLOSE_FIXED_SECTION(section_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * ZERO_FIXED_SECTION can be used to emit zeroed data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * Troubleshooting:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * - If the build dies with "Error: attempt to move .org backwards" at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * CLOSE_FIXED_SECTION() or elsewhere, there may be something
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * unexpected being added there. Remove the '. = x_len' line, rebuild, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * check what is pushing the section down.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) * - If the build dies in linking, check arch/powerpc/tools/head_check.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * comments.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * - If the kernel crashes or hangs in very early boot, it could be linker
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * stubs at the start of the main text.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define OPEN_FIXED_SECTION(sname, start, end) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) sname##_start = (start); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) sname##_end = (end); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) sname##_len = (end) - (start); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) define_ftsec sname; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) . = 0x0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) start_##sname:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * .linker_stub_catch section is used to catch linker stubs from being
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * inserted in our .text section, above the start_text label (which breaks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * the ABS_ADDR calculation). See kernel/vmlinux.lds.S and tools/head_check.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * for more details. We would prefer to just keep a cacheline (0x80), but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * 0x100 seems to be how the linker aligns branch stub groups.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #ifdef CONFIG_LD_HEAD_STUB_CATCH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define OPEN_TEXT_SECTION(start) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) .section ".linker_stub_catch","ax",@progbits; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) linker_stub_catch: \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) . = 0x4; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) text_start = (start) + 0x100; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .section ".text","ax",@progbits; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .balign 0x100; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) start_text:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define OPEN_TEXT_SECTION(start) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) text_start = (start); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) .section ".text","ax",@progbits; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) . = 0x0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) start_text:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define ZERO_FIXED_SECTION(sname, start, end) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) sname##_start = (start); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) sname##_end = (end); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) sname##_len = (end) - (start); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) define_data_ftsec sname; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) . = 0x0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) . = sname##_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define USE_FIXED_SECTION(sname) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) fs_label = start_##sname; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) fs_start = sname##_start; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) use_ftsec sname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define USE_TEXT_SECTION() \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) fs_label = start_text; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) fs_start = text_start; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define CLOSE_FIXED_SECTION(sname) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) USE_FIXED_SECTION(sname); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) . = sname##_len; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) end_##sname:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define __FIXED_SECTION_ENTRY_BEGIN(sname, name, __align) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) USE_FIXED_SECTION(sname); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) .balign __align; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) .global name; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) name:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define FIXED_SECTION_ENTRY_BEGIN(sname, name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) __FIXED_SECTION_ENTRY_BEGIN(sname, name, IFETCH_ALIGN_BYTES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define FIXED_SECTION_ENTRY_BEGIN_LOCATION(sname, name, start, size) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) USE_FIXED_SECTION(sname); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) name##_start = (start); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) .if ((start) % (size) != 0); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) .error "Fixed section exception vector misalignment"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) .endif; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) .if ((size) != 0x20) && ((size) != 0x80) && ((size) != 0x100) && ((size) != 0x1000); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) .error "Fixed section exception vector bad size"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) .endif; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) .if (start) < sname##_start; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) .error "Fixed section underflow"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) .abort; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) .endif; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) . = (start) - sname##_start; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) .global name; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) name:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define FIXED_SECTION_ENTRY_END_LOCATION(sname, name, start, size) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) .if (start) + (size) > sname##_end; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) .error "Fixed section overflow"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) .abort; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) .endif; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) .if (. - name > (start) + (size) - name##_start); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) .error "Fixed entry overflow"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) .abort; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) .endif; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) . = ((start) + (size) - sname##_start); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) * These macros are used to change symbols in other fixed sections to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * absolute or related to our current fixed section.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) * - DEFINE_FIXED_SYMBOL / FIXED_SYMBOL_ABS_ADDR is used to find the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) * absolute address of a symbol within a fixed section, from any section.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * - ABS_ADDR is used to find the absolute address of any symbol, from within
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) * a fixed section.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define DEFINE_FIXED_SYMBOL(label) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) label##_absolute = (label - fs_label + fs_start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #define FIXED_SYMBOL_ABS_ADDR(label) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) (label##_absolute)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define ABS_ADDR(label) (label - fs_label + fs_start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #endif /* __ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #endif /* _ASM_POWERPC_HEAD_64_H */