150acfb2bSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */ 2fbe934d6SPalmer Dabbelt/* 3fbe934d6SPalmer Dabbelt * Copyright (C) 2012 Regents of the University of California 4fbe934d6SPalmer Dabbelt * Copyright (C) 2017 SiFive 5fbe934d6SPalmer Dabbelt */ 6fbe934d6SPalmer Dabbelt 72bf847dbSJisheng Zhang#define RO_EXCEPTION_TABLE_ALIGN 4 87e92586cSJisheng Zhang#define RUNTIME_DISCARD_EXIT 96f55ab36SJisheng Zhang 1044c92257SVitaly Wool#ifdef CONFIG_XIP_KERNEL 1144c92257SVitaly Wool#include "vmlinux-xip.lds.S" 1244c92257SVitaly Wool#else 1344c92257SVitaly Wool 142bfc6cd8SAlexandre Ghiti#include <asm/pgtable.h> 152bfc6cd8SAlexandre Ghiti#define LOAD_OFFSET KERNEL_LINK_ADDR 1644c92257SVitaly Wool 17fbe934d6SPalmer Dabbelt#include <asm/vmlinux.lds.h> 18fbe934d6SPalmer Dabbelt#include <asm/page.h> 19fbe934d6SPalmer Dabbelt#include <asm/cache.h> 20fbe934d6SPalmer Dabbelt#include <asm/thread_info.h> 2100cb41d5SZong Li#include <asm/set_memory.h> 22cb7d2dd5SAtish Patra#include "image-vars.h" 23fbe934d6SPalmer Dabbelt 24e011995eSAtish Patra#include <linux/sizes.h> 25fbe934d6SPalmer DabbeltOUTPUT_ARCH(riscv) 26fbe934d6SPalmer DabbeltENTRY(_start) 27fbe934d6SPalmer Dabbelt 28fbe934d6SPalmer Dabbeltjiffies = jiffies_64; 29fbe934d6SPalmer Dabbelt 30fbe934d6SPalmer DabbeltSECTIONS 31fbe934d6SPalmer Dabbelt{ 32fbe934d6SPalmer Dabbelt /* Beginning of code and text segment */ 33fbe934d6SPalmer Dabbelt . = LOAD_OFFSET; 34fbe934d6SPalmer Dabbelt _start = .; 35fbe934d6SPalmer Dabbelt HEAD_TEXT_SECTION 36e011995eSAtish Patra . = ALIGN(PAGE_SIZE); 37e011995eSAtish Patra 3819a00869SAtish Patra .text : { 3919a00869SAtish Patra _text = .; 4019a00869SAtish Patra _stext = .; 4119a00869SAtish Patra TEXT_TEXT 4219a00869SAtish Patra SCHED_TEXT 4319a00869SAtish Patra LOCK_TEXT 4419a00869SAtish Patra KPROBES_TEXT 4519a00869SAtish Patra ENTRY_TEXT 4619a00869SAtish Patra IRQENTRY_TEXT 4719a00869SAtish Patra SOFTIRQENTRY_TEXT 4819a00869SAtish Patra _etext = .; 4919a00869SAtish Patra } 5019a00869SAtish Patra 5119a00869SAtish Patra . = ALIGN(SECTION_ALIGN); 52e011995eSAtish Patra __init_begin = .; 53b6566dc1SAtish Patra __init_text_begin = .; 54b6566dc1SAtish Patra .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) ALIGN(SECTION_ALIGN) { \ 55b6566dc1SAtish Patra _sinittext = .; \ 56b6566dc1SAtish Patra INIT_TEXT \ 57b6566dc1SAtish Patra _einittext = .; \ 58b6566dc1SAtish Patra } 59b6566dc1SAtish Patra 60335b1390SDamien Le Moal . = ALIGN(8); 61335b1390SDamien Le Moal __soc_early_init_table : { 62335b1390SDamien Le Moal __soc_early_init_table_start = .; 63335b1390SDamien Le Moal KEEP(*(__soc_early_init_table)) 64335b1390SDamien Le Moal __soc_early_init_table_end = .; 65335b1390SDamien Le Moal } 662d268251SPalmer Dabbelt __soc_builtin_dtb_table : { 672d268251SPalmer Dabbelt __soc_builtin_dtb_table_start = .; 682d268251SPalmer Dabbelt KEEP(*(__soc_builtin_dtb_table)) 692d268251SPalmer Dabbelt __soc_builtin_dtb_table_end = .; 702d268251SPalmer Dabbelt } 71fbe934d6SPalmer Dabbelt /* we have to discard exit text and such at runtime, not link time */ 72fbe934d6SPalmer Dabbelt .exit.text : 73fbe934d6SPalmer Dabbelt { 74fbe934d6SPalmer Dabbelt EXIT_TEXT 75fbe934d6SPalmer Dabbelt } 7619a00869SAtish Patra 7719a00869SAtish Patra __init_text_end = .; 7819a00869SAtish Patra . = ALIGN(SECTION_ALIGN); 7919a00869SAtish Patra#ifdef CONFIG_EFI 8019a00869SAtish Patra . = ALIGN(PECOFF_SECTION_ALIGNMENT); 8119a00869SAtish Patra __pecoff_text_end = .; 8219a00869SAtish Patra#endif 8319a00869SAtish Patra /* Start of init data section */ 8419a00869SAtish Patra __init_data_begin = .; 8519a00869SAtish Patra INIT_DATA_SECTION(16) 8626e7aacbSAlexandre Ghiti 8726e7aacbSAlexandre Ghiti /* Those sections result from the compilation of kernel/pi/string.c */ 8826e7aacbSAlexandre Ghiti .init.pidata : { 8926e7aacbSAlexandre Ghiti *(.init.srodata.cst8*) 9026e7aacbSAlexandre Ghiti *(.init__bug_table*) 9126e7aacbSAlexandre Ghiti *(.init.sdata*) 9226e7aacbSAlexandre Ghiti } 9326e7aacbSAlexandre Ghiti 940ed0031bSJisheng Zhang .init.bss : { 950ed0031bSJisheng Zhang *(.init.bss) /* from the EFI stub */ 960ed0031bSJisheng Zhang } 97fbe934d6SPalmer Dabbelt .exit.data : 98fbe934d6SPalmer Dabbelt { 99fbe934d6SPalmer Dabbelt EXIT_DATA 100fbe934d6SPalmer Dabbelt } 101fbe934d6SPalmer Dabbelt PERCPU_SECTION(L1_CACHE_BYTES) 10219a00869SAtish Patra 103b5b11a8aSAtish Patra .rel.dyn : { 104b5b11a8aSAtish Patra *(.rel.dyn*) 105b5b11a8aSAtish Patra } 106b5b11a8aSAtish Patra 107*4db9e253SAlexandre Ghiti .rela.dyn : ALIGN(8) { 108*4db9e253SAlexandre Ghiti __rela_dyn_start = .; 109*4db9e253SAlexandre Ghiti *(.rela .rela*) 110*4db9e253SAlexandre Ghiti __rela_dyn_end = .; 111*4db9e253SAlexandre Ghiti } 112*4db9e253SAlexandre Ghiti 11319a00869SAtish Patra __init_data_end = .; 1146f4eea90SVincent Chen 1156f4eea90SVincent Chen . = ALIGN(8); 1166f4eea90SVincent Chen .alternative : { 1176f4eea90SVincent Chen __alt_start = .; 1186f4eea90SVincent Chen *(.alternative) 1196f4eea90SVincent Chen __alt_end = .; 1206f4eea90SVincent Chen } 121fbe934d6SPalmer Dabbelt __init_end = .; 122fbe934d6SPalmer Dabbelt 123fbe934d6SPalmer Dabbelt /* Start of data section */ 124fbe934d6SPalmer Dabbelt _sdata = .; 12500cb41d5SZong Li RO_DATA(SECTION_ALIGN) 126fbe934d6SPalmer Dabbelt .srodata : { 127fbe934d6SPalmer Dabbelt *(.srodata*) 128fbe934d6SPalmer Dabbelt } 129fbe934d6SPalmer Dabbelt 13000cb41d5SZong Li . = ALIGN(SECTION_ALIGN); 131bd3d914dSZong Li _data = .; 132bd3d914dSZong Li 13331da94c2STong Tiangen RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THREAD_ALIGN) 134fbe934d6SPalmer Dabbelt .sdata : { 135fbe934d6SPalmer Dabbelt __global_pointer$ = . + 0x800; 136fbe934d6SPalmer Dabbelt *(.sdata*) 137cb7d2dd5SAtish Patra } 138cb7d2dd5SAtish Patra 13926e7aacbSAlexandre Ghiti .got : { *(.got*) } 14026e7aacbSAlexandre Ghiti 14139b33072SAlexandre Ghiti#ifdef CONFIG_RELOCATABLE 14239b33072SAlexandre Ghiti .data.rel : { *(.data.rel*) } 14339b33072SAlexandre Ghiti .plt : { *(.plt) } 14439b33072SAlexandre Ghiti .dynamic : { *(.dynamic) } 14539b33072SAlexandre Ghiti .dynsym : { *(.dynsym) } 14639b33072SAlexandre Ghiti .dynstr : { *(.dynstr) } 14739b33072SAlexandre Ghiti .hash : { *(.hash) } 14839b33072SAlexandre Ghiti .gnu.hash : { *(.gnu.hash) } 14939b33072SAlexandre Ghiti#endif 15039b33072SAlexandre Ghiti 151cb7d2dd5SAtish Patra#ifdef CONFIG_EFI 152cb7d2dd5SAtish Patra .pecoff_edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGNMENT); } 153cb7d2dd5SAtish Patra __pecoff_data_raw_size = ABSOLUTE(. - __pecoff_text_end); 15455de1e4aSAlexandre Ghiti __pecoff_data_raw_end = ABSOLUTE(.); 155cb7d2dd5SAtish Patra#endif 156cb7d2dd5SAtish Patra 157fbe934d6SPalmer Dabbelt /* End of data section */ 158fbe934d6SPalmer Dabbelt _edata = .; 159fbe934d6SPalmer Dabbelt 16041fb9d54SPalmer Dabbelt BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 0) 16141fb9d54SPalmer Dabbelt 162cb7d2dd5SAtish Patra#ifdef CONFIG_EFI 163cb7d2dd5SAtish Patra . = ALIGN(PECOFF_SECTION_ALIGNMENT); 164cb7d2dd5SAtish Patra __pecoff_data_virt_size = ABSOLUTE(. - __pecoff_text_end); 16555de1e4aSAlexandre Ghiti __pecoff_data_virt_end = ABSOLUTE(.); 166cb7d2dd5SAtish Patra#endif 167fbe934d6SPalmer Dabbelt _end = .; 168fbe934d6SPalmer Dabbelt 169fbe934d6SPalmer Dabbelt STABS_DEBUG 170fbe934d6SPalmer Dabbelt DWARF_DEBUG 171c604abc3SKees Cook ELF_DETAILS 172b13e64d9SJisheng Zhang .riscv.attributes 0 : { *(.riscv.attributes) } 173fbe934d6SPalmer Dabbelt 174fbe934d6SPalmer Dabbelt DISCARDS 175fbe934d6SPalmer Dabbelt} 17644c92257SVitaly Wool#endif /* CONFIG_XIP_KERNEL */ 177