2 * handle transition of Linux booting another kernel
3 * Copyright (C) 2002-2005 Eric Biederman <ebiederm@xmission.com>
5 * This source code is licensed under the GNU General Public License,
6 * Version 2. See the file COPYING for more details.
9 #define pr_fmt(fmt) "kexec: " fmt
12 #include <linux/kexec.h>
13 #include <linux/string.h>
14 #include <linux/gfp.h>
15 #include <linux/reboot.h>
16 #include <linux/numa.h>
17 #include <linux/ftrace.h>
19 #include <linux/suspend.h>
20 #include <linux/vmalloc.h>
23 #include <asm/pgtable.h>
24 #include <asm/tlbflush.h>
25 #include <asm/mmu_context.h>
26 #include <asm/io_apic.h>
27 #include <asm/debugreg.h>
28 #include <asm/kexec-bzimage64.h>
29 #include <asm/setup.h>
31 #ifdef CONFIG_KEXEC_FILE
32 static struct kexec_file_ops
*kexec_file_loaders
[] = {
37 static void free_transition_pgtable(struct kimage
*image
)
39 free_page((unsigned long)image
->arch
.pud
);
40 free_page((unsigned long)image
->arch
.pmd
);
41 free_page((unsigned long)image
->arch
.pte
);
44 static int init_transition_pgtable(struct kimage
*image
, pgd_t
*pgd
)
49 unsigned long vaddr
, paddr
;
52 vaddr
= (unsigned long)relocate_kernel
;
53 paddr
= __pa(page_address(image
->control_code_page
)+PAGE_SIZE
);
54 pgd
+= pgd_index(vaddr
);
55 if (!pgd_present(*pgd
)) {
56 pud
= (pud_t
*)get_zeroed_page(GFP_KERNEL
);
59 image
->arch
.pud
= pud
;
60 set_pgd(pgd
, __pgd(__pa(pud
) | _KERNPG_TABLE
));
62 pud
= pud_offset(pgd
, vaddr
);
63 if (!pud_present(*pud
)) {
64 pmd
= (pmd_t
*)get_zeroed_page(GFP_KERNEL
);
67 image
->arch
.pmd
= pmd
;
68 set_pud(pud
, __pud(__pa(pmd
) | _KERNPG_TABLE
));
70 pmd
= pmd_offset(pud
, vaddr
);
71 if (!pmd_present(*pmd
)) {
72 pte
= (pte_t
*)get_zeroed_page(GFP_KERNEL
);
75 image
->arch
.pte
= pte
;
76 set_pmd(pmd
, __pmd(__pa(pte
) | _KERNPG_TABLE
));
78 pte
= pte_offset_kernel(pmd
, vaddr
);
79 set_pte(pte
, pfn_pte(paddr
>> PAGE_SHIFT
, PAGE_KERNEL_EXEC
));
82 free_transition_pgtable(image
);
86 static void *alloc_pgt_page(void *data
)
88 struct kimage
*image
= (struct kimage
*)data
;
92 page
= kimage_alloc_control_pages(image
, 0);
94 p
= page_address(page
);
101 static int init_pgtable(struct kimage
*image
, unsigned long start_pgtable
)
103 struct x86_mapping_info info
= {
104 .alloc_pgt_page
= alloc_pgt_page
,
106 .pmd_flag
= __PAGE_KERNEL_LARGE_EXEC
,
108 unsigned long mstart
, mend
;
113 level4p
= (pgd_t
*)__va(start_pgtable
);
115 for (i
= 0; i
< nr_pfn_mapped
; i
++) {
116 mstart
= pfn_mapped
[i
].start
<< PAGE_SHIFT
;
117 mend
= pfn_mapped
[i
].end
<< PAGE_SHIFT
;
119 result
= kernel_ident_mapping_init(&info
,
120 level4p
, mstart
, mend
);
126 * segments's mem ranges could be outside 0 ~ max_pfn,
127 * for example when jump back to original kernel from kexeced kernel.
128 * or first kernel is booted with user mem map, and second kernel
129 * could be loaded out of that range.
131 for (i
= 0; i
< image
->nr_segments
; i
++) {
132 mstart
= image
->segment
[i
].mem
;
133 mend
= mstart
+ image
->segment
[i
].memsz
;
135 result
= kernel_ident_mapping_init(&info
,
136 level4p
, mstart
, mend
);
142 return init_transition_pgtable(image
, level4p
);
145 static void set_idt(void *newidt
, u16 limit
)
147 struct desc_ptr curidt
;
149 /* x86-64 supports unaliged loads & stores */
151 curidt
.address
= (unsigned long)newidt
;
153 __asm__
__volatile__ (
160 static void set_gdt(void *newgdt
, u16 limit
)
162 struct desc_ptr curgdt
;
164 /* x86-64 supports unaligned loads & stores */
166 curgdt
.address
= (unsigned long)newgdt
;
168 __asm__
__volatile__ (
174 static void load_segments(void)
176 __asm__
__volatile__ (
182 : : "a" (__KERNEL_DS
) : "memory"
186 #ifdef CONFIG_KEXEC_FILE
187 /* Update purgatory as needed after various image segments have been prepared */
188 static int arch_update_purgatory(struct kimage
*image
)
192 if (!image
->file_mode
)
195 /* Setup copying of backup region */
196 if (image
->type
== KEXEC_TYPE_CRASH
) {
197 ret
= kexec_purgatory_get_set_symbol(image
, "backup_dest",
198 &image
->arch
.backup_load_addr
,
199 sizeof(image
->arch
.backup_load_addr
), 0);
203 ret
= kexec_purgatory_get_set_symbol(image
, "backup_src",
204 &image
->arch
.backup_src_start
,
205 sizeof(image
->arch
.backup_src_start
), 0);
209 ret
= kexec_purgatory_get_set_symbol(image
, "backup_sz",
210 &image
->arch
.backup_src_sz
,
211 sizeof(image
->arch
.backup_src_sz
), 0);
218 #else /* !CONFIG_KEXEC_FILE */
219 static inline int arch_update_purgatory(struct kimage
*image
)
223 #endif /* CONFIG_KEXEC_FILE */
225 int machine_kexec_prepare(struct kimage
*image
)
227 unsigned long start_pgtable
;
230 /* Calculate the offsets */
231 start_pgtable
= page_to_pfn(image
->control_code_page
) << PAGE_SHIFT
;
233 /* Setup the identity mapped 64bit page table */
234 result
= init_pgtable(image
, start_pgtable
);
238 /* update purgatory as needed */
239 result
= arch_update_purgatory(image
);
246 void machine_kexec_cleanup(struct kimage
*image
)
248 free_transition_pgtable(image
);
252 * Do not allocate memory (or fail in any way) in machine_kexec().
253 * We are past the point of no return, committed to rebooting now.
255 void machine_kexec(struct kimage
*image
)
257 unsigned long page_list
[PAGES_NR
];
259 int save_ftrace_enabled
;
261 #ifdef CONFIG_KEXEC_JUMP
262 if (image
->preserve_context
)
263 save_processor_state();
266 save_ftrace_enabled
= __ftrace_enabled_save();
268 /* Interrupts aren't acceptable while we reboot */
270 hw_breakpoint_disable();
272 if (image
->preserve_context
) {
273 #ifdef CONFIG_X86_IO_APIC
275 * We need to put APICs in legacy mode so that we can
276 * get timer interrupts in second kernel. kexec/kdump
277 * paths already have calls to disable_IO_APIC() in
278 * one form or other. kexec jump path also need
285 control_page
= page_address(image
->control_code_page
) + PAGE_SIZE
;
286 memcpy(control_page
, relocate_kernel
, KEXEC_CONTROL_CODE_MAX_SIZE
);
288 page_list
[PA_CONTROL_PAGE
] = virt_to_phys(control_page
);
289 page_list
[VA_CONTROL_PAGE
] = (unsigned long)control_page
;
290 page_list
[PA_TABLE_PAGE
] =
291 (unsigned long)__pa(page_address(image
->control_code_page
));
293 if (image
->type
== KEXEC_TYPE_DEFAULT
)
294 page_list
[PA_SWAP_PAGE
] = (page_to_pfn(image
->swap_page
)
298 * The segment registers are funny things, they have both a
299 * visible and an invisible part. Whenever the visible part is
300 * set to a specific selector, the invisible part is loaded
301 * with from a table in memory. At no other time is the
302 * descriptor table in memory accessed.
304 * I take advantage of this here by force loading the
305 * segments, before I zap the gdt with an invalid value.
309 * The gdt & idt are now invalid.
310 * If you want to load them you must set up your own idt & gdt.
312 set_gdt(phys_to_virt(0), 0);
313 set_idt(phys_to_virt(0), 0);
316 image
->start
= relocate_kernel((unsigned long)image
->head
,
317 (unsigned long)page_list
,
319 image
->preserve_context
);
321 #ifdef CONFIG_KEXEC_JUMP
322 if (image
->preserve_context
)
323 restore_processor_state();
326 __ftrace_enabled_restore(save_ftrace_enabled
);
329 void arch_crash_save_vmcoreinfo(void)
331 VMCOREINFO_SYMBOL(phys_base
);
332 VMCOREINFO_SYMBOL(init_level4_pgt
);
335 VMCOREINFO_SYMBOL(node_data
);
336 VMCOREINFO_LENGTH(node_data
, MAX_NUMNODES
);
338 vmcoreinfo_append_str("KERNELOFFSET=%lx\n",
342 /* arch-dependent functionality related to kexec file-based syscall */
344 #ifdef CONFIG_KEXEC_FILE
345 int arch_kexec_kernel_image_probe(struct kimage
*image
, void *buf
,
346 unsigned long buf_len
)
348 int i
, ret
= -ENOEXEC
;
349 struct kexec_file_ops
*fops
;
351 for (i
= 0; i
< ARRAY_SIZE(kexec_file_loaders
); i
++) {
352 fops
= kexec_file_loaders
[i
];
353 if (!fops
|| !fops
->probe
)
356 ret
= fops
->probe(buf
, buf_len
);
366 void *arch_kexec_kernel_image_load(struct kimage
*image
)
368 vfree(image
->arch
.elf_headers
);
369 image
->arch
.elf_headers
= NULL
;
371 if (!image
->fops
|| !image
->fops
->load
)
372 return ERR_PTR(-ENOEXEC
);
374 return image
->fops
->load(image
, image
->kernel_buf
,
375 image
->kernel_buf_len
, image
->initrd_buf
,
376 image
->initrd_buf_len
, image
->cmdline_buf
,
377 image
->cmdline_buf_len
);
380 int arch_kimage_file_post_load_cleanup(struct kimage
*image
)
382 if (!image
->fops
|| !image
->fops
->cleanup
)
385 return image
->fops
->cleanup(image
->image_loader_data
);
388 int arch_kexec_kernel_verify_sig(struct kimage
*image
, void *kernel
,
389 unsigned long kernel_len
)
391 if (!image
->fops
|| !image
->fops
->verify_sig
) {
392 pr_debug("kernel loader does not support signature verification.");
393 return -EKEYREJECTED
;
396 return image
->fops
->verify_sig(kernel
, kernel_len
);
400 * Apply purgatory relocations.
402 * ehdr: Pointer to elf headers
403 * sechdrs: Pointer to section headers.
404 * relsec: section index of SHT_RELA section.
406 * TODO: Some of the code belongs to generic code. Move that in kexec.c.
408 int arch_kexec_apply_relocations_add(const Elf64_Ehdr
*ehdr
,
409 Elf64_Shdr
*sechdrs
, unsigned int relsec
)
415 Elf64_Shdr
*section
, *symtabsec
;
416 unsigned long address
, sec_base
, value
;
417 const char *strtab
, *name
, *shstrtab
;
420 * ->sh_offset has been modified to keep the pointer to section
423 rel
= (void *)sechdrs
[relsec
].sh_offset
;
425 /* Section to which relocations apply */
426 section
= &sechdrs
[sechdrs
[relsec
].sh_info
];
428 pr_debug("Applying relocate section %u to %u\n", relsec
,
429 sechdrs
[relsec
].sh_info
);
431 /* Associated symbol table */
432 symtabsec
= &sechdrs
[sechdrs
[relsec
].sh_link
];
435 if (symtabsec
->sh_link
>= ehdr
->e_shnum
) {
436 /* Invalid strtab section number */
437 pr_err("Invalid string table section index %d\n",
442 strtab
= (char *)sechdrs
[symtabsec
->sh_link
].sh_offset
;
444 /* section header string table */
445 shstrtab
= (char *)sechdrs
[ehdr
->e_shstrndx
].sh_offset
;
447 for (i
= 0; i
< sechdrs
[relsec
].sh_size
/ sizeof(*rel
); i
++) {
450 * rel[i].r_offset contains byte offset from beginning
451 * of section to the storage unit affected.
453 * This is location to update (->sh_offset). This is temporary
454 * buffer where section is currently loaded. This will finally
455 * be loaded to a different address later, pointed to by
456 * ->sh_addr. kexec takes care of moving it
457 * (kexec_load_segment()).
459 location
= (void *)(section
->sh_offset
+ rel
[i
].r_offset
);
461 /* Final address of the location */
462 address
= section
->sh_addr
+ rel
[i
].r_offset
;
465 * rel[i].r_info contains information about symbol table index
466 * w.r.t which relocation must be made and type of relocation
467 * to apply. ELF64_R_SYM() and ELF64_R_TYPE() macros get
468 * these respectively.
470 sym
= (Elf64_Sym
*)symtabsec
->sh_offset
+
471 ELF64_R_SYM(rel
[i
].r_info
);
474 name
= strtab
+ sym
->st_name
;
476 name
= shstrtab
+ sechdrs
[sym
->st_shndx
].sh_name
;
478 pr_debug("Symbol: %s info: %02x shndx: %02x value=%llx size: %llx\n",
479 name
, sym
->st_info
, sym
->st_shndx
, sym
->st_value
,
482 if (sym
->st_shndx
== SHN_UNDEF
) {
483 pr_err("Undefined symbol: %s\n", name
);
487 if (sym
->st_shndx
== SHN_COMMON
) {
488 pr_err("symbol '%s' in common section\n", name
);
492 if (sym
->st_shndx
== SHN_ABS
)
494 else if (sym
->st_shndx
>= ehdr
->e_shnum
) {
495 pr_err("Invalid section %d for symbol %s\n",
496 sym
->st_shndx
, name
);
499 sec_base
= sechdrs
[sym
->st_shndx
].sh_addr
;
501 value
= sym
->st_value
;
503 value
+= rel
[i
].r_addend
;
505 switch (ELF64_R_TYPE(rel
[i
].r_info
)) {
509 *(u64
*)location
= value
;
512 *(u32
*)location
= value
;
513 if (value
!= *(u32
*)location
)
517 *(s32
*)location
= value
;
518 if ((s64
)value
!= *(s32
*)location
)
522 value
-= (u64
)address
;
523 *(u32
*)location
= value
;
526 pr_err("Unknown rela relocation: %llu\n",
527 ELF64_R_TYPE(rel
[i
].r_info
));
534 pr_err("Overflow in relocation type %d value 0x%lx\n",
535 (int)ELF64_R_TYPE(rel
[i
].r_info
), value
);
538 #endif /* CONFIG_KEXEC_FILE */