version 1.1.1.1, 2008/06/03 10:38:45 |
version 1.1.1.1.2.1, 2008/08/13 17:12:30 |
|
|
#include <kernel.h> |
#include <kernel.h> |
#include <irq.h> |
#include <irq.h> |
#include <cpu.h> |
#include <cpu.h> |
|
#include <locore.h> |
|
|
/* I/O address for master/slave programmable interrupt controller */ |
/* I/O address for master/slave programmable interrupt controller */ |
#define PIC_M 0x20 |
#define PIC_M 0x20 |
|
|
/* |
/* |
* Interrupt priority level |
* Interrupt priority level |
* |
* |
* Each interrupt has its logical priority level, with 0 being the highest |
* Each interrupt has its logical priority level, with 0 being |
* priority. While some ISR is running, all lower priority interrupts |
* the highest priority. While some ISR is running, all lower |
* are masked off. |
* priority interrupts are masked off. |
*/ |
*/ |
volatile int irq_level; |
volatile int irq_level; |
|
|
|
|
|
|
/* |
/* |
* Common interrupt handler. |
* Common interrupt handler. |
* This routine is called from low level interrupt routine written |
* |
* in assemble code. The interrupt flag is automatically disabled |
* This routine is called from low level interrupt routine |
* by h/w in CPU when the interrupt is occurred. |
* written in assemble code. The interrupt flag is automatically |
* The target interrupt will be masked in ICU while the irq handler |
* disabled by h/w in CPU when the interrupt is occurred. The |
|
* target interrupt will be masked in ICU while the irq handler |
* is called. |
* is called. |
*/ |
*/ |
void |
void |
|
|
outb(0x20, PIC_M); /* Non specific EOI to master */ |
outb(0x20, PIC_M); /* Non specific EOI to master */ |
|
|
/* Dispatch interrupt */ |
/* Dispatch interrupt */ |
sti(); |
interrupt_enable(); |
irq_handler(vector); |
irq_handler(vector); |
cli(); |
interrupt_disable(); |
|
|
/* Restore interrupt level */ |
/* Restore interrupt level */ |
irq_level = old_ipl; |
irq_level = old_ipl; |
update_mask(); |
update_mask(); |
|
} |
|
|
|
void interrupt_save(int *sts) |
|
{ |
|
*sts = (int)(get_eflags() & EFL_IF); |
|
} |
|
|
|
void interrupt_restore(int sts) |
|
{ |
|
set_eflags((get_eflags() & ~EFL_IF) | sts); |
} |
} |
|
|
/* |
/* |