Linux Audio

Check our new training course

Loading...
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}
v3.15
  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/types.h>
 11#include <linux/kernel.h>
 12#include <linux/smp.h>
 13#include <linux/reboot.h>
 14#include <linux/kexec.h>
 15#include <linux/delay.h>
 16#include <linux/elf.h>
 17#include <linux/elfcore.h>
 18#include <linux/module.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/*
 34 * This is used to VMCLEAR all VMCSs loaded on the
 35 * processor. And when loading kvm_intel module, the
 36 * callback function pointer will be assigned.
 37 *
 38 * protected by rcu.
 39 */
 40crash_vmclear_fn __rcu *crash_vmclear_loaded_vmcss = NULL;
 41EXPORT_SYMBOL_GPL(crash_vmclear_loaded_vmcss);
 42
 43static inline void cpu_crash_vmclear_loaded_vmcss(void)
 44{
 45	crash_vmclear_fn *do_vmclear_operation = NULL;
 46
 47	rcu_read_lock();
 48	do_vmclear_operation = rcu_dereference(crash_vmclear_loaded_vmcss);
 49	if (do_vmclear_operation)
 50		do_vmclear_operation();
 51	rcu_read_unlock();
 52}
 53
 54#if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC)
 55
 56static void kdump_nmi_callback(int cpu, struct pt_regs *regs)
 57{
 
 58#ifdef CONFIG_X86_32
 59	struct pt_regs fixed_regs;
 
 
 
 60
 
 61	if (!user_mode_vm(regs)) {
 62		crash_fixup_ss_esp(&fixed_regs, regs);
 63		regs = &fixed_regs;
 64	}
 65#endif
 66	crash_save_cpu(regs, cpu);
 67
 68	/*
 69	 * VMCLEAR VMCSs loaded on all cpus if needed.
 70	 */
 71	cpu_crash_vmclear_loaded_vmcss();
 72
 73	/* Disable VMX or SVM if needed.
 74	 *
 75	 * We need to disable virtualization on all CPUs.
 76	 * Having VMX or SVM enabled on any CPU may break rebooting
 77	 * after the kdump kernel has finished its task.
 78	 */
 79	cpu_emergency_vmxoff();
 80	cpu_emergency_svm_disable();
 81
 82	disable_local_APIC();
 83}
 84
 85static void kdump_nmi_shootdown_cpus(void)
 86{
 87	in_crash_kexec = 1;
 88	nmi_shootdown_cpus(kdump_nmi_callback);
 89
 90	disable_local_APIC();
 91}
 92
 93#else
 94static void kdump_nmi_shootdown_cpus(void)
 95{
 96	/* There are no cpus to shootdown */
 97}
 98#endif
 99
100void native_machine_crash_shutdown(struct pt_regs *regs)
101{
102	/* This function is only called after the system
103	 * has panicked or is otherwise in a critical state.
104	 * The minimum amount of code to allow a kexec'd kernel
105	 * to run successfully needs to happen here.
106	 *
107	 * In practice this means shooting down the other cpus in
108	 * an SMP system.
109	 */
110	/* The kernel is broken so disable interrupts */
111	local_irq_disable();
112
113	kdump_nmi_shootdown_cpus();
114
115	/*
116	 * VMCLEAR VMCSs loaded on this cpu if needed.
117	 */
118	cpu_crash_vmclear_loaded_vmcss();
119
120	/* Booting kdump kernel with VMX or SVM enabled won't work,
121	 * because (among other limitations) we can't disable paging
122	 * with the virt flags.
123	 */
124	cpu_emergency_vmxoff();
125	cpu_emergency_svm_disable();
126
127#ifdef CONFIG_X86_IO_APIC
128	/* Prevent crash_kexec() from deadlocking on ioapic_lock. */
129	ioapic_zap_locks();
130	disable_IO_APIC();
131#endif
132	lapic_shutdown();
133#ifdef CONFIG_HPET_TIMER
134	hpet_disable();
135#endif
136	crash_save_cpu(regs, safe_smp_processor_id());
137}