2005-04-17 02:20:36 +04:00
/*
*
* linux / arch / cris / kernel / irq . c
*
2007-11-15 04:00:52 +03:00
* Copyright ( c ) 2000 , 2007 Axis Communications AB
2005-04-17 02:20:36 +04:00
*
* Authors : Bjorn Wesen ( bjornw @ axis . com )
*
* This file contains the code used by various IRQ handling routines :
2007-10-20 03:08:50 +04:00
* asking for different IRQs should be done through these routines
2005-04-17 02:20:36 +04:00
* instead of just grabbing them . Thus setups with different IRQ numbers
* shouldn ' t result in any weird surprises , and installing new handlers
* should be easier .
*
*/
/*
2007-10-20 03:08:50 +04:00
* IRQs are in fact implemented a bit like signal handlers for the kernel .
2005-04-17 02:20:36 +04:00
* Naturally it ' s not a 1 : 1 relation , but there are similarities .
*/
# include <linux/module.h>
# include <linux/ptrace.h>
2005-07-27 22:44:36 +04:00
# include <linux/irq.h>
2005-04-17 02:20:36 +04:00
# include <linux/kernel_stat.h>
# include <linux/signal.h>
# include <linux/sched.h>
# include <linux/ioport.h>
# include <linux/interrupt.h>
# include <linux/timex.h>
# include <linux/random.h>
# include <linux/init.h>
# include <linux/seq_file.h>
# include <linux/errno.h>
2005-07-27 22:44:36 +04:00
# include <linux/spinlock.h>
2005-04-17 02:20:36 +04:00
# include <asm/io.h>
2012-03-28 21:30:02 +04:00
# include <arch/system.h>
2005-04-17 02:20:36 +04:00
/* called by the assembler IRQ entry functions defined in irq.h
2007-10-20 03:08:50 +04:00
* to dispatch the interrupts to registered handlers
2005-04-17 02:20:36 +04:00
* interrupts are disabled upon entry - depending on if the
2007-10-20 03:08:50 +04:00
* interrupt was registered with IRQF_DISABLED or not , interrupts
2005-04-17 02:20:36 +04:00
* are re - enabled or not .
*/
asmlinkage void do_IRQ ( int irq , struct pt_regs * regs )
{
2005-07-27 22:44:36 +04:00
unsigned long sp ;
2007-11-15 04:00:52 +03:00
struct pt_regs * old_regs = set_irq_regs ( regs ) ;
2005-07-27 22:44:36 +04:00
irq_enter ( ) ;
sp = rdsp ( ) ;
if ( unlikely ( ( sp & ( PAGE_SIZE - 1 ) ) < ( PAGE_SIZE / 8 ) ) ) {
printk ( " do_IRQ: stack overflow: %lX \n " , sp ) ;
show_stack ( NULL , ( unsigned long * ) sp ) ;
2005-04-17 02:20:36 +04:00
}
2011-01-19 15:59:01 +03:00
generic_handle_irq ( irq ) ;
irq_exit ( ) ;
2007-11-15 04:00:52 +03:00
set_irq_regs ( old_regs ) ;
2005-04-17 02:20:36 +04:00
}
void weird_irq ( void )
{
local_irq_disable ( ) ;
printk ( " weird irq \n " ) ;
while ( 1 ) ;
}