linux/arch/riscv/kernel/vmlinux-xip.lds.S
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) 2012 Regents of the University of California
   4 * Copyright (C) 2017 SiFive
   5 * Copyright (C) 2020 Vitaly Wool, Konsulko AB
   6 */
   7
   8#include <asm/pgtable.h>
   9#define LOAD_OFFSET KERNEL_LINK_ADDR
  10/* No __ro_after_init data in the .rodata section - which will always be ro */
  11#define RO_AFTER_INIT_DATA
  12
  13#include <asm/vmlinux.lds.h>
  14#include <asm/page.h>
  15#include <asm/cache.h>
  16#include <asm/thread_info.h>
  17
  18OUTPUT_ARCH(riscv)
  19ENTRY(_start)
  20
  21jiffies = jiffies_64;
  22
  23SECTIONS
  24{
  25        /* Beginning of code and text segment */
  26        . = LOAD_OFFSET;
  27        _xiprom = .;
  28        _start = .;
  29        HEAD_TEXT_SECTION
  30        INIT_TEXT_SECTION(PAGE_SIZE)
  31        /* we have to discard exit text and such at runtime, not link time */
  32        .exit.text :
  33        {
  34                EXIT_TEXT
  35        }
  36
  37        .text : {
  38                _text = .;
  39                _stext = .;
  40                TEXT_TEXT
  41                SCHED_TEXT
  42                CPUIDLE_TEXT
  43                LOCK_TEXT
  44                KPROBES_TEXT
  45                ENTRY_TEXT
  46                IRQENTRY_TEXT
  47                SOFTIRQENTRY_TEXT
  48                *(.fixup)
  49                _etext = .;
  50        }
  51        RO_DATA(L1_CACHE_BYTES)
  52        .srodata : {
  53                *(.srodata*)
  54        }
  55        .init.rodata : {
  56                INIT_SETUP(16)
  57                INIT_CALLS
  58                CON_INITCALL
  59                INIT_RAM_FS
  60        }
  61        _exiprom = .;                   /* End of XIP ROM area */
  62
  63
  64/*
  65 * From this point, stuff is considered writable and will be copied to RAM
  66 */
  67        __data_loc = ALIGN(PAGE_SIZE);          /* location in file */
  68        . = KERNEL_LINK_ADDR + XIP_OFFSET;      /* location in memory */
  69
  70#undef LOAD_OFFSET
  71#define LOAD_OFFSET (KERNEL_LINK_ADDR + XIP_OFFSET - (__data_loc & XIP_OFFSET_MASK))
  72
  73        _sdata = .;                     /* Start of data section */
  74        _data = .;
  75        RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
  76        _edata = .;
  77        __start_ro_after_init = .;
  78        .data.ro_after_init : AT(ADDR(.data.ro_after_init) - LOAD_OFFSET) {
  79                *(.data..ro_after_init)
  80        }
  81        __end_ro_after_init = .;
  82
  83        . = ALIGN(PAGE_SIZE);
  84        __init_begin = .;
  85        .init.data : {
  86                INIT_DATA
  87        }
  88        .exit.data : {
  89                EXIT_DATA
  90        }
  91        . = ALIGN(8);
  92        __soc_early_init_table : {
  93                __soc_early_init_table_start = .;
  94                KEEP(*(__soc_early_init_table))
  95                __soc_early_init_table_end = .;
  96        }
  97        __soc_builtin_dtb_table : {
  98                __soc_builtin_dtb_table_start = .;
  99                KEEP(*(__soc_builtin_dtb_table))
 100                __soc_builtin_dtb_table_end = .;
 101        }
 102
 103        . = ALIGN(8);
 104        .alternative : {
 105                __alt_start = .;
 106                *(.alternative)
 107                __alt_end = .;
 108        }
 109        __init_end = .;
 110
 111        . = ALIGN(16);
 112        .xip.traps : {
 113                __xip_traps_start = .;
 114                *(.xip.traps)
 115                __xip_traps_end = .;
 116        }
 117
 118        . = ALIGN(PAGE_SIZE);
 119        .sdata : {
 120                __global_pointer$ = . + 0x800;
 121                *(.sdata*)
 122                *(.sbss*)
 123        }
 124
 125        BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 0)
 126
 127        PERCPU_SECTION(L1_CACHE_BYTES)
 128
 129        .rel.dyn : AT(ADDR(.rel.dyn) - LOAD_OFFSET) {
 130                *(.rel.dyn*)
 131        }
 132
 133        /*
 134         * End of copied data. We need a dummy section to get its LMA.
 135         * Also located before final ALIGN() as trailing padding is not stored
 136         * in the resulting binary file and useless to copy.
 137         */
 138        .data.endmark : AT(ADDR(.data.endmark) - LOAD_OFFSET) { }
 139        _edata_loc = LOADADDR(.data.endmark);
 140
 141        . = ALIGN(PAGE_SIZE);
 142        _end = .;
 143
 144        STABS_DEBUG
 145        DWARF_DEBUG
 146
 147        DISCARDS
 148}
 149