linux/arch/powerpc/kernel/vmlinux.lds.S
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifdef CONFIG_PPC64
   3#define PROVIDE32(x)    PROVIDE(__unused__##x)
   4#else
   5#define PROVIDE32(x)    PROVIDE(x)
   6#endif
   7
   8#define BSS_FIRST_SECTIONS *(.bss.prominit)
   9#define EMITS_PT_NOTE
  10#define RO_EXCEPTION_TABLE_ALIGN        0
  11
  12#include <asm/page.h>
  13#include <asm-generic/vmlinux.lds.h>
  14#include <asm/cache.h>
  15#include <asm/thread_info.h>
  16
  17#define STRICT_ALIGN_SIZE       (1 << CONFIG_DATA_SHIFT)
  18
  19ENTRY(_stext)
  20
  21PHDRS {
  22        text PT_LOAD FLAGS(7); /* RWX */
  23        note PT_NOTE FLAGS(0);
  24}
  25
  26#ifdef CONFIG_PPC64
  27OUTPUT_ARCH(powerpc:common64)
  28jiffies = jiffies_64;
  29#else
  30OUTPUT_ARCH(powerpc:common)
  31jiffies = jiffies_64 + 4;
  32#endif
  33SECTIONS
  34{
  35        . = KERNELBASE;
  36
  37/*
  38 * Text, read only data and other permanent read-only sections
  39 */
  40
  41        _text = .;
  42        _stext = .;
  43
  44        /*
  45         * Head text.
  46         * This needs to be in its own output section to avoid ld placing
  47         * branch trampoline stubs randomly throughout the fixed sections,
  48         * which it will do (even if the branch comes from another section)
  49         * in order to optimize stub generation.
  50         */
  51        .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) {
  52#ifdef CONFIG_PPC64
  53                KEEP(*(.head.text.first_256B));
  54#ifdef CONFIG_PPC_BOOK3E
  55#else
  56                KEEP(*(.head.text.real_vectors));
  57                *(.head.text.real_trampolines);
  58                KEEP(*(.head.text.virt_vectors));
  59                *(.head.text.virt_trampolines);
  60# if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
  61                KEEP(*(.head.data.fwnmi_page));
  62# endif
  63#endif
  64#else /* !CONFIG_PPC64 */
  65                HEAD_TEXT
  66#endif
  67        } :text
  68
  69        __head_end = .;
  70
  71#ifdef CONFIG_PPC64
  72        /*
  73         * ALIGN(0) overrides the default output section alignment because
  74         * this needs to start right after .head.text in order for fixed
  75         * section placement to work.
  76         */
  77        .text ALIGN(0) : AT(ADDR(.text) - LOAD_OFFSET) {
  78#ifdef CONFIG_LD_HEAD_STUB_CATCH
  79                KEEP(*(.linker_stub_catch));
  80                . = . ;
  81#endif
  82
  83#else
  84        .text : AT(ADDR(.text) - LOAD_OFFSET) {
  85                ALIGN_FUNCTION();
  86#endif
  87                /* careful! __ftr_alt_* sections need to be close to .text */
  88                *(.text.hot .text.hot.* TEXT_MAIN .text.fixup .text.unlikely .text.unlikely.* .fixup __ftr_alt_* .ref.text);
  89#ifdef CONFIG_PPC64
  90                *(.tramp.ftrace.text);
  91#endif
  92                NOINSTR_TEXT
  93                SCHED_TEXT
  94                CPUIDLE_TEXT
  95                LOCK_TEXT
  96                KPROBES_TEXT
  97                IRQENTRY_TEXT
  98                SOFTIRQENTRY_TEXT
  99                /*
 100                 * -Os builds call FP save/restore functions. The powerpc64
 101                 * linker generates those on demand in the .sfpr section.
 102                 * .sfpr gets placed at the beginning of a group of input
 103                 * sections, which can break start-of-text offset if it is
 104                 * included with the main text sections, so put it by itself.
 105                 */
 106                *(.sfpr);
 107                MEM_KEEP(init.text)
 108                MEM_KEEP(exit.text)
 109
 110#ifdef CONFIG_PPC32
 111                *(.got1)
 112                __got2_start = .;
 113                *(.got2)
 114                __got2_end = .;
 115#endif /* CONFIG_PPC32 */
 116
 117        } :text
 118
 119        . = ALIGN(PAGE_SIZE);
 120        _etext = .;
 121        PROVIDE32 (etext = .);
 122
 123        /* Read-only data */
 124        RO_DATA(PAGE_SIZE)
 125
 126#ifdef CONFIG_PPC64
 127        . = ALIGN(8);
 128        __stf_entry_barrier_fixup : AT(ADDR(__stf_entry_barrier_fixup) - LOAD_OFFSET) {
 129                __start___stf_entry_barrier_fixup = .;
 130                *(__stf_entry_barrier_fixup)
 131                __stop___stf_entry_barrier_fixup = .;
 132        }
 133
 134        . = ALIGN(8);
 135        __uaccess_flush_fixup : AT(ADDR(__uaccess_flush_fixup) - LOAD_OFFSET) {
 136                __start___uaccess_flush_fixup = .;
 137                *(__uaccess_flush_fixup)
 138                __stop___uaccess_flush_fixup = .;
 139        }
 140
 141        . = ALIGN(8);
 142        __entry_flush_fixup : AT(ADDR(__entry_flush_fixup) - LOAD_OFFSET) {
 143                __start___entry_flush_fixup = .;
 144                *(__entry_flush_fixup)
 145                __stop___entry_flush_fixup = .;
 146        }
 147
 148        . = ALIGN(8);
 149        __scv_entry_flush_fixup : AT(ADDR(__scv_entry_flush_fixup) - LOAD_OFFSET) {
 150                __start___scv_entry_flush_fixup = .;
 151                *(__scv_entry_flush_fixup)
 152                __stop___scv_entry_flush_fixup = .;
 153        }
 154
 155        . = ALIGN(8);
 156        __stf_exit_barrier_fixup : AT(ADDR(__stf_exit_barrier_fixup) - LOAD_OFFSET) {
 157                __start___stf_exit_barrier_fixup = .;
 158                *(__stf_exit_barrier_fixup)
 159                __stop___stf_exit_barrier_fixup = .;
 160        }
 161
 162        . = ALIGN(8);
 163        __rfi_flush_fixup : AT(ADDR(__rfi_flush_fixup) - LOAD_OFFSET) {
 164                __start___rfi_flush_fixup = .;
 165                *(__rfi_flush_fixup)
 166                __stop___rfi_flush_fixup = .;
 167        }
 168#endif /* CONFIG_PPC64 */
 169
 170#ifdef CONFIG_PPC_BARRIER_NOSPEC
 171        . = ALIGN(8);
 172        __spec_barrier_fixup : AT(ADDR(__spec_barrier_fixup) - LOAD_OFFSET) {
 173                __start___barrier_nospec_fixup = .;
 174                *(__barrier_nospec_fixup)
 175                __stop___barrier_nospec_fixup = .;
 176        }
 177#endif /* CONFIG_PPC_BARRIER_NOSPEC */
 178
 179#ifdef CONFIG_PPC_FSL_BOOK3E
 180        . = ALIGN(8);
 181        __spec_btb_flush_fixup : AT(ADDR(__spec_btb_flush_fixup) - LOAD_OFFSET) {
 182                __start__btb_flush_fixup = .;
 183                *(__btb_flush_fixup)
 184                __stop__btb_flush_fixup = .;
 185        }
 186#endif
 187
 188/*
 189 * Init sections discarded at runtime
 190 */
 191        . = ALIGN(STRICT_ALIGN_SIZE);
 192        __init_begin = .;
 193        . = ALIGN(PAGE_SIZE);
 194        .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
 195                _sinittext = .;
 196                INIT_TEXT
 197
 198                /*
 199                 *.init.text might be RO so we must ensure this section ends on
 200                 * a page boundary.
 201                 */
 202                . = ALIGN(PAGE_SIZE);
 203                _einittext = .;
 204#ifdef CONFIG_PPC64
 205                *(.tramp.ftrace.init);
 206#endif
 207        } :text
 208
 209        /* .exit.text is discarded at runtime, not link time,
 210         * to deal with references from __bug_table
 211         */
 212        .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {
 213                EXIT_TEXT
 214        }
 215
 216        . = ALIGN(PAGE_SIZE);
 217
 218        INIT_DATA_SECTION(16)
 219
 220        . = ALIGN(8);
 221        __ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) {
 222                __start___ftr_fixup = .;
 223                KEEP(*(__ftr_fixup))
 224                __stop___ftr_fixup = .;
 225        }
 226        . = ALIGN(8);
 227        __mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) {
 228                __start___mmu_ftr_fixup = .;
 229                KEEP(*(__mmu_ftr_fixup))
 230                __stop___mmu_ftr_fixup = .;
 231        }
 232        . = ALIGN(8);
 233        __lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) {
 234                __start___lwsync_fixup = .;
 235                KEEP(*(__lwsync_fixup))
 236                __stop___lwsync_fixup = .;
 237        }
 238#ifdef CONFIG_PPC64
 239        . = ALIGN(8);
 240        __fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) {
 241                __start___fw_ftr_fixup = .;
 242                KEEP(*(__fw_ftr_fixup))
 243                __stop___fw_ftr_fixup = .;
 244        }
 245#endif
 246
 247        PERCPU_SECTION(L1_CACHE_BYTES)
 248
 249        . = ALIGN(8);
 250        .machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
 251                __machine_desc_start = . ;
 252                KEEP(*(.machine.desc))
 253                __machine_desc_end = . ;
 254        }
 255#ifdef CONFIG_RELOCATABLE
 256        . = ALIGN(8);
 257        .dynsym : AT(ADDR(.dynsym) - LOAD_OFFSET)
 258        {
 259#ifdef CONFIG_PPC32
 260                __dynamic_symtab = .;
 261#endif
 262                *(.dynsym)
 263        }
 264        .dynstr : AT(ADDR(.dynstr) - LOAD_OFFSET) { *(.dynstr) }
 265        .dynamic : AT(ADDR(.dynamic) - LOAD_OFFSET)
 266        {
 267                __dynamic_start = .;
 268                *(.dynamic)
 269        }
 270        .hash : AT(ADDR(.hash) - LOAD_OFFSET) { *(.hash) }
 271        .gnu.hash : AT(ADDR(.gnu.hash) - LOAD_OFFSET) { *(.gnu.hash) }
 272        .interp : AT(ADDR(.interp) - LOAD_OFFSET) { *(.interp) }
 273        .rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET)
 274        {
 275                __rela_dyn_start = .;
 276                *(.rela*)
 277        }
 278#endif
 279        /* .exit.data is discarded at runtime, not link time,
 280         * to deal with references from .exit.text
 281         */
 282        .exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) {
 283                EXIT_DATA
 284        }
 285
 286        /* freed after init ends here */
 287        . = ALIGN(PAGE_SIZE);
 288        __init_end = .;
 289
 290/*
 291 * And now the various read/write data
 292 */
 293
 294        . = ALIGN(PAGE_SIZE);
 295        _sdata = .;
 296
 297#ifdef CONFIG_PPC32
 298        .data : AT(ADDR(.data) - LOAD_OFFSET) {
 299                DATA_DATA
 300#ifdef CONFIG_UBSAN
 301                *(.data..Lubsan_data*)
 302                *(.data..Lubsan_type*)
 303#endif
 304                *(.data.rel*)
 305                *(SDATA_MAIN)
 306                *(.sdata2)
 307                *(.got.plt) *(.got)
 308                *(.plt)
 309                *(.branch_lt)
 310        }
 311#else
 312        .data : AT(ADDR(.data) - LOAD_OFFSET) {
 313                DATA_DATA
 314#ifdef CONFIG_UBSAN
 315                *(.data..Lubsan_data*)
 316                *(.data..Lubsan_type*)
 317#endif
 318                *(.data.rel*)
 319                *(.toc1)
 320                *(.branch_lt)
 321        }
 322
 323        .opd : AT(ADDR(.opd) - LOAD_OFFSET) {
 324                __start_opd = .;
 325                KEEP(*(.opd))
 326                __end_opd = .;
 327        }
 328
 329        . = ALIGN(256);
 330        .got : AT(ADDR(.got) - LOAD_OFFSET) {
 331                __toc_start = .;
 332#ifndef CONFIG_RELOCATABLE
 333                __prom_init_toc_start = .;
 334                arch/powerpc/kernel/prom_init.o*(.toc .got)
 335                __prom_init_toc_end = .;
 336#endif
 337                *(.got)
 338                *(.toc)
 339        }
 340#endif
 341
 342        /* The initial task and kernel stack */
 343        INIT_TASK_DATA_SECTION(THREAD_ALIGN)
 344
 345        .data..page_aligned : AT(ADDR(.data..page_aligned) - LOAD_OFFSET) {
 346                PAGE_ALIGNED_DATA(PAGE_SIZE)
 347        }
 348
 349        .data..cacheline_aligned : AT(ADDR(.data..cacheline_aligned) - LOAD_OFFSET) {
 350                CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
 351        }
 352
 353        .data..read_mostly : AT(ADDR(.data..read_mostly) - LOAD_OFFSET) {
 354                READ_MOSTLY_DATA(L1_CACHE_BYTES)
 355        }
 356
 357        . = ALIGN(PAGE_SIZE);
 358        .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
 359                NOSAVE_DATA
 360        }
 361
 362        BUG_TABLE
 363
 364        . = ALIGN(PAGE_SIZE);
 365        _edata  =  .;
 366        PROVIDE32 (edata = .);
 367
 368/*
 369 * And finally the bss
 370 */
 371
 372        BSS_SECTION(0, 0, 0)
 373
 374        . = ALIGN(PAGE_SIZE);
 375        _end = . ;
 376        PROVIDE32 (end = .);
 377
 378        STABS_DEBUG
 379        DWARF_DEBUG
 380        ELF_DETAILS
 381
 382        DISCARDS
 383        /DISCARD/ : {
 384                *(*.EMB.apuinfo)
 385                *(.glink .iplt .plt .rela* .comment)
 386                *(.gnu.version*)
 387                *(.gnu.attributes)
 388                *(.eh_frame)
 389        }
 390}
 391