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