linux/arch/mips/kernel/irq.c
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * Code to handle x86 style IRQs plus some generic interrupt stuff.
   7 *
   8 * Copyright (C) 1992 Linus Torvalds
   9 * Copyright (C) 1994 - 2000 Ralf Baechle
  10 */
  11#include <linux/kernel.h>
  12#include <linux/delay.h>
  13#include <linux/init.h>
  14#include <linux/interrupt.h>
  15#include <linux/kernel_stat.h>
  16#include <linux/proc_fs.h>
  17#include <linux/mm.h>
  18#include <linux/random.h>
  19#include <linux/sched.h>
  20#include <linux/seq_file.h>
  21#include <linux/kallsyms.h>
  22#include <linux/kgdb.h>
  23#include <linux/ftrace.h>
  24
  25#include <linux/atomic.h>
  26#include <asm/uaccess.h>
  27
  28/*
  29 * 'what should we do if we get a hw irq event on an illegal vector'.
  30 * each architecture has to answer this themselves.
  31 */
  32void ack_bad_irq(unsigned int irq)
  33{
  34        printk("unexpected IRQ # %d\n", irq);
  35}
  36
  37atomic_t irq_err_count;
  38
  39int arch_show_interrupts(struct seq_file *p, int prec)
  40{
  41        seq_printf(p, "%*s: %10u\n", prec, "ERR", atomic_read(&irq_err_count));
  42        return 0;
  43}
  44
  45asmlinkage void spurious_interrupt(void)
  46{
  47        atomic_inc(&irq_err_count);
  48}
  49
  50void __init init_IRQ(void)
  51{
  52        int i;
  53
  54        for (i = 0; i < NR_IRQS; i++)
  55                irq_set_noprobe(i);
  56
  57        if (cpu_has_veic)
  58                clear_c0_status(ST0_IM);
  59
  60        arch_init_irq();
  61}
  62
  63#ifdef CONFIG_DEBUG_STACKOVERFLOW
  64static inline void check_stack_overflow(void)
  65{
  66        unsigned long sp;
  67
  68        __asm__ __volatile__("move %0, $sp" : "=r" (sp));
  69        sp &= THREAD_MASK;
  70
  71        /*
  72         * Check for stack overflow: is there less than STACK_WARN free?
  73         * STACK_WARN is defined as 1/8 of THREAD_SIZE by default.
  74         */
  75        if (unlikely(sp < (sizeof(struct thread_info) + STACK_WARN))) {
  76                printk("do_IRQ: stack overflow: %ld\n",
  77                       sp - sizeof(struct thread_info));
  78                dump_stack();
  79        }
  80}
  81#else
  82static inline void check_stack_overflow(void) {}
  83#endif
  84
  85
  86/*
  87 * do_IRQ handles all normal device IRQ's (the special
  88 * SMP cross-CPU interrupts have their own specific
  89 * handlers).
  90 */
  91void __irq_entry do_IRQ(unsigned int irq)
  92{
  93        irq_enter();
  94        check_stack_overflow();
  95        generic_handle_irq(irq);
  96        irq_exit();
  97}
  98
  99