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