diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/Kconfig | 5 | ||||
-rw-r--r-- | arch/x86/kernel/machine_kexec_32.c | 12 |
2 files changed, 15 insertions, 2 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 7ecb679f0130..6b2debfabddc 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -1282,9 +1282,10 @@ config CRASH_DUMP | |||
1282 | config KEXEC_JUMP | 1282 | config KEXEC_JUMP |
1283 | bool "kexec jump (EXPERIMENTAL)" | 1283 | bool "kexec jump (EXPERIMENTAL)" |
1284 | depends on EXPERIMENTAL | 1284 | depends on EXPERIMENTAL |
1285 | depends on KEXEC && PM_SLEEP && X86_32 | 1285 | depends on KEXEC && HIBERNATION && X86_32 |
1286 | help | 1286 | help |
1287 | Invoke code in physical address mode via KEXEC | 1287 | Jump between original kernel and kexeced kernel and invoke |
1288 | code in physical address mode via KEXEC | ||
1288 | 1289 | ||
1289 | config PHYSICAL_START | 1290 | config PHYSICAL_START |
1290 | hex "Physical address where the kernel is loaded" if (EMBEDDED || CRASH_DUMP) | 1291 | hex "Physical address where the kernel is loaded" if (EMBEDDED || CRASH_DUMP) |
diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c index 2b67609d0a1c..9fe478d98406 100644 --- a/arch/x86/kernel/machine_kexec_32.c +++ b/arch/x86/kernel/machine_kexec_32.c | |||
@@ -125,6 +125,18 @@ void machine_kexec(struct kimage *image) | |||
125 | /* Interrupts aren't acceptable while we reboot */ | 125 | /* Interrupts aren't acceptable while we reboot */ |
126 | local_irq_disable(); | 126 | local_irq_disable(); |
127 | 127 | ||
128 | if (image->preserve_context) { | ||
129 | #ifdef CONFIG_X86_IO_APIC | ||
130 | /* We need to put APICs in legacy mode so that we can | ||
131 | * get timer interrupts in second kernel. kexec/kdump | ||
132 | * paths already have calls to disable_IO_APIC() in | ||
133 | * one form or other. kexec jump path also need | ||
134 | * one. | ||
135 | */ | ||
136 | disable_IO_APIC(); | ||
137 | #endif | ||
138 | } | ||
139 | |||
128 | control_page = page_address(image->control_code_page); | 140 | control_page = page_address(image->control_code_page); |
129 | memcpy(control_page, relocate_kernel, PAGE_SIZE/2); | 141 | memcpy(control_page, relocate_kernel, PAGE_SIZE/2); |
130 | 142 | ||