linux/arch/s390/kernel/vmlinux.lds.S
<<
>>
Prefs
   1/* ld script to make s390 Linux kernel
   2 * Written by Martin Schwidefsky (schwidefsky@de.ibm.com)
   3 */
   4
   5#include <asm/thread_info.h>
   6#include <asm/page.h>
   7
   8/*
   9 * Put .bss..swapper_pg_dir as the first thing in .bss. This will
  10 * make sure it has 16k alignment.
  11 */
  12#define BSS_FIRST_SECTIONS *(.bss..swapper_pg_dir)
  13
  14#include <asm-generic/vmlinux.lds.h>
  15
  16#ifndef CONFIG_64BIT
  17OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390")
  18OUTPUT_ARCH(s390:31-bit)
  19ENTRY(startup)
  20jiffies = jiffies_64 + 4;
  21#else
  22OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
  23OUTPUT_ARCH(s390:64-bit)
  24ENTRY(startup)
  25jiffies = jiffies_64;
  26#endif
  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        . = 0x00000000;
  37        .text : {
  38                /* Text and read-only data */
  39                HEAD_TEXT
  40                /*
  41                 * E.g. perf doesn't like symbols starting at address zero,
  42                 * therefore skip the initial PSW and channel program located
  43                 * at address zero and let _text start at 0x200.
  44                 */
  45        _text = 0x200;
  46                TEXT_TEXT
  47                SCHED_TEXT
  48                CPUIDLE_TEXT
  49                LOCK_TEXT
  50                KPROBES_TEXT
  51                IRQENTRY_TEXT
  52                *(.fixup)
  53                *(.gnu.warning)
  54        } :text = 0x0700
  55
  56        . = ALIGN(PAGE_SIZE);
  57        _etext = .;             /* End of text section */
  58
  59        NOTES :text :note
  60
  61        .dummy : { *(.dummy) } :data
  62
  63        RO_DATA_SECTION(PAGE_SIZE)
  64
  65#ifdef CONFIG_SHARED_KERNEL
  66        . = ALIGN(0x100000);    /* VM shared segments are 1MB aligned */
  67#endif
  68
  69        . = ALIGN(PAGE_SIZE);
  70        _eshared = .;           /* End of shareable data */
  71        _sdata = .;             /* Start of data section */
  72
  73        EXCEPTION_TABLE(16) :data
  74
  75        RW_DATA_SECTION(0x100, PAGE_SIZE, THREAD_SIZE)
  76
  77        _edata = .;             /* End of data section */
  78
  79        /* will be freed after init */
  80        . = ALIGN(PAGE_SIZE);   /* Init code and data */
  81        __init_begin = .;
  82
  83        . = ALIGN(PAGE_SIZE);
  84        .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
  85                VMLINUX_SYMBOL(_sinittext) = . ;
  86                INIT_TEXT
  87                . = ALIGN(PAGE_SIZE);
  88                VMLINUX_SYMBOL(_einittext) = . ;
  89        }
  90
  91        /*
  92         * .exit.text is discarded at runtime, not link time,
  93         * to deal with references from __bug_table
  94        */
  95        .exit.text : {
  96                EXIT_TEXT
  97        }
  98
  99        .exit.data : {
 100                EXIT_DATA
 101        }
 102
 103        /*
 104         * struct alt_inst entries. From the header (alternative.h):
 105         * "Alternative instructions for different CPU types or capabilities"
 106         * Think locking instructions on spinlocks.
 107         * Note, that it is a part of __init region.
 108         */
 109        . = ALIGN(8);
 110        .altinstructions : {
 111                __alt_instructions = .;
 112                *(.altinstructions)
 113                __alt_instructions_end = .;
 114        }
 115
 116        /*
 117         * And here are the replacement instructions. The linker sticks
 118         * them as binary blobs. The .altinstructions has enough data to
 119         * get the address and the length of them to patch the kernel safely.
 120         * Note, that it is a part of __init region.
 121         */
 122        .altinstr_replacement : {
 123                *(.altinstr_replacement)
 124        }
 125
 126        /*
 127         * Table with the patch locations to undo expolines
 128        */
 129        .nospec_call_table : {
 130                __nospec_call_start = . ;
 131                *(.s390_indirect*)
 132                __nospec_call_end = . ;
 133        }
 134        .nospec_return_table : {
 135                __nospec_return_start = . ;
 136                *(.s390_return*)
 137                __nospec_return_end = . ;
 138        }
 139
 140        /* early.c uses stsi, which requires page aligned data. */
 141        . = ALIGN(PAGE_SIZE);
 142        INIT_DATA_SECTION(0x100)
 143
 144        PERCPU_SECTION(0x100)
 145        . = ALIGN(PAGE_SIZE);
 146        __init_end = .;         /* freed after init ends here */
 147
 148        BSS_SECTION(PAGE_SIZE, 4 * PAGE_SIZE, PAGE_SIZE)
 149
 150        _end = . ;
 151
 152        /* Debugging sections.  */
 153        STABS_DEBUG
 154        DWARF_DEBUG
 155
 156        /* Sections to be discarded */
 157        DISCARDS
 158}
 159