diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/arm/kernel/machine_kexec.c | 25 | 
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index 764bd456d84..a30004476e7 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c @@ -7,6 +7,7 @@  #include <linux/delay.h>  #include <linux/reboot.h>  #include <linux/io.h> +#include <linux/irq.h>  #include <asm/pgtable.h>  #include <asm/pgalloc.h>  #include <asm/mmu_context.h> @@ -53,6 +54,29 @@ void machine_crash_nonpanic_core(void *unused)  		cpu_relax();  } +static void machine_kexec_mask_interrupts(void) +{ +	unsigned int i; +	struct irq_desc *desc; + +	for_each_irq_desc(i, desc) { +		struct irq_chip *chip; + +		chip = irq_desc_get_chip(desc); +		if (!chip) +			continue; + +		if (chip->irq_eoi && irqd_irq_inprogress(&desc->irq_data)) +			chip->irq_eoi(&desc->irq_data); + +		if (chip->irq_mask) +			chip->irq_mask(&desc->irq_data); + +		if (chip->irq_disable && !irqd_irq_disabled(&desc->irq_data)) +			chip->irq_disable(&desc->irq_data); +	} +} +  void machine_crash_shutdown(struct pt_regs *regs)  {  	unsigned long msecs; @@ -70,6 +94,7 @@ void machine_crash_shutdown(struct pt_regs *regs)  		printk(KERN_WARNING "Non-crashing CPUs did not react to IPI\n");  	crash_save_cpu(regs, smp_processor_id()); +	machine_kexec_mask_interrupts();  	printk(KERN_INFO "Loading crashdump kernel...\n");  }  |