Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64...
[linux-2.6-block.git] / arch / arm64 / kernel / irq.c
index c70034fbd4ce0e9820d07ae9279f4c28643c3e7f..04a327ccf84da11d32cb1a46814b16b97e0306dd 100644 (file)
 #include <linux/smp.h>
 #include <linux/init.h>
 #include <linux/irqchip.h>
+#include <linux/kprobes.h>
 #include <linux/seq_file.h>
 #include <linux/vmalloc.h>
+#include <asm/daifflags.h>
 #include <asm/vmap_stack.h>
 
 unsigned long irq_err_count;
@@ -64,4 +66,28 @@ void __init init_IRQ(void)
        irqchip_init();
        if (!handle_arch_irq)
                panic("No interrupt controller found.");
+
+       if (system_uses_irq_prio_masking()) {
+               /*
+                * Now that we have a stack for our IRQ handler, set
+                * the PMR/PSR pair to a consistent state.
+                */
+               WARN_ON(read_sysreg(daif) & PSR_A_BIT);
+               local_daif_restore(DAIF_PROCCTX_NOIRQ);
+       }
+}
+
+/*
+ * Stubs to make nmi_enter/exit() code callable from ASM
+ */
+asmlinkage void notrace asm_nmi_enter(void)
+{
+       nmi_enter();
+}
+NOKPROBE_SYMBOL(asm_nmi_enter);
+
+asmlinkage void notrace asm_nmi_exit(void)
+{
+       nmi_exit();
 }
+NOKPROBE_SYMBOL(asm_nmi_exit);