^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) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * ld script to make ARM Linux kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * taken from the i386 version by Russell King
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <asm/hyp_image.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #ifdef CONFIG_KVM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define HYPERVISOR_EXTABLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) . = ALIGN(SZ_8); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) __start___kvm_ex_table = .; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) *(__kvm_ex_table) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) __stop___kvm_ex_table = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define HYPERVISOR_DATA_SECTIONS \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) HYP_SECTION_NAME(.rodata) : { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) . = ALIGN(PAGE_SIZE); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) __hyp_rodata_start = .; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) *(HYP_SECTION_NAME(.data..ro_after_init)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) *(HYP_SECTION_NAME(.rodata)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) . = ALIGN(PAGE_SIZE); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) __hyp_rodata_end = .; \
^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) #define HYPERVISOR_PERCPU_SECTION \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) . = ALIGN(PAGE_SIZE); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) HYP_SECTION_NAME(.data..percpu) : { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) *(HYP_SECTION_NAME(.data..percpu)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define HYPERVISOR_RELOC_SECTION \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) .hyp.reloc : ALIGN(4) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) __hyp_reloc_begin = .; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) *(.hyp.reloc) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) __hyp_reloc_end = .; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define BSS_FIRST_SECTIONS \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) __hyp_bss_start = .; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) *(HYP_SECTION_NAME(.bss)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) . = ALIGN(PAGE_SIZE); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) __hyp_bss_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * We require that __hyp_bss_start and __bss_start are aligned, and enforce it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * with an assertion. But the BSS_SECTION macro places an empty .sbss section
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * between them, which can in some cases cause the linker to misalign them. To
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * work around the issue, force a page alignment for __bss_start.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define SBSS_ALIGN PAGE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #else /* CONFIG_KVM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define HYPERVISOR_EXTABLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define HYPERVISOR_DATA_SECTIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define HYPERVISOR_PERCPU_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define HYPERVISOR_RELOC_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define SBSS_ALIGN 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define RO_EXCEPTION_TABLE_ALIGN 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define RUNTIME_DISCARD_EXIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #include <asm-generic/vmlinux.lds.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #include <asm/cache.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #include <asm/kernel-pgtable.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #include <asm/memory.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #include <asm/page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #include "image.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) OUTPUT_ARCH(aarch64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) ENTRY(_text)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) jiffies = jiffies_64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define HYPERVISOR_TEXT \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) . = ALIGN(PAGE_SIZE); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) __hyp_idmap_text_start = .; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) *(.hyp.idmap.text) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) __hyp_idmap_text_end = .; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) __hyp_text_start = .; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) *(.hyp.text) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) HYPERVISOR_EXTABLE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) . = ALIGN(PAGE_SIZE); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) __hyp_text_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define IDMAP_TEXT \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) . = ALIGN(SZ_4K); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) __idmap_text_start = .; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) *(.idmap.text) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) __idmap_text_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #ifdef CONFIG_HIBERNATION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define HIBERNATE_TEXT \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) . = ALIGN(SZ_4K); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) __hibernate_exit_text_start = .; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) *(.hibernate_exit.text) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) __hibernate_exit_text_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define HIBERNATE_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #ifdef CONFIG_UNMAP_KERNEL_AT_EL0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define TRAMP_TEXT \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) . = ALIGN(PAGE_SIZE); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) __entry_tramp_text_start = .; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) *(.entry.tramp.text) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) . = ALIGN(PAGE_SIZE); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) __entry_tramp_text_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define TRAMP_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) * The size of the PE/COFF section that covers the kernel image, which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * runs from _stext to _edata, must be a round multiple of the PE/COFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) * FileAlignment, which we set to its minimum value of 0x200. '_stext'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) * itself is 4 KB aligned, so padding out _edata to a 0x200 aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) * boundary should be sufficient.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) PECOFF_FILE_ALIGNMENT = 0x200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #ifdef CONFIG_EFI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define PECOFF_EDATA_PADDING \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) .pecoff_edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGNMENT); }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define PECOFF_EDATA_PADDING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) SECTIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) * XXX: The linker does not define how output sections are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) * assigned to input sections when there are multiple statements
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) * matching the same input section name. There is no documented
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * order of matching.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) DISCARDS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /DISCARD/ : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) *(.interp .dynamic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) *(.dynsym .dynstr .hash .gnu.hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) . = KIMAGE_VADDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) .head.text : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) _text = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) HEAD_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) .text : { /* Real text segment */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) _stext = .; /* Text and read-only data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) IRQENTRY_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) SOFTIRQENTRY_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) ENTRY_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) TEXT_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) SCHED_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) CPUIDLE_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) LOCK_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) KPROBES_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) HYPERVISOR_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) IDMAP_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) HIBERNATE_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) TRAMP_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) *(.fixup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) *(.gnu.warning)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) . = ALIGN(16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) *(.got) /* Global offset table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) * Make sure that the .got.plt is either completely empty or it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) * contains only the lazy dispatch entries.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) .got.plt : { *(.got.plt) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) ASSERT(SIZEOF(.got.plt) == 0 || SIZEOF(.got.plt) == 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) "Unexpected GOT/PLT entries detected!")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) . = ALIGN(SEGMENT_ALIGN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) _etext = .; /* End of text section */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) /* everything from this point to __init_begin will be marked RO NX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) RO_DATA(PAGE_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) HYPERVISOR_DATA_SECTIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) idmap_pg_dir = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) . += IDMAP_DIR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) idmap_pg_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #ifdef CONFIG_UNMAP_KERNEL_AT_EL0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) tramp_pg_dir = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) . += PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) reserved_pg_dir = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) . += PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) swapper_pg_dir = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) . += PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) . = ALIGN(SEGMENT_ALIGN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) __init_begin = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) __inittext_begin = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) INIT_TEXT_SECTION(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) __exittext_begin = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) .exit.text : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) EXIT_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) __exittext_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) . = ALIGN(4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) .altinstructions : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) __alt_instructions = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) *(.altinstructions)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) __alt_instructions_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) . = ALIGN(SEGMENT_ALIGN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) __inittext_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) __initdata_begin = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) .init.data : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) INIT_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) INIT_SETUP(16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) INIT_CALLS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) CON_INITCALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) INIT_RAM_FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) *(.init.altinstructions .init.rodata.* .init.bss) /* from the EFI stub */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) .exit.data : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) EXIT_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) PERCPU_SECTION(L1_CACHE_BYTES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) HYPERVISOR_PERCPU_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) HYPERVISOR_RELOC_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) .rela.dyn : ALIGN(8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) *(.rela .rela*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) __rela_offset = ABSOLUTE(ADDR(.rela.dyn) - KIMAGE_VADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) __rela_size = SIZEOF(.rela.dyn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) #ifdef CONFIG_RELR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) .relr.dyn : ALIGN(8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) *(.relr.dyn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) __relr_offset = ABSOLUTE(ADDR(.relr.dyn) - KIMAGE_VADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) __relr_size = SIZEOF(.relr.dyn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) . = ALIGN(SEGMENT_ALIGN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) __initdata_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) __init_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) _data = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) _sdata = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THREAD_ALIGN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) * Data written with the MMU off but read with the MMU on requires
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) * cache lines to be invalidated, discarding up to a Cache Writeback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) * Granule (CWG) of data from the cache. Keep the section that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) * requires this type of maintenance to be in its own Cache Writeback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) * Granule (CWG) area so the cache maintenance operations don't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) * interfere with adjacent data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) .mmuoff.data.write : ALIGN(SZ_2K) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) __mmuoff_data_start = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) *(.mmuoff.data.write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) . = ALIGN(SZ_2K);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) .mmuoff.data.read : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) *(.mmuoff.data.read)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) __mmuoff_data_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) PECOFF_EDATA_PADDING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) __pecoff_data_rawsize = ABSOLUTE(. - __initdata_begin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) _edata = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) BSS_SECTION(SBSS_ALIGN, 0, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) init_pg_dir = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) . += INIT_DIR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) init_pg_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) . = ALIGN(SEGMENT_ALIGN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) __pecoff_data_size = ABSOLUTE(. - __initdata_begin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) _end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) STABS_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) DWARF_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) ELF_DETAILS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) HEAD_SYMBOLS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) * Sections that should stay zero sized, which is safer to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) * explicitly check instead of blindly discarding.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) .plt : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) *(.plt) *(.plt.*) *(.iplt) *(.igot .igot.plt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) ASSERT(SIZEOF(.plt) == 0, "Unexpected run-time procedure linkages detected!")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) .data.rel.ro : { *(.data.rel.ro) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) ASSERT(SIZEOF(.data.rel.ro) == 0, "Unexpected RELRO detected!")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) #include "image-vars.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) * The HYP init code and ID map text can't be longer than a page each. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) * former is page-aligned, but the latter may not be with 16K or 64K pages, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) * it should also not cross a page boundary.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) ASSERT(__hyp_idmap_text_end - __hyp_idmap_text_start <= PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) "HYP init code too big")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) ASSERT(__idmap_text_end - (__idmap_text_start & ~(SZ_4K - 1)) <= SZ_4K,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) "ID map text too big or misaligned")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) #ifdef CONFIG_HIBERNATION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) ASSERT(__hibernate_exit_text_end - (__hibernate_exit_text_start & ~(SZ_4K - 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) <= SZ_4K, "Hibernate exit text too big or misaligned")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) #ifdef CONFIG_UNMAP_KERNEL_AT_EL0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) ASSERT((__entry_tramp_text_end - __entry_tramp_text_start) <= 3*PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) "Entry trampoline text too big")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) #ifdef CONFIG_KVM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) ASSERT(__hyp_bss_start == __bss_start, "HYP and Host BSS are misaligned")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) * If padding is applied before .head.text, virt<->phys conversions will fail.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) ASSERT(_text == KIMAGE_VADDR, "HEAD is misaligned")