diff options
Diffstat (limited to 'arch/x86/kernel/vmlinux_64.lds.S')
| -rw-r--r-- | arch/x86/kernel/vmlinux_64.lds.S | 101 |
1 files changed, 61 insertions, 40 deletions
diff --git a/arch/x86/kernel/vmlinux_64.lds.S b/arch/x86/kernel/vmlinux_64.lds.S index fbfced6f6800..c8742507b030 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,29 @@ 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 | } |
| 251 | |||
| 252 | .brk : AT(ADDR(.brk) - LOAD_OFFSET) { | ||
| 253 | . = ALIGN(PAGE_SIZE); | ||
| 254 | __brk_base = . ; | ||
| 255 | . += 64 * 1024 ; /* 64k alignment slop space */ | ||
| 256 | *(.brk_reservation) /* areas brk users have reserved */ | ||
| 257 | __brk_limit = . ; | ||
| 258 | } | ||
| 246 | 259 | ||
| 247 | _end = . ; | 260 | _end = . ; |
| 248 | 261 | ||
| @@ -250,6 +263,7 @@ SECTIONS | |||
| 250 | /DISCARD/ : { | 263 | /DISCARD/ : { |
| 251 | *(.exitcall.exit) | 264 | *(.exitcall.exit) |
| 252 | *(.eh_frame) | 265 | *(.eh_frame) |
| 266 | *(.discard) | ||
| 253 | } | 267 | } |
| 254 | 268 | ||
| 255 | STABS_DEBUG | 269 | STABS_DEBUG |
| @@ -275,3 +289,10 @@ ASSERT((_end - _text <= KERNEL_IMAGE_SIZE), | |||
| 275 | ASSERT((per_cpu__irq_stack_union == 0), | 289 | ASSERT((per_cpu__irq_stack_union == 0), |
| 276 | "irq_stack_union is not at start of per-cpu area"); | 290 | "irq_stack_union is not at start of per-cpu area"); |
| 277 | #endif | 291 | #endif |
| 292 | |||
| 293 | #ifdef CONFIG_KEXEC | ||
| 294 | #include <asm/kexec.h> | ||
| 295 | |||
| 296 | ASSERT(kexec_control_code_size <= KEXEC_CONTROL_CODE_MAX_SIZE, | ||
| 297 | "kexec control code size is too big") | ||
| 298 | #endif | ||
