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