^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) #ifdef CONFIG_PPC64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define PROVIDE32(x) PROVIDE(__unused__##x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #define PROVIDE32(x) PROVIDE(x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define BSS_FIRST_SECTIONS *(.bss.prominit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #define EMITS_PT_NOTE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define RO_EXCEPTION_TABLE_ALIGN 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <asm/page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <asm-generic/vmlinux.lds.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <asm/cache.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <asm/thread_info.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define STRICT_ALIGN_SIZE (1 << CONFIG_DATA_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) ENTRY(_stext)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) PHDRS {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) text PT_LOAD FLAGS(7); /* RWX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) note PT_NOTE FLAGS(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #ifdef CONFIG_PPC64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) OUTPUT_ARCH(powerpc:common64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) jiffies = jiffies_64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) OUTPUT_ARCH(powerpc:common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) jiffies = jiffies_64 + 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) SECTIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) . = KERNELBASE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * Text, read only data and other permanent read-only sections
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) _text = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) _stext = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * Head text.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * This needs to be in its own output section to avoid ld placing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * branch trampoline stubs randomly throughout the fixed sections,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * which it will do (even if the branch comes from another section)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * in order to optimize stub generation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #ifdef CONFIG_PPC64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) KEEP(*(.head.text.first_256B));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #ifdef CONFIG_PPC_BOOK3E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) KEEP(*(.head.text.real_vectors));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) *(.head.text.real_trampolines);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) KEEP(*(.head.text.virt_vectors));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) *(.head.text.virt_trampolines);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) # if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) KEEP(*(.head.data.fwnmi_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) # endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #else /* !CONFIG_PPC64 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) HEAD_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) } :text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) __head_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #ifdef CONFIG_PPC64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * ALIGN(0) overrides the default output section alignment because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * this needs to start right after .head.text in order for fixed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * section placement to work.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) .text ALIGN(0) : AT(ADDR(.text) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #ifdef CONFIG_LD_HEAD_STUB_CATCH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) KEEP(*(.linker_stub_catch));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) . = . ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) .text : AT(ADDR(.text) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) ALIGN_FUNCTION();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* careful! __ftr_alt_* sections need to be close to .text */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) *(.text.hot .text.hot.* TEXT_MAIN .text.fixup .text.unlikely .text.unlikely.* .fixup __ftr_alt_* .ref.text);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #ifdef CONFIG_PPC64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) *(.tramp.ftrace.text);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) NOINSTR_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) SCHED_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) CPUIDLE_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) LOCK_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) KPROBES_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) IRQENTRY_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) SOFTIRQENTRY_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) * -Os builds call FP save/restore functions. The powerpc64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * linker generates those on demand in the .sfpr section.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) * .sfpr gets placed at the beginning of a group of input
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) * sections, which can break start-of-text offset if it is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) * included with the main text sections, so put it by itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) *(.sfpr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) MEM_KEEP(init.text)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) MEM_KEEP(exit.text)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #ifdef CONFIG_PPC32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) *(.got1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) __got2_start = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) *(.got2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) __got2_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #endif /* CONFIG_PPC32 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) } :text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) _etext = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) PROVIDE32 (etext = .);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) /* Read-only data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) RO_DATA(PAGE_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #ifdef CONFIG_PPC64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) __stf_entry_barrier_fixup : AT(ADDR(__stf_entry_barrier_fixup) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) __start___stf_entry_barrier_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) *(__stf_entry_barrier_fixup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) __stop___stf_entry_barrier_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) __uaccess_flush_fixup : AT(ADDR(__uaccess_flush_fixup) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) __start___uaccess_flush_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) *(__uaccess_flush_fixup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) __stop___uaccess_flush_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) __entry_flush_fixup : AT(ADDR(__entry_flush_fixup) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) __start___entry_flush_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) *(__entry_flush_fixup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) __stop___entry_flush_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) __scv_entry_flush_fixup : AT(ADDR(__scv_entry_flush_fixup) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) __start___scv_entry_flush_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) *(__scv_entry_flush_fixup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) __stop___scv_entry_flush_fixup = .;
^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) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) __stf_exit_barrier_fixup : AT(ADDR(__stf_exit_barrier_fixup) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) __start___stf_exit_barrier_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) *(__stf_exit_barrier_fixup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) __stop___stf_exit_barrier_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) __rfi_flush_fixup : AT(ADDR(__rfi_flush_fixup) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) __start___rfi_flush_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) *(__rfi_flush_fixup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) __stop___rfi_flush_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #endif /* CONFIG_PPC64 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #ifdef CONFIG_PPC_BARRIER_NOSPEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) __spec_barrier_fixup : AT(ADDR(__spec_barrier_fixup) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) __start___barrier_nospec_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) *(__barrier_nospec_fixup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) __stop___barrier_nospec_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #endif /* CONFIG_PPC_BARRIER_NOSPEC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #ifdef CONFIG_PPC_FSL_BOOK3E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) __spec_btb_flush_fixup : AT(ADDR(__spec_btb_flush_fixup) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) __start__btb_flush_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) *(__btb_flush_fixup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) __stop__btb_flush_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) * Init sections discarded at runtime
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) . = ALIGN(STRICT_ALIGN_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) __init_begin = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) _sinittext = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) INIT_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) *.init.text might be RO so we must ensure this section ends on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) * a page boundary.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) _einittext = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) #ifdef CONFIG_PPC64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) *(.tramp.ftrace.init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) } :text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) /* .exit.text is discarded at runtime, not link time,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) * to deal with references from __bug_table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) EXIT_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) INIT_DATA_SECTION(16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) __ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) __start___ftr_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) KEEP(*(__ftr_fixup))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) __stop___ftr_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) __mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) __start___mmu_ftr_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) KEEP(*(__mmu_ftr_fixup))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) __stop___mmu_ftr_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) __lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) __start___lwsync_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) KEEP(*(__lwsync_fixup))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) __stop___lwsync_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #ifdef CONFIG_PPC64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) __fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) __start___fw_ftr_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) KEEP(*(__fw_ftr_fixup))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) __stop___fw_ftr_fixup = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) PERCPU_SECTION(L1_CACHE_BYTES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) .machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) __machine_desc_start = . ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) KEEP(*(.machine.desc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) __machine_desc_end = . ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) #ifdef CONFIG_RELOCATABLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) .dynsym : AT(ADDR(.dynsym) - LOAD_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) #ifdef CONFIG_PPC32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) __dynamic_symtab = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) *(.dynsym)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) .dynstr : AT(ADDR(.dynstr) - LOAD_OFFSET) { *(.dynstr) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) .dynamic : AT(ADDR(.dynamic) - LOAD_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) __dynamic_start = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) *(.dynamic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) .hash : AT(ADDR(.hash) - LOAD_OFFSET) { *(.hash) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) .gnu.hash : AT(ADDR(.gnu.hash) - LOAD_OFFSET) { *(.gnu.hash) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) .interp : AT(ADDR(.interp) - LOAD_OFFSET) { *(.interp) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) .rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) __rela_dyn_start = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) *(.rela*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) /* .exit.data is discarded at runtime, not link time,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) * to deal with references from .exit.text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) .exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) EXIT_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) /* freed after init ends here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) __init_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) * And now the various read/write data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) _sdata = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) #ifdef CONFIG_PPC32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) .data : AT(ADDR(.data) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) DATA_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) #ifdef CONFIG_UBSAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) *(.data..Lubsan_data*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) *(.data..Lubsan_type*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) *(.data.rel*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) *(SDATA_MAIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) *(.sdata2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) *(.got.plt) *(.got)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) *(.plt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) *(.branch_lt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) .data : AT(ADDR(.data) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) DATA_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) #ifdef CONFIG_UBSAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) *(.data..Lubsan_data*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) *(.data..Lubsan_type*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) *(.data.rel*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) *(.toc1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) *(.branch_lt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) .opd : AT(ADDR(.opd) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) __start_opd = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) KEEP(*(.opd))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) __end_opd = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) . = ALIGN(256);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) .got : AT(ADDR(.got) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) __toc_start = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) #ifndef CONFIG_RELOCATABLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) __prom_init_toc_start = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) arch/powerpc/kernel/prom_init.o*(.toc .got)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) __prom_init_toc_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) *(.got)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) *(.toc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) /* The initial task and kernel stack */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) INIT_TASK_DATA_SECTION(THREAD_ALIGN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) .data..page_aligned : AT(ADDR(.data..page_aligned) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) PAGE_ALIGNED_DATA(PAGE_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) .data..cacheline_aligned : AT(ADDR(.data..cacheline_aligned) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) .data..read_mostly : AT(ADDR(.data..read_mostly) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) READ_MOSTLY_DATA(L1_CACHE_BYTES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) NOSAVE_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) BUG_TABLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) _edata = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) PROVIDE32 (edata = .);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) * And finally the bss
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) BSS_SECTION(0, 0, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) _end = . ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) PROVIDE32 (end = .);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) STABS_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) DWARF_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) ELF_DETAILS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) DISCARDS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) /DISCARD/ : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) *(*.EMB.apuinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) *(.glink .iplt .plt .rela* .comment)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) *(.gnu.version*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) *(.gnu.attributes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) *(.eh_frame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) }