x86_64: expand IDT to 256 entries

This commit is contained in:
2023-05-07 21:43:04 +01:00
parent d8326cfec5
commit ab4eeb8e16
3 changed files with 636 additions and 7 deletions

View File

@@ -9,7 +9,7 @@
extern "C" {
#endif
#define NR_IDT_ENTRIES 48
#define NR_IDT_ENTRIES 256
enum irq_vector {
IRQ0 = 32,

View File

@@ -3,6 +3,7 @@
#include <arch/acpi.h>
#include <socks/printk.h>
#include <socks/sched.h>
#include <socks/cpu.h>
#include <socks/panic.h>
#include <socks/libc/string.h>
#include <socks/machine/irq.h>
@@ -43,7 +44,6 @@ extern void _isr28();
extern void _isr29();
extern void _isr30();
extern void _isr31();
extern void _isr128();
extern void _irq0();
extern void _irq1();
@@ -61,12 +61,220 @@ extern void _irq12();
extern void _irq13();
extern void _irq14();
extern void _irq15();
extern void _irq16();
extern void _irq17();
extern void _irq18();
extern void _irq19();
extern void _irq20();
extern void _irq21();
extern void _irq22();
extern void _irq23();
extern void _irq24();
extern void _irq25();
extern void _irq26();
extern void _irq27();
extern void _irq28();
extern void _irq29();
extern void _irq30();
extern void _irq31();
extern void _irq32();
extern void _irq33();
extern void _irq34();
extern void _irq35();
extern void _irq36();
extern void _irq37();
extern void _irq38();
extern void _irq39();
extern void _irq40();
extern void _irq41();
extern void _irq42();
extern void _irq43();
extern void _irq44();
extern void _irq45();
extern void _irq46();
extern void _irq47();
extern void _irq48();
extern void _irq49();
extern void _irq50();
extern void _irq51();
extern void _irq52();
extern void _irq53();
extern void _irq54();
extern void _irq55();
extern void _irq56();
extern void _irq57();
extern void _irq58();
extern void _irq59();
extern void _irq60();
extern void _irq61();
extern void _irq62();
extern void _irq63();
extern void _irq64();
extern void _irq65();
extern void _irq66();
extern void _irq67();
extern void _irq68();
extern void _irq69();
extern void _irq70();
extern void _irq71();
extern void _irq72();
extern void _irq73();
extern void _irq74();
extern void _irq75();
extern void _irq76();
extern void _irq77();
extern void _irq78();
extern void _irq79();
extern void _irq80();
extern void _irq81();
extern void _irq82();
extern void _irq83();
extern void _irq84();
extern void _irq85();
extern void _irq86();
extern void _irq87();
extern void _irq88();
extern void _irq89();
extern void _irq90();
extern void _irq91();
extern void _irq92();
extern void _irq93();
extern void _irq94();
extern void _irq95();
extern void _irq96();
extern void _irq97();
extern void _irq98();
extern void _irq99();
extern void _irq100();
extern void _irq101();
extern void _irq102();
extern void _irq103();
extern void _irq104();
extern void _irq105();
extern void _irq106();
extern void _irq107();
extern void _irq108();
extern void _irq109();
extern void _irq110();
extern void _irq111();
extern void _irq112();
extern void _irq113();
extern void _irq114();
extern void _irq115();
extern void _irq116();
extern void _irq117();
extern void _irq118();
extern void _irq119();
extern void _irq120();
extern void _irq121();
extern void _irq122();
extern void _irq123();
extern void _irq124();
extern void _irq125();
extern void _irq126();
extern void _irq127();
extern void _irq128();
extern void _irq129();
extern void _irq130();
extern void _irq131();
extern void _irq132();
extern void _irq133();
extern void _irq134();
extern void _irq135();
extern void _irq136();
extern void _irq137();
extern void _irq138();
extern void _irq139();
extern void _irq140();
extern void _irq141();
extern void _irq142();
extern void _irq143();
extern void _irq144();
extern void _irq145();
extern void _irq146();
extern void _irq147();
extern void _irq148();
extern void _irq149();
extern void _irq150();
extern void _irq151();
extern void _irq152();
extern void _irq153();
extern void _irq154();
extern void _irq155();
extern void _irq156();
extern void _irq157();
extern void _irq158();
extern void _irq159();
extern void _irq160();
extern void _irq161();
extern void _irq162();
extern void _irq163();
extern void _irq164();
extern void _irq165();
extern void _irq166();
extern void _irq167();
extern void _irq168();
extern void _irq169();
extern void _irq170();
extern void _irq171();
extern void _irq172();
extern void _irq173();
extern void _irq174();
extern void _irq175();
extern void _irq176();
extern void _irq177();
extern void _irq178();
extern void _irq179();
extern void _irq180();
extern void _irq181();
extern void _irq182();
extern void _irq183();
extern void _irq184();
extern void _irq185();
extern void _irq186();
extern void _irq187();
extern void _irq188();
extern void _irq189();
extern void _irq190();
extern void _irq191();
extern void _irq192();
extern void _irq193();
extern void _irq194();
extern void _irq195();
extern void _irq196();
extern void _irq197();
extern void _irq198();
extern void _irq199();
extern void _irq200();
extern void _irq201();
extern void _irq202();
extern void _irq203();
extern void _irq204();
extern void _irq205();
extern void _irq206();
extern void _irq207();
extern void _irq208();
extern void _irq209();
extern void _irq210();
extern void _irq211();
extern void _irq212();
extern void _irq213();
extern void _irq214();
extern void _irq215();
extern void _irq216();
extern void _irq217();
extern void _irq218();
extern void _irq219();
extern void _irq220();
extern void _irq221();
extern void _irq222();
extern void _irq223();
extern void syscall_gate();
extern uintptr_t pf_faultptr(void);
static int_hook isr_handlers[NR_IDT_ENTRIES];
static struct queue irq_hooks[32];
static struct queue irq_hooks[223];
static struct idt idt;
static int idt_initialised = 0;
@@ -88,10 +296,11 @@ static void set_idt_gate(struct idt *idt, uint8_t index, uintptr_t base, uint16_
static void gpf_handler(struct cpu_context *regs)
{
int ext = regs->err_no & 1;
int table = (regs->err_no >> 1) & 2;
int index = (regs->err_no >> 3) & 13;
int table = (regs->err_no >> 1) & 0x03;
int index = (regs->err_no >> 3) & 0x1FFF;
panic_irq(regs, "general protection fault (%08x %08x %08x %016llx)", ext, table, index, regs->rip);
panic_irq(regs, "general protection fault (%016llx %02x %02x %04x %016llx)",
regs->err_no, ext, table, index, regs->rip);
}
static void pf_handler(struct cpu_context *regs)
@@ -200,6 +409,214 @@ static void init_global_idt(void)
set_idt_gate(&idt, 45, (uintptr_t)_irq13, 0x08, 0x8E);
set_idt_gate(&idt, 46, (uintptr_t)_irq14, 0x08, 0x8E);
set_idt_gate(&idt, 47, (uintptr_t)_irq15, 0x08, 0x8E);
set_idt_gate(&idt, 48, (uintptr_t)_irq16, 0x08, 0x8E);
set_idt_gate(&idt, 49, (uintptr_t)_irq17, 0x08, 0x8E);
set_idt_gate(&idt, 50, (uintptr_t)_irq18, 0x08, 0x8E);
set_idt_gate(&idt, 51, (uintptr_t)_irq19, 0x08, 0x8E);
set_idt_gate(&idt, 52, (uintptr_t)_irq20, 0x08, 0x8E);
set_idt_gate(&idt, 53, (uintptr_t)_irq21, 0x08, 0x8E);
set_idt_gate(&idt, 54, (uintptr_t)_irq22, 0x08, 0x8E);
set_idt_gate(&idt, 55, (uintptr_t)_irq23, 0x08, 0x8E);
set_idt_gate(&idt, 56, (uintptr_t)_irq24, 0x08, 0x8E);
set_idt_gate(&idt, 57, (uintptr_t)_irq25, 0x08, 0x8E);
set_idt_gate(&idt, 58, (uintptr_t)_irq26, 0x08, 0x8E);
set_idt_gate(&idt, 59, (uintptr_t)_irq27, 0x08, 0x8E);
set_idt_gate(&idt, 60, (uintptr_t)_irq28, 0x08, 0x8E);
set_idt_gate(&idt, 61, (uintptr_t)_irq29, 0x08, 0x8E);
set_idt_gate(&idt, 62, (uintptr_t)_irq30, 0x08, 0x8E);
set_idt_gate(&idt, 63, (uintptr_t)_irq31, 0x08, 0x8E);
set_idt_gate(&idt, 64, (uintptr_t)_irq32, 0x08, 0x8E);
set_idt_gate(&idt, 65, (uintptr_t)_irq33, 0x08, 0x8E);
set_idt_gate(&idt, 66, (uintptr_t)_irq34, 0x08, 0x8E);
set_idt_gate(&idt, 67, (uintptr_t)_irq35, 0x08, 0x8E);
set_idt_gate(&idt, 68, (uintptr_t)_irq36, 0x08, 0x8E);
set_idt_gate(&idt, 69, (uintptr_t)_irq37, 0x08, 0x8E);
set_idt_gate(&idt, 70, (uintptr_t)_irq38, 0x08, 0x8E);
set_idt_gate(&idt, 71, (uintptr_t)_irq39, 0x08, 0x8E);
set_idt_gate(&idt, 72, (uintptr_t)_irq40, 0x08, 0x8E);
set_idt_gate(&idt, 73, (uintptr_t)_irq41, 0x08, 0x8E);
set_idt_gate(&idt, 74, (uintptr_t)_irq42, 0x08, 0x8E);
set_idt_gate(&idt, 75, (uintptr_t)_irq43, 0x08, 0x8E);
set_idt_gate(&idt, 76, (uintptr_t)_irq44, 0x08, 0x8E);
set_idt_gate(&idt, 77, (uintptr_t)_irq45, 0x08, 0x8E);
set_idt_gate(&idt, 78, (uintptr_t)_irq46, 0x08, 0x8E);
set_idt_gate(&idt, 79, (uintptr_t)_irq47, 0x08, 0x8E);
set_idt_gate(&idt, 80, (uintptr_t)_irq48, 0x08, 0x8E);
set_idt_gate(&idt, 81, (uintptr_t)_irq49, 0x08, 0x8E);
set_idt_gate(&idt, 82, (uintptr_t)_irq50, 0x08, 0x8E);
set_idt_gate(&idt, 83, (uintptr_t)_irq51, 0x08, 0x8E);
set_idt_gate(&idt, 84, (uintptr_t)_irq52, 0x08, 0x8E);
set_idt_gate(&idt, 85, (uintptr_t)_irq53, 0x08, 0x8E);
set_idt_gate(&idt, 86, (uintptr_t)_irq54, 0x08, 0x8E);
set_idt_gate(&idt, 87, (uintptr_t)_irq55, 0x08, 0x8E);
set_idt_gate(&idt, 88, (uintptr_t)_irq56, 0x08, 0x8E);
set_idt_gate(&idt, 89, (uintptr_t)_irq57, 0x08, 0x8E);
set_idt_gate(&idt, 90, (uintptr_t)_irq58, 0x08, 0x8E);
set_idt_gate(&idt, 91, (uintptr_t)_irq59, 0x08, 0x8E);
set_idt_gate(&idt, 92, (uintptr_t)_irq60, 0x08, 0x8E);
set_idt_gate(&idt, 93, (uintptr_t)_irq61, 0x08, 0x8E);
set_idt_gate(&idt, 94, (uintptr_t)_irq62, 0x08, 0x8E);
set_idt_gate(&idt, 95, (uintptr_t)_irq63, 0x08, 0x8E);
set_idt_gate(&idt, 96, (uintptr_t)_irq64, 0x08, 0x8E);
set_idt_gate(&idt, 97, (uintptr_t)_irq65, 0x08, 0x8E);
set_idt_gate(&idt, 98, (uintptr_t)_irq66, 0x08, 0x8E);
set_idt_gate(&idt, 99, (uintptr_t)_irq67, 0x08, 0x8E);
set_idt_gate(&idt, 100, (uintptr_t)_irq68, 0x08, 0x8E);
set_idt_gate(&idt, 101, (uintptr_t)_irq69, 0x08, 0x8E);
set_idt_gate(&idt, 102, (uintptr_t)_irq70, 0x08, 0x8E);
set_idt_gate(&idt, 103, (uintptr_t)_irq71, 0x08, 0x8E);
set_idt_gate(&idt, 104, (uintptr_t)_irq72, 0x08, 0x8E);
set_idt_gate(&idt, 105, (uintptr_t)_irq73, 0x08, 0x8E);
set_idt_gate(&idt, 106, (uintptr_t)_irq74, 0x08, 0x8E);
set_idt_gate(&idt, 107, (uintptr_t)_irq75, 0x08, 0x8E);
set_idt_gate(&idt, 108, (uintptr_t)_irq76, 0x08, 0x8E);
set_idt_gate(&idt, 109, (uintptr_t)_irq77, 0x08, 0x8E);
set_idt_gate(&idt, 110, (uintptr_t)_irq78, 0x08, 0x8E);
set_idt_gate(&idt, 111, (uintptr_t)_irq79, 0x08, 0x8E);
set_idt_gate(&idt, 112, (uintptr_t)_irq80, 0x08, 0x8E);
set_idt_gate(&idt, 113, (uintptr_t)_irq81, 0x08, 0x8E);
set_idt_gate(&idt, 114, (uintptr_t)_irq82, 0x08, 0x8E);
set_idt_gate(&idt, 115, (uintptr_t)_irq83, 0x08, 0x8E);
set_idt_gate(&idt, 116, (uintptr_t)_irq84, 0x08, 0x8E);
set_idt_gate(&idt, 117, (uintptr_t)_irq85, 0x08, 0x8E);
set_idt_gate(&idt, 118, (uintptr_t)_irq86, 0x08, 0x8E);
set_idt_gate(&idt, 119, (uintptr_t)_irq87, 0x08, 0x8E);
set_idt_gate(&idt, 120, (uintptr_t)_irq88, 0x08, 0x8E);
set_idt_gate(&idt, 121, (uintptr_t)_irq89, 0x08, 0x8E);
set_idt_gate(&idt, 122, (uintptr_t)_irq90, 0x08, 0x8E);
set_idt_gate(&idt, 123, (uintptr_t)_irq91, 0x08, 0x8E);
set_idt_gate(&idt, 124, (uintptr_t)_irq92, 0x08, 0x8E);
set_idt_gate(&idt, 125, (uintptr_t)_irq93, 0x08, 0x8E);
set_idt_gate(&idt, 126, (uintptr_t)_irq94, 0x08, 0x8E);
set_idt_gate(&idt, 127, (uintptr_t)_irq95, 0x08, 0x8E);
set_idt_gate(&idt, 128, (uintptr_t)_irq96, 0x08, 0x8E);
set_idt_gate(&idt, 129, (uintptr_t)_irq97, 0x08, 0x8E);
set_idt_gate(&idt, 130, (uintptr_t)_irq98, 0x08, 0x8E);
set_idt_gate(&idt, 131, (uintptr_t)_irq99, 0x08, 0x8E);
set_idt_gate(&idt, 132, (uintptr_t)_irq100, 0x08, 0x8E);
set_idt_gate(&idt, 133, (uintptr_t)_irq101, 0x08, 0x8E);
set_idt_gate(&idt, 134, (uintptr_t)_irq102, 0x08, 0x8E);
set_idt_gate(&idt, 135, (uintptr_t)_irq103, 0x08, 0x8E);
set_idt_gate(&idt, 136, (uintptr_t)_irq104, 0x08, 0x8E);
set_idt_gate(&idt, 137, (uintptr_t)_irq105, 0x08, 0x8E);
set_idt_gate(&idt, 138, (uintptr_t)_irq106, 0x08, 0x8E);
set_idt_gate(&idt, 139, (uintptr_t)_irq107, 0x08, 0x8E);
set_idt_gate(&idt, 140, (uintptr_t)_irq108, 0x08, 0x8E);
set_idt_gate(&idt, 141, (uintptr_t)_irq109, 0x08, 0x8E);
set_idt_gate(&idt, 142, (uintptr_t)_irq110, 0x08, 0x8E);
set_idt_gate(&idt, 143, (uintptr_t)_irq111, 0x08, 0x8E);
set_idt_gate(&idt, 144, (uintptr_t)_irq112, 0x08, 0x8E);
set_idt_gate(&idt, 145, (uintptr_t)_irq113, 0x08, 0x8E);
set_idt_gate(&idt, 146, (uintptr_t)_irq114, 0x08, 0x8E);
set_idt_gate(&idt, 147, (uintptr_t)_irq115, 0x08, 0x8E);
set_idt_gate(&idt, 148, (uintptr_t)_irq116, 0x08, 0x8E);
set_idt_gate(&idt, 149, (uintptr_t)_irq117, 0x08, 0x8E);
set_idt_gate(&idt, 150, (uintptr_t)_irq118, 0x08, 0x8E);
set_idt_gate(&idt, 151, (uintptr_t)_irq119, 0x08, 0x8E);
set_idt_gate(&idt, 152, (uintptr_t)_irq120, 0x08, 0x8E);
set_idt_gate(&idt, 153, (uintptr_t)_irq121, 0x08, 0x8E);
set_idt_gate(&idt, 154, (uintptr_t)_irq122, 0x08, 0x8E);
set_idt_gate(&idt, 155, (uintptr_t)_irq123, 0x08, 0x8E);
set_idt_gate(&idt, 156, (uintptr_t)_irq124, 0x08, 0x8E);
set_idt_gate(&idt, 157, (uintptr_t)_irq125, 0x08, 0x8E);
set_idt_gate(&idt, 158, (uintptr_t)_irq126, 0x08, 0x8E);
set_idt_gate(&idt, 159, (uintptr_t)_irq127, 0x08, 0x8E);
set_idt_gate(&idt, 160, (uintptr_t)_irq128, 0x08, 0x8E);
set_idt_gate(&idt, 161, (uintptr_t)_irq129, 0x08, 0x8E);
set_idt_gate(&idt, 162, (uintptr_t)_irq130, 0x08, 0x8E);
set_idt_gate(&idt, 163, (uintptr_t)_irq131, 0x08, 0x8E);
set_idt_gate(&idt, 164, (uintptr_t)_irq132, 0x08, 0x8E);
set_idt_gate(&idt, 165, (uintptr_t)_irq133, 0x08, 0x8E);
set_idt_gate(&idt, 166, (uintptr_t)_irq134, 0x08, 0x8E);
set_idt_gate(&idt, 167, (uintptr_t)_irq135, 0x08, 0x8E);
set_idt_gate(&idt, 168, (uintptr_t)_irq136, 0x08, 0x8E);
set_idt_gate(&idt, 169, (uintptr_t)_irq137, 0x08, 0x8E);
set_idt_gate(&idt, 170, (uintptr_t)_irq138, 0x08, 0x8E);
set_idt_gate(&idt, 171, (uintptr_t)_irq139, 0x08, 0x8E);
set_idt_gate(&idt, 172, (uintptr_t)_irq140, 0x08, 0x8E);
set_idt_gate(&idt, 173, (uintptr_t)_irq141, 0x08, 0x8E);
set_idt_gate(&idt, 174, (uintptr_t)_irq142, 0x08, 0x8E);
set_idt_gate(&idt, 175, (uintptr_t)_irq143, 0x08, 0x8E);
set_idt_gate(&idt, 176, (uintptr_t)_irq144, 0x08, 0x8E);
set_idt_gate(&idt, 177, (uintptr_t)_irq145, 0x08, 0x8E);
set_idt_gate(&idt, 178, (uintptr_t)_irq146, 0x08, 0x8E);
set_idt_gate(&idt, 179, (uintptr_t)_irq147, 0x08, 0x8E);
set_idt_gate(&idt, 180, (uintptr_t)_irq148, 0x08, 0x8E);
set_idt_gate(&idt, 181, (uintptr_t)_irq149, 0x08, 0x8E);
set_idt_gate(&idt, 182, (uintptr_t)_irq150, 0x08, 0x8E);
set_idt_gate(&idt, 183, (uintptr_t)_irq151, 0x08, 0x8E);
set_idt_gate(&idt, 184, (uintptr_t)_irq152, 0x08, 0x8E);
set_idt_gate(&idt, 185, (uintptr_t)_irq153, 0x08, 0x8E);
set_idt_gate(&idt, 186, (uintptr_t)_irq154, 0x08, 0x8E);
set_idt_gate(&idt, 187, (uintptr_t)_irq155, 0x08, 0x8E);
set_idt_gate(&idt, 188, (uintptr_t)_irq156, 0x08, 0x8E);
set_idt_gate(&idt, 189, (uintptr_t)_irq157, 0x08, 0x8E);
set_idt_gate(&idt, 190, (uintptr_t)_irq158, 0x08, 0x8E);
set_idt_gate(&idt, 191, (uintptr_t)_irq159, 0x08, 0x8E);
set_idt_gate(&idt, 192, (uintptr_t)_irq160, 0x08, 0x8E);
set_idt_gate(&idt, 193, (uintptr_t)_irq161, 0x08, 0x8E);
set_idt_gate(&idt, 194, (uintptr_t)_irq162, 0x08, 0x8E);
set_idt_gate(&idt, 195, (uintptr_t)_irq163, 0x08, 0x8E);
set_idt_gate(&idt, 196, (uintptr_t)_irq164, 0x08, 0x8E);
set_idt_gate(&idt, 197, (uintptr_t)_irq165, 0x08, 0x8E);
set_idt_gate(&idt, 198, (uintptr_t)_irq166, 0x08, 0x8E);
set_idt_gate(&idt, 199, (uintptr_t)_irq167, 0x08, 0x8E);
set_idt_gate(&idt, 200, (uintptr_t)_irq168, 0x08, 0x8E);
set_idt_gate(&idt, 201, (uintptr_t)_irq169, 0x08, 0x8E);
set_idt_gate(&idt, 202, (uintptr_t)_irq170, 0x08, 0x8E);
set_idt_gate(&idt, 203, (uintptr_t)_irq171, 0x08, 0x8E);
set_idt_gate(&idt, 204, (uintptr_t)_irq172, 0x08, 0x8E);
set_idt_gate(&idt, 205, (uintptr_t)_irq173, 0x08, 0x8E);
set_idt_gate(&idt, 206, (uintptr_t)_irq174, 0x08, 0x8E);
set_idt_gate(&idt, 207, (uintptr_t)_irq175, 0x08, 0x8E);
set_idt_gate(&idt, 208, (uintptr_t)_irq176, 0x08, 0x8E);
set_idt_gate(&idt, 209, (uintptr_t)_irq177, 0x08, 0x8E);
set_idt_gate(&idt, 210, (uintptr_t)_irq178, 0x08, 0x8E);
set_idt_gate(&idt, 211, (uintptr_t)_irq179, 0x08, 0x8E);
set_idt_gate(&idt, 212, (uintptr_t)_irq180, 0x08, 0x8E);
set_idt_gate(&idt, 213, (uintptr_t)_irq181, 0x08, 0x8E);
set_idt_gate(&idt, 214, (uintptr_t)_irq182, 0x08, 0x8E);
set_idt_gate(&idt, 215, (uintptr_t)_irq183, 0x08, 0x8E);
set_idt_gate(&idt, 216, (uintptr_t)_irq184, 0x08, 0x8E);
set_idt_gate(&idt, 217, (uintptr_t)_irq185, 0x08, 0x8E);
set_idt_gate(&idt, 218, (uintptr_t)_irq186, 0x08, 0x8E);
set_idt_gate(&idt, 219, (uintptr_t)_irq187, 0x08, 0x8E);
set_idt_gate(&idt, 220, (uintptr_t)_irq188, 0x08, 0x8E);
set_idt_gate(&idt, 221, (uintptr_t)_irq189, 0x08, 0x8E);
set_idt_gate(&idt, 222, (uintptr_t)_irq190, 0x08, 0x8E);
set_idt_gate(&idt, 223, (uintptr_t)_irq191, 0x08, 0x8E);
set_idt_gate(&idt, 224, (uintptr_t)_irq192, 0x08, 0x8E);
set_idt_gate(&idt, 225, (uintptr_t)_irq193, 0x08, 0x8E);
set_idt_gate(&idt, 226, (uintptr_t)_irq194, 0x08, 0x8E);
set_idt_gate(&idt, 227, (uintptr_t)_irq195, 0x08, 0x8E);
set_idt_gate(&idt, 228, (uintptr_t)_irq196, 0x08, 0x8E);
set_idt_gate(&idt, 229, (uintptr_t)_irq197, 0x08, 0x8E);
set_idt_gate(&idt, 230, (uintptr_t)_irq198, 0x08, 0x8E);
set_idt_gate(&idt, 231, (uintptr_t)_irq199, 0x08, 0x8E);
set_idt_gate(&idt, 232, (uintptr_t)_irq200, 0x08, 0x8E);
set_idt_gate(&idt, 233, (uintptr_t)_irq201, 0x08, 0x8E);
set_idt_gate(&idt, 234, (uintptr_t)_irq202, 0x08, 0x8E);
set_idt_gate(&idt, 235, (uintptr_t)_irq203, 0x08, 0x8E);
set_idt_gate(&idt, 236, (uintptr_t)_irq204, 0x08, 0x8E);
set_idt_gate(&idt, 237, (uintptr_t)_irq205, 0x08, 0x8E);
set_idt_gate(&idt, 238, (uintptr_t)_irq206, 0x08, 0x8E);
set_idt_gate(&idt, 239, (uintptr_t)_irq207, 0x08, 0x8E);
set_idt_gate(&idt, 240, (uintptr_t)_irq208, 0x08, 0x8E);
set_idt_gate(&idt, 241, (uintptr_t)_irq209, 0x08, 0x8E);
set_idt_gate(&idt, 242, (uintptr_t)_irq210, 0x08, 0x8E);
set_idt_gate(&idt, 243, (uintptr_t)_irq211, 0x08, 0x8E);
set_idt_gate(&idt, 244, (uintptr_t)_irq212, 0x08, 0x8E);
set_idt_gate(&idt, 245, (uintptr_t)_irq213, 0x08, 0x8E);
set_idt_gate(&idt, 246, (uintptr_t)_irq214, 0x08, 0x8E);
set_idt_gate(&idt, 247, (uintptr_t)_irq215, 0x08, 0x8E);
set_idt_gate(&idt, 248, (uintptr_t)_irq216, 0x08, 0x8E);
set_idt_gate(&idt, 249, (uintptr_t)_irq217, 0x08, 0x8E);
set_idt_gate(&idt, 250, (uintptr_t)_irq218, 0x08, 0x8E);
set_idt_gate(&idt, 251, (uintptr_t)_irq219, 0x08, 0x8E);
set_idt_gate(&idt, 252, (uintptr_t)_irq220, 0x08, 0x8E);
set_idt_gate(&idt, 253, (uintptr_t)_irq221, 0x08, 0x8E);
set_idt_gate(&idt, 254, (uintptr_t)_irq222, 0x08, 0x8E);
set_idt_gate(&idt, 255, (uintptr_t)_irq223, 0x08, 0x8E);
idt_initialised = 1;
}
@@ -224,6 +641,7 @@ int idt_load(struct idt_ptr *ptr)
void isr_dispatch(struct cpu_context *regs)
{
printk("received ISR#%u on CPU %u", regs->int_no, this_cpu());
int_hook h = isr_handlers[regs->int_no];
if (h) {
h(regs);
@@ -236,6 +654,10 @@ void irq_dispatch(struct cpu_context *regs)
{
end_charge_period();
if (regs->int_no != IRQ0) {
printk("received IRQ#%u on CPU %u", regs->int_no, this_cpu());
}
irq_ack(regs->int_no);
struct queue *hooks = &irq_hooks[regs->int_no - IRQ0];
queue_foreach(struct irq_hook, hook, hooks, irq_entry) {

View File

@@ -100,7 +100,6 @@ ISR_NO_ERROR 28
ISR_NO_ERROR 29
ISR_NO_ERROR 30
ISR_NO_ERROR 31
ISR_NO_ERROR 128
IRQ 0, 32
IRQ 1, 33
@@ -118,6 +117,214 @@ IRQ 12, 44
IRQ 13, 45
IRQ 14, 46
IRQ 15, 47
IRQ 16, 48
IRQ 17, 49
IRQ 18, 50
IRQ 19, 51
IRQ 20, 52
IRQ 21, 53
IRQ 22, 54
IRQ 23, 55
IRQ 24, 56
IRQ 25, 57
IRQ 26, 58
IRQ 27, 59
IRQ 28, 60
IRQ 29, 61
IRQ 30, 62
IRQ 31, 63
IRQ 32, 64
IRQ 33, 65
IRQ 34, 66
IRQ 35, 67
IRQ 36, 68
IRQ 37, 69
IRQ 38, 70
IRQ 39, 71
IRQ 40, 72
IRQ 41, 73
IRQ 42, 74
IRQ 43, 75
IRQ 44, 76
IRQ 45, 77
IRQ 46, 78
IRQ 47, 79
IRQ 48, 80
IRQ 49, 81
IRQ 50, 82
IRQ 51, 83
IRQ 52, 84
IRQ 53, 85
IRQ 54, 86
IRQ 55, 87
IRQ 56, 88
IRQ 57, 89
IRQ 58, 90
IRQ 59, 91
IRQ 60, 92
IRQ 61, 93
IRQ 62, 94
IRQ 63, 95
IRQ 64, 96
IRQ 65, 97
IRQ 66, 98
IRQ 67, 99
IRQ 68, 100
IRQ 69, 101
IRQ 70, 102
IRQ 71, 103
IRQ 72, 104
IRQ 73, 105
IRQ 74, 106
IRQ 75, 107
IRQ 76, 108
IRQ 77, 109
IRQ 78, 110
IRQ 79, 111
IRQ 80, 112
IRQ 81, 113
IRQ 82, 114
IRQ 83, 115
IRQ 84, 116
IRQ 85, 117
IRQ 86, 118
IRQ 87, 119
IRQ 88, 120
IRQ 89, 121
IRQ 90, 122
IRQ 91, 123
IRQ 92, 124
IRQ 93, 125
IRQ 94, 126
IRQ 95, 127
IRQ 96, 128
IRQ 97, 129
IRQ 98, 130
IRQ 99, 131
IRQ 100, 132
IRQ 101, 133
IRQ 102, 134
IRQ 103, 135
IRQ 104, 136
IRQ 105, 137
IRQ 106, 138
IRQ 107, 139
IRQ 108, 140
IRQ 109, 141
IRQ 110, 142
IRQ 111, 143
IRQ 112, 144
IRQ 113, 145
IRQ 114, 146
IRQ 115, 147
IRQ 116, 148
IRQ 117, 149
IRQ 118, 150
IRQ 119, 151
IRQ 120, 152
IRQ 121, 153
IRQ 122, 154
IRQ 123, 155
IRQ 124, 156
IRQ 125, 157
IRQ 126, 158
IRQ 127, 159
IRQ 128, 160
IRQ 129, 161
IRQ 130, 162
IRQ 131, 163
IRQ 132, 164
IRQ 133, 165
IRQ 134, 166
IRQ 135, 167
IRQ 136, 168
IRQ 137, 169
IRQ 138, 170
IRQ 139, 171
IRQ 140, 172
IRQ 141, 173
IRQ 142, 174
IRQ 143, 175
IRQ 144, 176
IRQ 145, 177
IRQ 146, 178
IRQ 147, 179
IRQ 148, 180
IRQ 149, 181
IRQ 150, 182
IRQ 151, 183
IRQ 152, 184
IRQ 153, 185
IRQ 154, 186
IRQ 155, 187
IRQ 156, 188
IRQ 157, 189
IRQ 158, 190
IRQ 159, 191
IRQ 160, 192
IRQ 161, 193
IRQ 162, 194
IRQ 163, 195
IRQ 164, 196
IRQ 165, 197
IRQ 166, 198
IRQ 167, 199
IRQ 168, 200
IRQ 169, 201
IRQ 170, 202
IRQ 171, 203
IRQ 172, 204
IRQ 173, 205
IRQ 174, 206
IRQ 175, 207
IRQ 176, 208
IRQ 177, 209
IRQ 178, 210
IRQ 179, 211
IRQ 180, 212
IRQ 181, 213
IRQ 182, 214
IRQ 183, 215
IRQ 184, 216
IRQ 185, 217
IRQ 186, 218
IRQ 187, 219
IRQ 188, 220
IRQ 189, 221
IRQ 190, 222
IRQ 191, 223
IRQ 192, 224
IRQ 193, 225
IRQ 194, 226
IRQ 195, 227
IRQ 196, 228
IRQ 197, 229
IRQ 198, 230
IRQ 199, 231
IRQ 200, 232
IRQ 201, 233
IRQ 202, 234
IRQ 203, 235
IRQ 204, 236
IRQ 205, 237
IRQ 206, 238
IRQ 207, 239
IRQ 208, 240
IRQ 209, 241
IRQ 210, 242
IRQ 211, 243
IRQ 212, 244
IRQ 213, 245
IRQ 214, 246
IRQ 215, 247
IRQ 216, 248
IRQ 217, 249
IRQ 218, 250
IRQ 219, 251
IRQ 220, 252
IRQ 221, 253
IRQ 222, 254
IRQ 223, 255
.global isr_common_stub