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
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
StarForth — Steady-State Virtual Machine Runtime
|
||||
|
||||
Copyright (c) 2023–2025 Robert A. James
|
||||
All rights reserved.
|
||||
|
||||
Licensed under the StarForth License, Version 1.0
|
||||
*/
|
||||
|
||||
#ifndef KEYBOARD_WORDS_H
|
||||
#define KEYBOARD_WORDS_H
|
||||
|
||||
#include "vm.h"
|
||||
|
||||
/**
|
||||
* @defgroup keyboard_words Keyboard Words
|
||||
* @{
|
||||
*
|
||||
* @brief Raw hardware-boundary FORTH word for verifying the interrupt-driven
|
||||
* keyboard path (FABRIC.md item 4.3.5). Deliberately a diagnostic peek at
|
||||
* the raw scancode ring buffer -- no set-2 translation, no REPL wiring.
|
||||
* Those belong to the later REPL keyboard-input work noted in FABRIC.md.
|
||||
*
|
||||
* Kernel-only, amd64-only today (i8042 is amd64 hardware); no-op elsewhere
|
||||
* so dictionary parity across all three architectures is unaffected.
|
||||
*
|
||||
* @par KBD-SCAN ( -- c -1 | 0 )
|
||||
* Pop one raw scancode off the interrupt-fed ring buffer. Pushes the
|
||||
* scancode and -1 (true) if one was available, or just 0 (false) if the
|
||||
* buffer was empty.
|
||||
*
|
||||
* @par KBD-DEBUG ( -- isr_count spurious_count )
|
||||
* Standing diagnostic: count of real keyboard IRQs serviced and count of
|
||||
* LAPIC spurious-vector interrupts, both since boot.
|
||||
* @}
|
||||
*/
|
||||
|
||||
void register_keyboard_words(VM *vm);
|
||||
|
||||
#endif /* KEYBOARD_WORDS_H */
|
||||
Reference in New Issue
Block a user