1/* SPDX-License-Identifier: GPL-2.0 */ 2#include <linux/sizes.h> 3#include <asm/asm-offsets.h> 4#include <asm/thread_info.h> 5#include <asm/orc_lookup.h> 6 7#define PAGE_SIZE _PAGE_SIZE 8#define RO_EXCEPTION_TABLE_ALIGN 4 9#define PHYSADDR_MASK 0xffffffffffff /* 48-bit */ 10 11/* 12 * Put .bss..swapper_pg_dir as the first thing in .bss. This will 13 * ensure that it has .bss alignment (64K). 14 */ 15#define BSS_FIRST_SECTIONS *(.bss..swapper_pg_dir) 16 17#include <asm-generic/vmlinux.lds.h> 18#include "image-vars.h" 19 20/* 21 * Max avaliable Page Size is 64K, so we set SectionAlignment 22 * field of EFI application to 64K. 23 */ 24PECOFF_FILE_ALIGN = 0x200; 25PECOFF_SEGMENT_ALIGN = 0x10000; 26 27OUTPUT_ARCH(loongarch) 28ENTRY(kernel_entry) 29PHDRS { 30 text PT_LOAD FLAGS(7); /* RWX */ 31 note PT_NOTE FLAGS(4); /* R__ */ 32} 33 34jiffies = jiffies_64; 35 36SECTIONS 37{ 38 . = VMLINUX_LOAD_ADDRESS; 39 40 _text = .; 41 HEAD_TEXT_SECTION 42 43 . = ALIGN(PECOFF_SEGMENT_ALIGN); 44 _stext = .; 45 .text : { 46 TEXT_TEXT 47 SCHED_TEXT 48 LOCK_TEXT 49 KPROBES_TEXT 50 IRQENTRY_TEXT 51 SOFTIRQENTRY_TEXT 52 *(.fixup) 53 *(.gnu.warning) 54 } :text = 0 55 . = ALIGN(PECOFF_SEGMENT_ALIGN); 56 _etext = .; 57 58 . = ALIGN(PECOFF_SEGMENT_ALIGN); 59 __init_begin = .; 60 __inittext_begin = .; 61 62 INIT_TEXT_SECTION(PAGE_SIZE) 63 .exit.text : { 64 EXIT_TEXT 65 } 66 67 . = ALIGN(PECOFF_SEGMENT_ALIGN); 68 __inittext_end = .; 69 70 __initdata_begin = .; 71 72 /* 73 * struct alt_inst entries. From the header (alternative.h): 74 * "Alternative instructions for different CPU types or capabilities" 75 * Think locking instructions on spinlocks. 76 */ 77 . = ALIGN(4); 78 .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) { 79 __alt_instructions = .; 80 *(.altinstructions) 81 __alt_instructions_end = .; 82 } 83 84 INIT_DATA_SECTION(16) 85 .exit.data : { 86 EXIT_DATA 87 } 88 89#ifdef CONFIG_SMP 90 PERCPU_SECTION(1 << CONFIG_L1_CACHE_SHIFT) 91#endif 92 93 .init.bss : { 94 *(.init.bss) 95 } 96 . = ALIGN(PECOFF_SEGMENT_ALIGN); 97 __initdata_end = .; 98 99 __init_end = .; 100 101 _sdata = .; 102 RO_DATA(4096) 103 104 .got : ALIGN(16) { *(.got) } 105 .plt : ALIGN(16) { *(.plt) } 106 .got.plt : ALIGN(16) { *(.got.plt) } 107 108 RW_DATA(1 << CONFIG_L1_CACHE_SHIFT, PAGE_SIZE, THREAD_SIZE) 109 110 .rela.dyn : ALIGN(8) { 111 __rela_dyn_begin = .; 112 *(.rela.dyn) *(.rela*) 113 __rela_dyn_end = .; 114 } 115 116#ifdef CONFIG_RELR 117 .relr.dyn : ALIGN(8) { 118 __relr_dyn_begin = .; 119 *(.relr.dyn) 120 __relr_dyn_end = .; 121 } 122#endif 123 124 .data.rel : { *(.data.rel*) } 125 126#ifdef CONFIG_RELOCATABLE 127 . = ALIGN(8); 128 .la_abs : AT(ADDR(.la_abs) - LOAD_OFFSET) { 129 __la_abs_begin = .; 130 *(.la_abs) 131 __la_abs_end = .; 132 } 133#endif 134 135 ORC_UNWIND_TABLE 136 137 .sdata : { 138 *(.sdata) 139 } 140 .edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGN); } 141 _edata = .; 142 143 BSS_SECTION(0, SZ_64K, 8) 144 . = ALIGN(PECOFF_SEGMENT_ALIGN); 145 146 _end = .; 147 148 STABS_DEBUG 149 DWARF_DEBUG 150 ELF_DETAILS 151 152#ifdef CONFIG_EFI_STUB 153 /* header symbols */ 154 _kernel_entry = ABSOLUTE(kernel_entry & PHYSADDR_MASK); 155 _kernel_asize = ABSOLUTE(_end - _text); 156 _kernel_fsize = ABSOLUTE(_edata - _text); 157 _kernel_vsize = ABSOLUTE(_end - __initdata_begin); 158 _kernel_rsize = ABSOLUTE(_edata - __initdata_begin); 159#endif 160 161 .gptab.sdata : { 162 *(.gptab.data) 163 *(.gptab.sdata) 164 } 165 .gptab.sbss : { 166 *(.gptab.bss) 167 *(.gptab.sbss) 168 } 169 170 DISCARDS 171 /DISCARD/ : { 172 *(.dynamic .dynsym .dynstr .hash .gnu.hash) 173 *(.gnu.attributes) 174 *(.options) 175 *(.eh_frame) 176 } 177} 178