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