Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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 */