^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) /* ld script to make s390 Linux kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Written by Martin Schwidefsky (schwidefsky@de.ibm.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <asm/thread_info.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <asm/page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Put .bss..swapper_pg_dir as the first thing in .bss. This will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * make sure it has 16k alignment.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define BSS_FIRST_SECTIONS *(.bss..swapper_pg_dir)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) /* Handle ro_after_init data on our own. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define RO_AFTER_INIT_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define EMITS_PT_NOTE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <asm-generic/vmlinux.lds.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <asm/vmlinux.lds.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) OUTPUT_ARCH(s390:64-bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) ENTRY(startup_continue)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) jiffies = jiffies_64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) PHDRS {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) text PT_LOAD FLAGS(5); /* R_E */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) data PT_LOAD FLAGS(7); /* RWE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) note PT_NOTE FLAGS(0); /* ___ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) SECTIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) . = 0x100000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) .text : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) _stext = .; /* Start of text section */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) _text = .; /* Text and read-only data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) HEAD_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) TEXT_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) SCHED_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) CPUIDLE_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) LOCK_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) KPROBES_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) IRQENTRY_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) SOFTIRQENTRY_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) *(.text.*_indirect_*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) *(.fixup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) *(.gnu.warning)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) _etext = .; /* End of text section */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) } :text = 0x0700
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) RO_DATA(PAGE_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) _sdata = .; /* Start of data section */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) __start_ro_after_init = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) .data..ro_after_init : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) *(.data..ro_after_init)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) JUMP_TABLE_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) } :data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) EXCEPTION_TABLE(16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) __end_ro_after_init = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) RW_DATA(0x100, PAGE_SIZE, THREAD_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) BOOT_DATA_PRESERVED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) _edata = .; /* End of data section */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) /* will be freed after init */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) . = ALIGN(PAGE_SIZE); /* Init code and data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) __init_begin = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) _sinittext = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) INIT_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) _einittext = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * .exit.text is discarded at runtime, not link time,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) * to deal with references from __bug_table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .exit.text : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) EXIT_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .exit.data : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) EXIT_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) * struct alt_inst entries. From the header (alternative.h):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * "Alternative instructions for different CPU types or capabilities"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) * Think locking instructions on spinlocks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) * Note, that it is a part of __init region.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) . = ALIGN(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) .altinstructions : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) __alt_instructions = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) *(.altinstructions)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) __alt_instructions_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) * And here are the replacement instructions. The linker sticks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) * them as binary blobs. The .altinstructions has enough data to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) * get the address and the length of them to patch the kernel safely.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * Note, that it is a part of __init region.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) .altinstr_replacement : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) *(.altinstr_replacement)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) * Table with the patch locations to undo expolines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) .nospec_call_table : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) __nospec_call_start = . ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) *(.s390_indirect*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) __nospec_call_end = . ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) .nospec_return_table : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) __nospec_return_start = . ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) *(.s390_return*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) __nospec_return_end = . ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) BOOT_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /* early.c uses stsi, which requires page aligned data. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) INIT_DATA_SECTION(0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) PERCPU_SECTION(0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) .dynsym ALIGN(8) : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) __dynsym_start = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) *(.dynsym)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) __dynsym_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) .rela.dyn ALIGN(8) : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) __rela_dyn_start = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) *(.rela*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) __rela_dyn_end = .;
^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(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) __init_end = .; /* freed after init ends here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) BSS_SECTION(PAGE_SIZE, 4 * PAGE_SIZE, PAGE_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) _end = . ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * uncompressed image info used by the decompressor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * it should match struct vmlinux_info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) .vmlinux.info 0 (INFO) : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) QUAD(_stext) /* default_lma */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) QUAD(startup_continue) /* entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) QUAD(__bss_start - _stext) /* image_size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) QUAD(__bss_stop - __bss_start) /* bss_size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) QUAD(__boot_data_start) /* bootdata_off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) QUAD(__boot_data_end - __boot_data_start) /* bootdata_size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) QUAD(__boot_data_preserved_start) /* bootdata_preserved_off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) QUAD(__boot_data_preserved_end -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) __boot_data_preserved_start) /* bootdata_preserved_size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) QUAD(__dynsym_start) /* dynsym_start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) QUAD(__rela_dyn_start) /* rela_dyn_start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) QUAD(__rela_dyn_end) /* rela_dyn_end */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) } :NONE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) /* Debugging sections. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) STABS_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) DWARF_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) ELF_DETAILS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) /* Sections to be discarded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) DISCARDS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) /DISCARD/ : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) *(.eh_frame)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) }