Merge branch 'address-masking'
[linux-2.6-microblaze.git] / arch / loongarch / kernel / vmlinux.lds.S
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  */
24 PECOFF_FILE_ALIGN = 0x200;
25 PECOFF_SEGMENT_ALIGN = 0x10000;
26
27 OUTPUT_ARCH(loongarch)
28 ENTRY(kernel_entry)
29 PHDRS {
30         text PT_LOAD FLAGS(7);  /* RWX */
31         note PT_NOTE FLAGS(4);  /* R__ */
32 }
33
34 jiffies  = jiffies_64;
35
36 SECTIONS
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 }