|
@@ -26,6 +26,7 @@
|
|
#include <linux/kdebug.h>
|
|
#include <linux/kdebug.h>
|
|
#include <asm/smp.h>
|
|
#include <asm/smp.h>
|
|
#include <asm/reboot.h>
|
|
#include <asm/reboot.h>
|
|
|
|
+#include <asm/virtext.h>
|
|
|
|
|
|
#include <mach_ipi.h>
|
|
#include <mach_ipi.h>
|
|
|
|
|
|
@@ -49,6 +50,15 @@ static void kdump_nmi_callback(int cpu, struct die_args *args)
|
|
#endif
|
|
#endif
|
|
crash_save_cpu(regs, cpu);
|
|
crash_save_cpu(regs, cpu);
|
|
|
|
|
|
|
|
+ /* Disable VMX or SVM if needed.
|
|
|
|
+ *
|
|
|
|
+ * We need to disable virtualization on all CPUs.
|
|
|
|
+ * Having VMX or SVM enabled on any CPU may break rebooting
|
|
|
|
+ * after the kdump kernel has finished its task.
|
|
|
|
+ */
|
|
|
|
+ cpu_emergency_vmxoff();
|
|
|
|
+ cpu_emergency_svm_disable();
|
|
|
|
+
|
|
disable_local_APIC();
|
|
disable_local_APIC();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -80,6 +90,14 @@ void native_machine_crash_shutdown(struct pt_regs *regs)
|
|
local_irq_disable();
|
|
local_irq_disable();
|
|
|
|
|
|
kdump_nmi_shootdown_cpus();
|
|
kdump_nmi_shootdown_cpus();
|
|
|
|
+
|
|
|
|
+ /* Booting kdump kernel with VMX or SVM enabled won't work,
|
|
|
|
+ * because (among other limitations) we can't disable paging
|
|
|
|
+ * with the virt flags.
|
|
|
|
+ */
|
|
|
|
+ cpu_emergency_vmxoff();
|
|
|
|
+ cpu_emergency_svm_disable();
|
|
|
|
+
|
|
lapic_shutdown();
|
|
lapic_shutdown();
|
|
#if defined(CONFIG_X86_IO_APIC)
|
|
#if defined(CONFIG_X86_IO_APIC)
|
|
disable_IO_APIC();
|
|
disable_IO_APIC();
|