Linux Audio

Check our new training course

Loading...
v3.5.6
  1/*
  2 * Architecture specific (i386/x86_64) functions for kexec based crash dumps.
  3 *
  4 * Created by: Hariprasad Nellitheertha (hari@in.ibm.com)
  5 *
  6 * Copyright (C) IBM Corporation, 2004. All rights reserved.
  7 *
  8 */
  9
 10#include <linux/init.h>
 11#include <linux/types.h>
 12#include <linux/kernel.h>
 13#include <linux/smp.h>
 14#include <linux/reboot.h>
 15#include <linux/kexec.h>
 16#include <linux/delay.h>
 17#include <linux/elf.h>
 18#include <linux/elfcore.h>
 19
 20#include <asm/processor.h>
 21#include <asm/hardirq.h>
 22#include <asm/nmi.h>
 23#include <asm/hw_irq.h>
 24#include <asm/apic.h>
 25#include <asm/hpet.h>
 26#include <linux/kdebug.h>
 27#include <asm/cpu.h>
 28#include <asm/reboot.h>
 29#include <asm/virtext.h>
 30
 31int in_crash_kexec;
 32
 33#if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC)
 34
 35static void kdump_nmi_callback(int cpu, struct pt_regs *regs)
 36{
 
 37#ifdef CONFIG_X86_32
 38	struct pt_regs fixed_regs;
 39#endif
 
 
 40
 41#ifdef CONFIG_X86_32
 42	if (!user_mode_vm(regs)) {
 43		crash_fixup_ss_esp(&fixed_regs, regs);
 44		regs = &fixed_regs;
 45	}
 46#endif
 47	crash_save_cpu(regs, cpu);
 48
 49	/* Disable VMX or SVM if needed.
 50	 *
 51	 * We need to disable virtualization on all CPUs.
 52	 * Having VMX or SVM enabled on any CPU may break rebooting
 53	 * after the kdump kernel has finished its task.
 54	 */
 55	cpu_emergency_vmxoff();
 56	cpu_emergency_svm_disable();
 57
 58	disable_local_APIC();
 59}
 60
 61static void kdump_nmi_shootdown_cpus(void)
 62{
 63	in_crash_kexec = 1;
 64	nmi_shootdown_cpus(kdump_nmi_callback);
 65
 66	disable_local_APIC();
 67}
 68
 69#else
 70static void kdump_nmi_shootdown_cpus(void)
 71{
 72	/* There are no cpus to shootdown */
 73}
 74#endif
 75
 76void native_machine_crash_shutdown(struct pt_regs *regs)
 77{
 78	/* This function is only called after the system
 79	 * has panicked or is otherwise in a critical state.
 80	 * The minimum amount of code to allow a kexec'd kernel
 81	 * to run successfully needs to happen here.
 82	 *
 83	 * In practice this means shooting down the other cpus in
 84	 * an SMP system.
 85	 */
 86	/* The kernel is broken so disable interrupts */
 87	local_irq_disable();
 88
 89	kdump_nmi_shootdown_cpus();
 90
 91	/* Booting kdump kernel with VMX or SVM enabled won't work,
 92	 * because (among other limitations) we can't disable paging
 93	 * with the virt flags.
 94	 */
 95	cpu_emergency_vmxoff();
 96	cpu_emergency_svm_disable();
 97
 98	lapic_shutdown();
 99#if defined(CONFIG_X86_IO_APIC)
100	disable_IO_APIC();
101#endif
102#ifdef CONFIG_HPET_TIMER
103	hpet_disable();
104#endif
105	crash_save_cpu(regs, safe_smp_processor_id());
106}
v3.1
  1/*
  2 * Architecture specific (i386/x86_64) functions for kexec based crash dumps.
  3 *
  4 * Created by: Hariprasad Nellitheertha (hari@in.ibm.com)
  5 *
  6 * Copyright (C) IBM Corporation, 2004. All rights reserved.
  7 *
  8 */
  9
 10#include <linux/init.h>
 11#include <linux/types.h>
 12#include <linux/kernel.h>
 13#include <linux/smp.h>
 14#include <linux/reboot.h>
 15#include <linux/kexec.h>
 16#include <linux/delay.h>
 17#include <linux/elf.h>
 18#include <linux/elfcore.h>
 19
 20#include <asm/processor.h>
 21#include <asm/hardirq.h>
 22#include <asm/nmi.h>
 23#include <asm/hw_irq.h>
 24#include <asm/apic.h>
 25#include <asm/hpet.h>
 26#include <linux/kdebug.h>
 27#include <asm/cpu.h>
 28#include <asm/reboot.h>
 29#include <asm/virtext.h>
 30
 31int in_crash_kexec;
 32
 33#if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC)
 34
 35static void kdump_nmi_callback(int cpu, struct die_args *args)
 36{
 37	struct pt_regs *regs;
 38#ifdef CONFIG_X86_32
 39	struct pt_regs fixed_regs;
 40#endif
 41
 42	regs = args->regs;
 43
 44#ifdef CONFIG_X86_32
 45	if (!user_mode_vm(regs)) {
 46		crash_fixup_ss_esp(&fixed_regs, regs);
 47		regs = &fixed_regs;
 48	}
 49#endif
 50	crash_save_cpu(regs, cpu);
 51
 52	/* Disable VMX or SVM if needed.
 53	 *
 54	 * We need to disable virtualization on all CPUs.
 55	 * Having VMX or SVM enabled on any CPU may break rebooting
 56	 * after the kdump kernel has finished its task.
 57	 */
 58	cpu_emergency_vmxoff();
 59	cpu_emergency_svm_disable();
 60
 61	disable_local_APIC();
 62}
 63
 64static void kdump_nmi_shootdown_cpus(void)
 65{
 66	in_crash_kexec = 1;
 67	nmi_shootdown_cpus(kdump_nmi_callback);
 68
 69	disable_local_APIC();
 70}
 71
 72#else
 73static void kdump_nmi_shootdown_cpus(void)
 74{
 75	/* There are no cpus to shootdown */
 76}
 77#endif
 78
 79void native_machine_crash_shutdown(struct pt_regs *regs)
 80{
 81	/* This function is only called after the system
 82	 * has panicked or is otherwise in a critical state.
 83	 * The minimum amount of code to allow a kexec'd kernel
 84	 * to run successfully needs to happen here.
 85	 *
 86	 * In practice this means shooting down the other cpus in
 87	 * an SMP system.
 88	 */
 89	/* The kernel is broken so disable interrupts */
 90	local_irq_disable();
 91
 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
101	lapic_shutdown();
102#if defined(CONFIG_X86_IO_APIC)
103	disable_IO_APIC();
104#endif
105#ifdef CONFIG_HPET_TIMER
106	hpet_disable();
107#endif
108	crash_save_cpu(regs, safe_smp_processor_id());
109}