10 #include <linux/kexec.h>
11 #include <linux/string.h>
13 #include <linux/reboot.h>
19 #include <asm/pgtable.h>
20 #include <asm/tlbflush.h>
21 #include <asm/mmu_context.h>
24 static int init_one_level2_page(
struct kimage *
image,
pgd_t *pgd,
59 static void init_level2_page(
pmd_t *level2p,
unsigned long addr)
61 unsigned long end_addr;
65 while (addr < end_addr) {
71 static int init_level3_page(
struct kimage *image,
pud_t *level3p,
72 unsigned long addr,
unsigned long last_addr)
74 unsigned long end_addr;
80 while ((addr < last_addr) && (addr < end_addr)) {
90 init_level2_page(level2p, addr);
95 while (addr < end_addr) {
104 static int init_level4_page(
struct kimage *image,
pgd_t *level4p,
105 unsigned long addr,
unsigned long last_addr)
107 unsigned long end_addr;
113 while ((addr < last_addr) && (addr < end_addr)) {
123 result = init_level3_page(image, level3p, addr, last_addr);
130 while (addr < end_addr) {
138 static void free_transition_pgtable(
struct kimage *image)
140 free_page((
unsigned long)image->arch.pud);
141 free_page((
unsigned long)image->arch.pmd);
142 free_page((
unsigned long)image->arch.pte);
145 static int init_transition_pgtable(
struct kimage *image,
pgd_t *pgd)
153 vaddr = (
unsigned long)relocate_kernel;
160 image->arch.pud = pud;
168 image->arch.pmd =
pmd;
176 image->arch.pte =
pte;
183 free_transition_pgtable(image);
188 static int init_pgtable(
struct kimage *image,
unsigned long start_pgtable)
200 result = init_one_level2_page(image, level4p, image->start);
203 return init_transition_pgtable(image, level4p);
206 static void set_idt(
void *newidt,
u16 limit)
212 curidt.address = (
unsigned long)newidt;
221 static void set_gdt(
void *newgdt,
u16 limit)
227 curgdt.address = (
unsigned long)newgdt;
235 static void load_segments(
void)
249 unsigned long start_pgtable;
256 result = init_pgtable(image, start_pgtable);
265 free_transition_pgtable(image);
276 int save_ftrace_enabled;
278 #ifdef CONFIG_KEXEC_JUMP
279 if (image->preserve_context)
283 save_ftrace_enabled = __ftrace_enabled_save();
287 hw_breakpoint_disable();
289 if (image->preserve_context) {
290 #ifdef CONFIG_X86_IO_APIC
310 if (image->type == KEXEC_TYPE_DEFAULT)
334 (
unsigned long)page_list,
336 image->preserve_context);
338 #ifdef CONFIG_KEXEC_JUMP
339 if (image->preserve_context)
343 __ftrace_enabled_restore(save_ftrace_enabled);