diff options
-rw-r--r-- | arch/x86/kernel/vmlinux_64.lds.S | 85 |
1 files changed, 45 insertions, 40 deletions
diff --git a/arch/x86/kernel/vmlinux_64.lds.S b/arch/x86/kernel/vmlinux_64.lds.S index 5bf54e40c6ef..fe5d21ce7241 100644 --- a/arch/x86/kernel/vmlinux_64.lds.S +++ b/arch/x86/kernel/vmlinux_64.lds.S | |||
@@ -29,8 +29,8 @@ SECTIONS | |||
29 | { | 29 | { |
30 | . = __START_KERNEL; | 30 | . = __START_KERNEL; |
31 | phys_startup_64 = startup_64 - LOAD_OFFSET; | 31 | phys_startup_64 = startup_64 - LOAD_OFFSET; |
32 | _text = .; /* Text and read-only data */ | ||
33 | .text : AT(ADDR(.text) - LOAD_OFFSET) { | 32 | .text : AT(ADDR(.text) - LOAD_OFFSET) { |
33 | _text = .; /* Text and read-only data */ | ||
34 | /* First the code that has to be first for bootstrapping */ | 34 | /* First the code that has to be first for bootstrapping */ |
35 | *(.text.head) | 35 | *(.text.head) |
36 | _stext = .; | 36 | _stext = .; |
@@ -61,13 +61,13 @@ SECTIONS | |||
61 | .data : AT(ADDR(.data) - LOAD_OFFSET) { | 61 | .data : AT(ADDR(.data) - LOAD_OFFSET) { |
62 | DATA_DATA | 62 | DATA_DATA |
63 | CONSTRUCTORS | 63 | CONSTRUCTORS |
64 | _edata = .; /* End of data section */ | ||
64 | } :data | 65 | } :data |
65 | 66 | ||
66 | _edata = .; /* End of data section */ | ||
67 | 67 | ||
68 | . = ALIGN(PAGE_SIZE); | ||
69 | . = ALIGN(CONFIG_X86_L1_CACHE_BYTES); | ||
70 | .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) { | 68 | .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) { |
69 | . = ALIGN(PAGE_SIZE); | ||
70 | . = ALIGN(CONFIG_X86_L1_CACHE_BYTES); | ||
71 | *(.data.cacheline_aligned) | 71 | *(.data.cacheline_aligned) |
72 | } | 72 | } |
73 | . = ALIGN(CONFIG_X86_INTERNODE_CACHE_BYTES); | 73 | . = ALIGN(CONFIG_X86_INTERNODE_CACHE_BYTES); |
@@ -125,29 +125,29 @@ SECTIONS | |||
125 | #undef VVIRT_OFFSET | 125 | #undef VVIRT_OFFSET |
126 | #undef VVIRT | 126 | #undef VVIRT |
127 | 127 | ||
128 | . = ALIGN(THREAD_SIZE); /* init_task */ | ||
129 | .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) { | 128 | .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) { |
129 | . = ALIGN(THREAD_SIZE); /* init_task */ | ||
130 | *(.data.init_task) | 130 | *(.data.init_task) |
131 | }:data.init | 131 | }:data.init |
132 | 132 | ||
133 | . = ALIGN(PAGE_SIZE); | ||
134 | .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) { | 133 | .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) { |
134 | . = ALIGN(PAGE_SIZE); | ||
135 | *(.data.page_aligned) | 135 | *(.data.page_aligned) |
136 | } | 136 | } |
137 | 137 | ||
138 | /* might get freed after init */ | ||
139 | . = ALIGN(PAGE_SIZE); | ||
140 | __smp_alt_begin = .; | ||
141 | __smp_locks = .; | ||
142 | .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) { | 138 | .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) { |
139 | /* might get freed after init */ | ||
140 | . = ALIGN(PAGE_SIZE); | ||
141 | __smp_alt_begin = .; | ||
142 | __smp_locks = .; | ||
143 | *(.smp_locks) | 143 | *(.smp_locks) |
144 | __smp_locks_end = .; | ||
145 | . = ALIGN(PAGE_SIZE); | ||
146 | __smp_alt_end = .; | ||
144 | } | 147 | } |
145 | __smp_locks_end = .; | ||
146 | . = ALIGN(PAGE_SIZE); | ||
147 | __smp_alt_end = .; | ||
148 | 148 | ||
149 | . = ALIGN(PAGE_SIZE); /* Init code and data */ | 149 | . = ALIGN(PAGE_SIZE); /* Init code and data */ |
150 | __init_begin = .; | 150 | __init_begin = .; /* paired with __init_end */ |
151 | .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { | 151 | .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { |
152 | _sinittext = .; | 152 | _sinittext = .; |
153 | INIT_TEXT | 153 | INIT_TEXT |
@@ -159,40 +159,42 @@ SECTIONS | |||
159 | __initdata_end = .; | 159 | __initdata_end = .; |
160 | } | 160 | } |
161 | 161 | ||
162 | . = ALIGN(16); | 162 | .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { |
163 | __setup_start = .; | 163 | . = ALIGN(16); |
164 | .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { *(.init.setup) } | 164 | __setup_start = .; |
165 | __setup_end = .; | 165 | *(.init.setup) |
166 | __initcall_start = .; | 166 | __setup_end = .; |
167 | } | ||
167 | .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { | 168 | .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { |
169 | __initcall_start = .; | ||
168 | INITCALLS | 170 | INITCALLS |
171 | __initcall_end = .; | ||
169 | } | 172 | } |
170 | __initcall_end = .; | ||
171 | __con_initcall_start = .; | ||
172 | .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) { | 173 | .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) { |
174 | __con_initcall_start = .; | ||
173 | *(.con_initcall.init) | 175 | *(.con_initcall.init) |
176 | __con_initcall_end = .; | ||
174 | } | 177 | } |
175 | __con_initcall_end = .; | ||
176 | __x86_cpu_dev_start = .; | ||
177 | .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) { | 178 | .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) { |
179 | __x86_cpu_dev_start = .; | ||
178 | *(.x86_cpu_dev.init) | 180 | *(.x86_cpu_dev.init) |
181 | __x86_cpu_dev_end = .; | ||
179 | } | 182 | } |
180 | __x86_cpu_dev_end = .; | ||
181 | SECURITY_INIT | 183 | SECURITY_INIT |
182 | 184 | ||
183 | . = ALIGN(8); | 185 | . = ALIGN(8); |
184 | .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) { | 186 | .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) { |
185 | __parainstructions = .; | 187 | __parainstructions = .; |
186 | *(.parainstructions) | 188 | *(.parainstructions) |
187 | __parainstructions_end = .; | 189 | __parainstructions_end = .; |
188 | } | 190 | } |
189 | 191 | ||
190 | . = ALIGN(8); | ||
191 | __alt_instructions = .; | ||
192 | .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) { | 192 | .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) { |
193 | . = ALIGN(8); | ||
194 | __alt_instructions = .; | ||
193 | *(.altinstructions) | 195 | *(.altinstructions) |
196 | __alt_instructions_end = .; | ||
194 | } | 197 | } |
195 | __alt_instructions_end = .; | ||
196 | .altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) { | 198 | .altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) { |
197 | *(.altinstr_replacement) | 199 | *(.altinstr_replacement) |
198 | } | 200 | } |
@@ -207,9 +209,11 @@ SECTIONS | |||
207 | 209 | ||
208 | #ifdef CONFIG_BLK_DEV_INITRD | 210 | #ifdef CONFIG_BLK_DEV_INITRD |
209 | . = ALIGN(PAGE_SIZE); | 211 | . = ALIGN(PAGE_SIZE); |
210 | __initramfs_start = .; | 212 | .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { |
211 | .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { *(.init.ramfs) } | 213 | __initramfs_start = .; |
212 | __initramfs_end = .; | 214 | *(.init.ramfs) |
215 | __initramfs_end = .; | ||
216 | } | ||
213 | #endif | 217 | #endif |
214 | 218 | ||
215 | #ifdef CONFIG_SMP | 219 | #ifdef CONFIG_SMP |
@@ -229,20 +233,21 @@ SECTIONS | |||
229 | . = ALIGN(PAGE_SIZE); | 233 | . = ALIGN(PAGE_SIZE); |
230 | __init_end = .; | 234 | __init_end = .; |
231 | 235 | ||
232 | . = ALIGN(PAGE_SIZE); | ||
233 | __nosave_begin = .; | ||
234 | .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { | 236 | .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { |
235 | *(.data.nosave) | 237 | . = ALIGN(PAGE_SIZE); |
238 | __nosave_begin = .; | ||
239 | *(.data.nosave) | ||
240 | . = ALIGN(PAGE_SIZE); | ||
241 | __nosave_end = .; | ||
236 | } :data.init2 /* use another section data.init2, see PERCPU_VADDR() above */ | 242 | } :data.init2 /* use another section data.init2, see PERCPU_VADDR() above */ |
237 | . = ALIGN(PAGE_SIZE); | ||
238 | __nosave_end = .; | ||
239 | 243 | ||
240 | __bss_start = .; /* BSS */ | ||
241 | .bss : AT(ADDR(.bss) - LOAD_OFFSET) { | 244 | .bss : AT(ADDR(.bss) - LOAD_OFFSET) { |
245 | . = ALIGN(PAGE_SIZE); | ||
246 | __bss_start = .; /* BSS */ | ||
242 | *(.bss.page_aligned) | 247 | *(.bss.page_aligned) |
243 | *(.bss) | 248 | *(.bss) |
244 | } | 249 | __bss_stop = .; |
245 | __bss_stop = .; | 250 | } |
246 | 251 | ||
247 | _end = . ; | 252 | _end = . ; |
248 | 253 | ||