diff options
Diffstat (limited to 'arch/x86/kernel/crash.c')
| -rw-r--r-- | arch/x86/kernel/crash.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c index d84a852e4cd7..c689d19e35ab 100644 --- a/arch/x86/kernel/crash.c +++ b/arch/x86/kernel/crash.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/kdebug.h> | 26 | #include <linux/kdebug.h> |
| 27 | #include <asm/smp.h> | 27 | #include <asm/smp.h> |
| 28 | #include <asm/reboot.h> | 28 | #include <asm/reboot.h> |
| 29 | #include <asm/virtext.h> | ||
| 29 | 30 | ||
| 30 | #include <mach_ipi.h> | 31 | #include <mach_ipi.h> |
| 31 | 32 | ||
| @@ -49,6 +50,15 @@ static void kdump_nmi_callback(int cpu, struct die_args *args) | |||
| 49 | #endif | 50 | #endif |
| 50 | crash_save_cpu(regs, cpu); | 51 | crash_save_cpu(regs, cpu); |
| 51 | 52 | ||
| 53 | /* Disable VMX or SVM if needed. | ||
| 54 | * | ||
| 55 | * We need to disable virtualization on all CPUs. | ||
| 56 | * Having VMX or SVM enabled on any CPU may break rebooting | ||
| 57 | * after the kdump kernel has finished its task. | ||
| 58 | */ | ||
| 59 | cpu_emergency_vmxoff(); | ||
| 60 | cpu_emergency_svm_disable(); | ||
| 61 | |||
| 52 | disable_local_APIC(); | 62 | disable_local_APIC(); |
| 53 | } | 63 | } |
| 54 | 64 | ||
| @@ -80,6 +90,14 @@ void native_machine_crash_shutdown(struct pt_regs *regs) | |||
| 80 | local_irq_disable(); | 90 | local_irq_disable(); |
| 81 | 91 | ||
| 82 | kdump_nmi_shootdown_cpus(); | 92 | kdump_nmi_shootdown_cpus(); |
| 93 | |||
| 94 | /* Booting kdump kernel with VMX or SVM enabled won't work, | ||
| 95 | * because (among other limitations) we can't disable paging | ||
| 96 | * with the virt flags. | ||
| 97 | */ | ||
| 98 | cpu_emergency_vmxoff(); | ||
| 99 | cpu_emergency_svm_disable(); | ||
| 100 | |||
| 83 | lapic_shutdown(); | 101 | lapic_shutdown(); |
| 84 | #if defined(CONFIG_X86_IO_APIC) | 102 | #if defined(CONFIG_X86_IO_APIC) |
| 85 | disable_IO_APIC(); | 103 | disable_IO_APIC(); |
