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 7*6f55ab36SJisheng Zhang#define RO_EXCEPTION_TABLE_ALIGN 16 8*6f55ab36SJisheng Zhang 944c92257SVitaly Wool#ifdef CONFIG_XIP_KERNEL 1044c92257SVitaly Wool#include "vmlinux-xip.lds.S" 1144c92257SVitaly Wool#else 1244c92257SVitaly Wool 132bfc6cd8SAlexandre Ghiti#include <asm/pgtable.h> 142bfc6cd8SAlexandre Ghiti#define LOAD_OFFSET KERNEL_LINK_ADDR 1544c92257SVitaly Wool 16fbe934d6SPalmer Dabbelt#include <asm/vmlinux.lds.h> 17fbe934d6SPalmer Dabbelt#include <asm/page.h> 18fbe934d6SPalmer Dabbelt#include <asm/cache.h> 19fbe934d6SPalmer Dabbelt#include <asm/thread_info.h> 2000cb41d5SZong Li#include <asm/set_memory.h> 21cb7d2dd5SAtish Patra#include "image-vars.h" 22fbe934d6SPalmer Dabbelt 23e011995eSAtish Patra#include <linux/sizes.h> 24fbe934d6SPalmer DabbeltOUTPUT_ARCH(riscv) 25fbe934d6SPalmer DabbeltENTRY(_start) 26fbe934d6SPalmer Dabbelt 27fbe934d6SPalmer Dabbeltjiffies = jiffies_64; 28fbe934d6SPalmer Dabbelt 29cb7d2dd5SAtish PatraPECOFF_SECTION_ALIGNMENT = 0x1000; 30cb7d2dd5SAtish PatraPECOFF_FILE_ALIGNMENT = 0x200; 31cb7d2dd5SAtish Patra 32fbe934d6SPalmer DabbeltSECTIONS 33fbe934d6SPalmer Dabbelt{ 34fbe934d6SPalmer Dabbelt /* Beginning of code and text segment */ 35fbe934d6SPalmer Dabbelt . = LOAD_OFFSET; 36fbe934d6SPalmer Dabbelt _start = .; 37fbe934d6SPalmer Dabbelt HEAD_TEXT_SECTION 38e011995eSAtish Patra . = ALIGN(PAGE_SIZE); 39e011995eSAtish Patra 4019a00869SAtish Patra .text : { 4119a00869SAtish Patra _text = .; 4219a00869SAtish Patra _stext = .; 4319a00869SAtish Patra TEXT_TEXT 4419a00869SAtish Patra SCHED_TEXT 4519a00869SAtish Patra CPUIDLE_TEXT 4619a00869SAtish Patra LOCK_TEXT 4719a00869SAtish Patra KPROBES_TEXT 4819a00869SAtish Patra ENTRY_TEXT 4919a00869SAtish Patra IRQENTRY_TEXT 5019a00869SAtish Patra SOFTIRQENTRY_TEXT 5119a00869SAtish Patra *(.fixup) 5219a00869SAtish Patra _etext = .; 5319a00869SAtish Patra } 5419a00869SAtish Patra 5519a00869SAtish Patra . = ALIGN(SECTION_ALIGN); 56e011995eSAtish Patra __init_begin = .; 57b6566dc1SAtish Patra __init_text_begin = .; 58b6566dc1SAtish Patra .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) ALIGN(SECTION_ALIGN) { \ 59b6566dc1SAtish Patra _sinittext = .; \ 60b6566dc1SAtish Patra INIT_TEXT \ 61b6566dc1SAtish Patra _einittext = .; \ 62b6566dc1SAtish Patra } 63b6566dc1SAtish Patra 64335b1390SDamien Le Moal . = ALIGN(8); 65335b1390SDamien Le Moal __soc_early_init_table : { 66335b1390SDamien Le Moal __soc_early_init_table_start = .; 67335b1390SDamien Le Moal KEEP(*(__soc_early_init_table)) 68335b1390SDamien Le Moal __soc_early_init_table_end = .; 69335b1390SDamien Le Moal } 702d268251SPalmer Dabbelt __soc_builtin_dtb_table : { 712d268251SPalmer Dabbelt __soc_builtin_dtb_table_start = .; 722d268251SPalmer Dabbelt KEEP(*(__soc_builtin_dtb_table)) 732d268251SPalmer Dabbelt __soc_builtin_dtb_table_end = .; 742d268251SPalmer Dabbelt } 75fbe934d6SPalmer Dabbelt /* we have to discard exit text and such at runtime, not link time */ 76fbe934d6SPalmer Dabbelt .exit.text : 77fbe934d6SPalmer Dabbelt { 78fbe934d6SPalmer Dabbelt EXIT_TEXT 79fbe934d6SPalmer Dabbelt } 8019a00869SAtish Patra 8119a00869SAtish Patra __init_text_end = .; 8219a00869SAtish Patra . = ALIGN(SECTION_ALIGN); 8319a00869SAtish Patra#ifdef CONFIG_EFI 8419a00869SAtish Patra . = ALIGN(PECOFF_SECTION_ALIGNMENT); 8519a00869SAtish Patra __pecoff_text_end = .; 8619a00869SAtish Patra#endif 8719a00869SAtish Patra /* Start of init data section */ 8819a00869SAtish Patra __init_data_begin = .; 8919a00869SAtish Patra INIT_DATA_SECTION(16) 90fbe934d6SPalmer Dabbelt .exit.data : 91fbe934d6SPalmer Dabbelt { 92fbe934d6SPalmer Dabbelt EXIT_DATA 93fbe934d6SPalmer Dabbelt } 94fbe934d6SPalmer Dabbelt PERCPU_SECTION(L1_CACHE_BYTES) 9519a00869SAtish Patra 96b5b11a8aSAtish Patra .rel.dyn : { 97b5b11a8aSAtish Patra *(.rel.dyn*) 98b5b11a8aSAtish Patra } 99b5b11a8aSAtish Patra 10019a00869SAtish Patra __init_data_end = .; 1016f4eea90SVincent Chen 1026f4eea90SVincent Chen . = ALIGN(8); 1036f4eea90SVincent Chen .alternative : { 1046f4eea90SVincent Chen __alt_start = .; 1056f4eea90SVincent Chen *(.alternative) 1066f4eea90SVincent Chen __alt_end = .; 1076f4eea90SVincent Chen } 108fbe934d6SPalmer Dabbelt __init_end = .; 109fbe934d6SPalmer Dabbelt 110fbe934d6SPalmer Dabbelt /* Start of data section */ 111fbe934d6SPalmer Dabbelt _sdata = .; 11200cb41d5SZong Li RO_DATA(SECTION_ALIGN) 113fbe934d6SPalmer Dabbelt .srodata : { 114fbe934d6SPalmer Dabbelt *(.srodata*) 115fbe934d6SPalmer Dabbelt } 116fbe934d6SPalmer Dabbelt 11700cb41d5SZong Li . = ALIGN(SECTION_ALIGN); 118bd3d914dSZong Li _data = .; 119bd3d914dSZong Li 12031da94c2STong Tiangen RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THREAD_ALIGN) 121fbe934d6SPalmer Dabbelt .sdata : { 122fbe934d6SPalmer Dabbelt __global_pointer$ = . + 0x800; 123fbe934d6SPalmer Dabbelt *(.sdata*) 124cb7d2dd5SAtish Patra } 125cb7d2dd5SAtish Patra 126cb7d2dd5SAtish Patra#ifdef CONFIG_EFI 127cb7d2dd5SAtish Patra .pecoff_edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGNMENT); } 128cb7d2dd5SAtish Patra __pecoff_data_raw_size = ABSOLUTE(. - __pecoff_text_end); 129cb7d2dd5SAtish Patra#endif 130cb7d2dd5SAtish Patra 131fbe934d6SPalmer Dabbelt /* End of data section */ 132fbe934d6SPalmer Dabbelt _edata = .; 133fbe934d6SPalmer Dabbelt 13441fb9d54SPalmer Dabbelt BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 0) 13541fb9d54SPalmer Dabbelt 136cb7d2dd5SAtish Patra#ifdef CONFIG_EFI 137cb7d2dd5SAtish Patra . = ALIGN(PECOFF_SECTION_ALIGNMENT); 138cb7d2dd5SAtish Patra __pecoff_data_virt_size = ABSOLUTE(. - __pecoff_text_end); 139cb7d2dd5SAtish Patra#endif 140fbe934d6SPalmer Dabbelt _end = .; 141fbe934d6SPalmer Dabbelt 142fbe934d6SPalmer Dabbelt STABS_DEBUG 143fbe934d6SPalmer Dabbelt DWARF_DEBUG 144c604abc3SKees Cook ELF_DETAILS 145fbe934d6SPalmer Dabbelt 146fbe934d6SPalmer Dabbelt DISCARDS 147fbe934d6SPalmer Dabbelt} 14844c92257SVitaly Wool#endif /* CONFIG_XIP_KERNEL */ 149