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*2bfc6cd8SAlexandre Ghiti#include <asm/pgtable.h> 8*2bfc6cd8SAlexandre Ghiti#define LOAD_OFFSET KERNEL_LINK_ADDR 9fbe934d6SPalmer Dabbelt#include <asm/vmlinux.lds.h> 10fbe934d6SPalmer Dabbelt#include <asm/page.h> 11fbe934d6SPalmer Dabbelt#include <asm/cache.h> 12fbe934d6SPalmer Dabbelt#include <asm/thread_info.h> 1300cb41d5SZong Li#include <asm/set_memory.h> 14cb7d2dd5SAtish Patra#include "image-vars.h" 15fbe934d6SPalmer Dabbelt 16e011995eSAtish Patra#include <linux/sizes.h> 17fbe934d6SPalmer DabbeltOUTPUT_ARCH(riscv) 18fbe934d6SPalmer DabbeltENTRY(_start) 19fbe934d6SPalmer Dabbelt 20fbe934d6SPalmer Dabbeltjiffies = jiffies_64; 21fbe934d6SPalmer Dabbelt 22cb7d2dd5SAtish PatraPECOFF_SECTION_ALIGNMENT = 0x1000; 23cb7d2dd5SAtish PatraPECOFF_FILE_ALIGNMENT = 0x200; 24cb7d2dd5SAtish Patra 25fbe934d6SPalmer DabbeltSECTIONS 26fbe934d6SPalmer Dabbelt{ 27fbe934d6SPalmer Dabbelt /* Beginning of code and text segment */ 28fbe934d6SPalmer Dabbelt . = LOAD_OFFSET; 29fbe934d6SPalmer Dabbelt _start = .; 30fbe934d6SPalmer Dabbelt HEAD_TEXT_SECTION 31e011995eSAtish Patra . = ALIGN(PAGE_SIZE); 32e011995eSAtish Patra 3319a00869SAtish Patra .text : { 3419a00869SAtish Patra _text = .; 3519a00869SAtish Patra _stext = .; 3619a00869SAtish Patra TEXT_TEXT 3719a00869SAtish Patra SCHED_TEXT 3819a00869SAtish Patra CPUIDLE_TEXT 3919a00869SAtish Patra LOCK_TEXT 4019a00869SAtish Patra KPROBES_TEXT 4119a00869SAtish Patra ENTRY_TEXT 4219a00869SAtish Patra IRQENTRY_TEXT 4319a00869SAtish Patra SOFTIRQENTRY_TEXT 4419a00869SAtish Patra *(.fixup) 4519a00869SAtish Patra _etext = .; 4619a00869SAtish Patra } 4719a00869SAtish Patra 4819a00869SAtish Patra . = ALIGN(SECTION_ALIGN); 49e011995eSAtish Patra __init_begin = .; 50b6566dc1SAtish Patra __init_text_begin = .; 51b6566dc1SAtish Patra .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) ALIGN(SECTION_ALIGN) { \ 52b6566dc1SAtish Patra _sinittext = .; \ 53b6566dc1SAtish Patra INIT_TEXT \ 54b6566dc1SAtish Patra _einittext = .; \ 55b6566dc1SAtish Patra } 56b6566dc1SAtish Patra 57335b1390SDamien Le Moal . = ALIGN(8); 58335b1390SDamien Le Moal __soc_early_init_table : { 59335b1390SDamien Le Moal __soc_early_init_table_start = .; 60335b1390SDamien Le Moal KEEP(*(__soc_early_init_table)) 61335b1390SDamien Le Moal __soc_early_init_table_end = .; 62335b1390SDamien Le Moal } 632d268251SPalmer Dabbelt __soc_builtin_dtb_table : { 642d268251SPalmer Dabbelt __soc_builtin_dtb_table_start = .; 652d268251SPalmer Dabbelt KEEP(*(__soc_builtin_dtb_table)) 662d268251SPalmer Dabbelt __soc_builtin_dtb_table_end = .; 672d268251SPalmer Dabbelt } 68fbe934d6SPalmer Dabbelt /* we have to discard exit text and such at runtime, not link time */ 69fbe934d6SPalmer Dabbelt .exit.text : 70fbe934d6SPalmer Dabbelt { 71fbe934d6SPalmer Dabbelt EXIT_TEXT 72fbe934d6SPalmer Dabbelt } 7319a00869SAtish Patra 7419a00869SAtish Patra __init_text_end = .; 7519a00869SAtish Patra . = ALIGN(SECTION_ALIGN); 7619a00869SAtish Patra#ifdef CONFIG_EFI 7719a00869SAtish Patra . = ALIGN(PECOFF_SECTION_ALIGNMENT); 7819a00869SAtish Patra __pecoff_text_end = .; 7919a00869SAtish Patra#endif 8019a00869SAtish Patra /* Start of init data section */ 8119a00869SAtish Patra __init_data_begin = .; 8219a00869SAtish Patra INIT_DATA_SECTION(16) 83fbe934d6SPalmer Dabbelt .exit.data : 84fbe934d6SPalmer Dabbelt { 85fbe934d6SPalmer Dabbelt EXIT_DATA 86fbe934d6SPalmer Dabbelt } 87fbe934d6SPalmer Dabbelt PERCPU_SECTION(L1_CACHE_BYTES) 8819a00869SAtish Patra 89b5b11a8aSAtish Patra .rel.dyn : { 90b5b11a8aSAtish Patra *(.rel.dyn*) 91b5b11a8aSAtish Patra } 92b5b11a8aSAtish Patra 9319a00869SAtish Patra __init_data_end = .; 946f4eea90SVincent Chen 956f4eea90SVincent Chen . = ALIGN(8); 966f4eea90SVincent Chen .alternative : { 976f4eea90SVincent Chen __alt_start = .; 986f4eea90SVincent Chen *(.alternative) 996f4eea90SVincent Chen __alt_end = .; 1006f4eea90SVincent Chen } 101fbe934d6SPalmer Dabbelt __init_end = .; 102fbe934d6SPalmer Dabbelt 103fbe934d6SPalmer Dabbelt /* Start of data section */ 104fbe934d6SPalmer Dabbelt _sdata = .; 10500cb41d5SZong Li RO_DATA(SECTION_ALIGN) 106fbe934d6SPalmer Dabbelt .srodata : { 107fbe934d6SPalmer Dabbelt *(.srodata*) 108fbe934d6SPalmer Dabbelt } 109fbe934d6SPalmer Dabbelt 110bd3d914dSZong Li EXCEPTION_TABLE(0x10) 111bd3d914dSZong Li 11200cb41d5SZong Li . = ALIGN(SECTION_ALIGN); 113bd3d914dSZong Li _data = .; 114bd3d914dSZong Li 115c9174047SKees Cook RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE) 116fbe934d6SPalmer Dabbelt .sdata : { 117fbe934d6SPalmer Dabbelt __global_pointer$ = . + 0x800; 118fbe934d6SPalmer Dabbelt *(.sdata*) 119cb7d2dd5SAtish Patra } 120cb7d2dd5SAtish Patra 121cb7d2dd5SAtish Patra#ifdef CONFIG_EFI 122cb7d2dd5SAtish Patra .pecoff_edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGNMENT); } 123cb7d2dd5SAtish Patra __pecoff_data_raw_size = ABSOLUTE(. - __pecoff_text_end); 124cb7d2dd5SAtish Patra#endif 125cb7d2dd5SAtish Patra 126fbe934d6SPalmer Dabbelt /* End of data section */ 127fbe934d6SPalmer Dabbelt _edata = .; 128fbe934d6SPalmer Dabbelt 12941fb9d54SPalmer Dabbelt BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 0) 13041fb9d54SPalmer Dabbelt 131cb7d2dd5SAtish Patra#ifdef CONFIG_EFI 132cb7d2dd5SAtish Patra . = ALIGN(PECOFF_SECTION_ALIGNMENT); 133cb7d2dd5SAtish Patra __pecoff_data_virt_size = ABSOLUTE(. - __pecoff_text_end); 134cb7d2dd5SAtish Patra#endif 135fbe934d6SPalmer Dabbelt _end = .; 136fbe934d6SPalmer Dabbelt 137fbe934d6SPalmer Dabbelt STABS_DEBUG 138fbe934d6SPalmer Dabbelt DWARF_DEBUG 139c604abc3SKees Cook ELF_DETAILS 140fbe934d6SPalmer Dabbelt 141fbe934d6SPalmer Dabbelt DISCARDS 142fbe934d6SPalmer Dabbelt} 143