irq.c

来自「底层驱动开发」· C语言 代码 · 共 115 行

C
115
字号
/* * *	linux/arch/cris/kernel/irq.c * *      Copyright (c) 2000,2001 Axis Communications AB * *      Authors: Bjorn Wesen (bjornw@axis.com) * * This file contains the code used by various IRQ handling routines: * asking for different IRQ's should be done through these routines * 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. * *//* * IRQ's are in fact implemented a bit like signal handlers for the kernel. * Naturally it's not a 1:1 relation, but there are similarities. */#include <linux/config.h>#include <linux/module.h>#include <linux/ptrace.h>#include <linux/irq.h>#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/slab.h>#include <linux/random.h>#include <linux/init.h>#include <linux/seq_file.h>#include <linux/errno.h>#include <linux/spinlock.h>#include <asm/io.h>void ack_bad_irq(unsigned int irq){	printk("unexpected IRQ trap at vector %02x\n", irq);}int show_interrupts(struct seq_file *p, void *v){	int i = *(loff_t *) v, j;	struct irqaction * action;	unsigned long flags;	if (i == 0) {		seq_printf(p, "           ");		for (j=0; j<NR_CPUS; j++)			if (cpu_online(j))				seq_printf(p, "CPU%d       ",j);		seq_putc(p, '\n');	}	if (i < NR_IRQS) {		spin_lock_irqsave(&irq_desc[i].lock, flags);		action = irq_desc[i].action;		if (!action)			goto skip;		seq_printf(p, "%3d: ",i);#ifndef CONFIG_SMP		seq_printf(p, "%10u ", kstat_irqs(i));#else		for (j = 0; j < NR_CPUS; j++)			if (cpu_online(j))				seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);#endif		seq_printf(p, " %14s", irq_desc[i].handler->typename);		seq_printf(p, "  %s", action->name);		for (action=action->next; action; action = action->next)			seq_printf(p, ", %s", action->name);		seq_putc(p, '\n');skip:		spin_unlock_irqrestore(&irq_desc[i].lock, flags);	}	return 0;}/* called by the assembler IRQ entry functions defined in irq.h * to dispatch the interrupts to registred handlers * interrupts are disabled upon entry - depending on if the * interrupt was registred with SA_INTERRUPT or not, interrupts * are re-enabled or not. */asmlinkage void do_IRQ(int irq, struct pt_regs * regs){	unsigned long sp;	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);	}	__do_IRQ(irq, regs);        irq_exit();}void weird_irq(void){	local_irq_disable();	printk("weird irq\n");	while(1);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?