diff --git a/kernel/driver/interrupt/apic/apic.c b/kernel/driver/interrupt/apic/apic.c index ded669d3..ce8528c6 100644 --- a/kernel/driver/interrupt/apic/apic.c +++ b/kernel/driver/interrupt/apic/apic.c @@ -488,7 +488,7 @@ void do_IRQ(struct pt_regs *rsp, ul number) irq->handler(number, irq->parameter, rsp); } } - else if (number >= 150 && number < 160) + else if (number >= 150 && number < 200) { irq_desc_t *irq = &local_apic_interrupt_desc[number - 150]; diff --git a/kernel/exception/irq.c b/kernel/exception/irq.c index a723a7d6..af922d7e 100644 --- a/kernel/exception/irq.c +++ b/kernel/exception/irq.c @@ -191,7 +191,7 @@ int irq_register(ul irq_num, void *arg, void (*handler)(ul irq_num, ul parameter irq_desc_t *p = NULL; if (irq_num >= 32 && irq_num < 0x80) p = &interrupt_desc[irq_num - 32]; - else if (irq_num >= 150 && irq_num < 160) + else if (irq_num >= 150 && irq_num < 200) p = &local_apic_interrupt_desc[irq_num - 150]; else { diff --git a/kernel/exception/irq.h b/kernel/exception/irq.h index 990848fb..9777d1bb 100644 --- a/kernel/exception/irq.h +++ b/kernel/exception/irq.h @@ -15,8 +15,10 @@ #include +#define IRQ_NUM 24 #define SMP_IRQ_NUM 10 -#define LOCAL_APIC_IRQ_NUM 10 +#define LOCAL_APIC_IRQ_NUM 50 + extern void (*interrupt_table[24])(void); extern void do_IRQ(struct pt_regs *regs, ul number); @@ -84,7 +86,7 @@ extern void (*local_apic_interrupt_table[LOCAL_APIC_IRQ_NUM])(void); 0x80 system call 0x81 system interrupt 系统中断 -150 ~ 200 Local APIC +[150,200) Local APIC 150 CMCI 151 Timer 152 Thermal Monitor @@ -127,10 +129,10 @@ typedef struct ul flags; } irq_desc_t; -#define IRQ_NUM 24 -// 这两个表一定要放在这里,否则在HPET初始化后收到中断,会产生page fault + +// 这几个表一定要放在这里,否则在HPET初始化后收到中断,会产生page fault irq_desc_t interrupt_desc[IRQ_NUM] = {0}; -irq_desc_t local_apic_interrupt_desc[20] = {0}; +irq_desc_t local_apic_interrupt_desc[LOCAL_APIC_IRQ_NUM] = {0}; irq_desc_t SMP_IPI_desc[SMP_IRQ_NUM] = {0};