starkernel: item 4.3.5 -- amd64 I/O APIC + i8042 keyboard, interrupt-driven
Punch list §25 item 4.3.5 complete. New ioapic.c/i8042.c drivers (MADT-derived I/O APIC base, no hardcoded constants) plus a KBD-SCAN/KBD-DEBUG diagnostic word pair. Three real bugs found and fixed en route, all blocking this item's own acceptance: a fatal LAPIC spurious-vector crash (nothing had driven a real external interrupt through the I/O APIC before), OVMF leaving the keyboard device itself scanning-disabled (0xF4 fix), and isr.S's stub table only having individually-numbered stubs through vector 32 -- everything above that, including our IRQ1 vector 33, silently reported as vector 255 regardless of which IDT slot actually fired. Verified live via QEMU sendkey against KBD-SCAN: correct XT Set-1 make/break codes for two different keys. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
78ff335b97
commit
88eb73cfe8
@@ -53,9 +53,20 @@
|
||||
/* Heartbeat timer vector (user-defined IRQ space starts at 0x20) */
|
||||
#define APIC_TIMER_VECTOR 0x20
|
||||
|
||||
/* Spurious-interrupt vector (APIC_REG_SIVR, set in apic_init()). A normal,
|
||||
* occasional hardware race per Intel SDM Vol.3 §10.9 -- not a fault. Must
|
||||
* be silently ignored with no EOI. Surfaced by item 4.3.5's I/O APIC work:
|
||||
* no real external interrupt had ever been delivered through the I/O APIC
|
||||
* before, so this path was previously dormant. */
|
||||
#define APIC_SPURIOUS_VECTOR 0xFF
|
||||
|
||||
/* Initialize Local APIC (enables APIC, sets spurious vector) */
|
||||
int apic_init(BootInfo *boot_info);
|
||||
|
||||
/* Return this CPU's xAPIC ID (APIC_REG_ID bits 31:24) — used as the
|
||||
* destination field when programming I/O APIC redirection entries. */
|
||||
uint8_t apic_id(void);
|
||||
|
||||
/* Send End-of-Interrupt signal */
|
||||
void apic_eoi(void);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user