From ab4eeb8e16c18e6907fbddbc6d3c2410a717ec84 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sun, 7 May 2023 21:43:04 +0100 Subject: [PATCH] x86_64: expand IDT to 256 entries --- arch/x86_64/include/arch/irq.h | 2 +- arch/x86_64/irq.c | 432 ++++++++++++++++++++++++++++++++- arch/x86_64/irqvec.S | 209 +++++++++++++++- 3 files changed, 636 insertions(+), 7 deletions(-) diff --git a/arch/x86_64/include/arch/irq.h b/arch/x86_64/include/arch/irq.h index 0b91c9d..5317123 100644 --- a/arch/x86_64/include/arch/irq.h +++ b/arch/x86_64/include/arch/irq.h @@ -9,7 +9,7 @@ extern "C" { #endif -#define NR_IDT_ENTRIES 48 +#define NR_IDT_ENTRIES 256 enum irq_vector { IRQ0 = 32, diff --git a/arch/x86_64/irq.c b/arch/x86_64/irq.c index f23d715..07bad5a 100644 --- a/arch/x86_64/irq.c +++ b/arch/x86_64/irq.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -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) { diff --git a/arch/x86_64/irqvec.S b/arch/x86_64/irqvec.S index 85750a0..473e6f6 100644 --- a/arch/x86_64/irqvec.S +++ b/arch/x86_64/irqvec.S @@ -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