Add keypress detection

This commit is contained in:
2024-08-11 13:03:13 +02:00
parent 1e385af53c
commit c2ea7f1446
14 changed files with 1652 additions and 127 deletions

View File

@@ -4,7 +4,9 @@
#include "interrupts.h"
#include "kernel_state.h"
#define EXCEPTION_DEPTH_MAX 5
#include "pic.h"
#define EXCEPTION_DEPTH_MAX 3
struct __attribute__((packed)) interrupt_frame {
uword_t ip;
@@ -31,6 +33,25 @@ static void print_interrupt_frame(struct interrupt_frame* f)
f->ss);
}
/* not an interrupt/exception, but called by exception stubs */
__attribute__((noreturn))
static void panic_exception_not_implemented(struct interrupt_frame* frame, int exception_no)
{
terminal_set_color(VGA_COLOR_WHITE, VGA_COLOR_RED);
printf(str_attach("non-implemented exception {i32} occurred\n"), exception_no);
struct str name = idt_desc_index_str[exception_no];
if (name.len != 0) {
printf(str_attach("exception name: {str})\n"), name);
}
if (frame != NULL) {
print_interrupt_frame(frame);
} else {
printf(str_attach("(no interrupt frame)n"));
}
__asm__ volatile("cli; hlt");
__builtin_unreachable();
}
/**
* Exceptions
* ==========
@@ -89,18 +110,6 @@ void exception_handler_page_fault(struct interrupt_frame* frame, int err)
__builtin_unreachable();
}
__attribute__((interrupt, noreturn))
void exception_default(struct interrupt_frame* frame)
{
(void)frame;
if (kernel.nested_exception_counter++ > EXCEPTION_DEPTH_MAX) {
panic(str_attach("fatal: too many nested exceptions\n"));
}
panic(str_attach("non-implemented exception occured"));
kernel.nested_exception_counter = 0;
}
/**
* Interrupts
* ==========
@@ -129,16 +138,320 @@ void interrupt_handler_1(struct interrupt_frame* frame)
kernel.nested_exception_counter = 0;
}
__attribute__((interrupt))
void interrupt_handler_userspace_exit(struct interrupt_frame* frame)
/*
* IRQs
* ====
* */
static void irq_stub(struct interrupt_frame* frame, int line)
{
(void)frame;
(void)line;
if (kernel.nested_exception_counter++ > EXCEPTION_DEPTH_MAX) {
panic(str_attach("fatal: too many nested exceptions\n"));
}
(void)frame;
printf(str_attach("interrupt_handler_userspace_exit called!\n"));
//printf(str_attach("irq handler {i32} called!\n"), line);
outb(PIC1_COMMAND, OCW2_EOI);
kernel.nested_exception_counter = 0;
}
__attribute__((interrupt)) void irq_handler_0(struct interrupt_frame* frame) { irq_stub(frame, 0); }
/* IRQ1 - keyboard controller */
#include "ps2-keyboard.h"
__attribute__((interrupt)) void irq_handler_1(struct interrupt_frame* frame)
{
/* TODO: move keyboard logic to a separate compilation unit */
(void)frame;
uint8_t key = inb(PIC_KEYBOARD);
bool released = key & KEY_RELEASED;
printf(str_attach("key {str}\n"), ps2_key_str[key]);
outb(PIC1_COMMAND, OCW2_EOI);
}
__attribute__((interrupt)) void irq_handler_2(struct interrupt_frame* frame) { irq_stub(frame, 2); }
__attribute__((interrupt)) void irq_handler_3(struct interrupt_frame* frame) { irq_stub(frame, 3); }
__attribute__((interrupt)) void irq_handler_4(struct interrupt_frame* frame) { irq_stub(frame, 4); }
__attribute__((interrupt)) void irq_handler_5(struct interrupt_frame* frame) { irq_stub(frame, 5); }
__attribute__((interrupt)) void irq_handler_6(struct interrupt_frame* frame) { irq_stub(frame, 6); }
__attribute__((interrupt)) void irq_handler_7(struct interrupt_frame* frame) { irq_stub(frame, 7); }
__attribute__((interrupt)) void irq_handler_8(struct interrupt_frame* frame) { irq_stub(frame, 8); }
__attribute__((interrupt)) void irq_handler_9(struct interrupt_frame* frame) { irq_stub(frame, 9); }
__attribute__((interrupt)) void irq_handler_10(struct interrupt_frame* frame) { irq_stub(frame, 10); }
__attribute__((interrupt)) void irq_handler_11(struct interrupt_frame* frame) { irq_stub(frame, 11); }
__attribute__((interrupt)) void irq_handler_12(struct interrupt_frame* frame) { irq_stub(frame, 12); }
__attribute__((interrupt)) void irq_handler_13(struct interrupt_frame* frame) { irq_stub(frame, 13); }
__attribute__((interrupt)) void irq_handler_14(struct interrupt_frame* frame) { irq_stub(frame, 14); }
__attribute__((interrupt)) void irq_handler_15(struct interrupt_frame* frame) { irq_stub(frame, 15); }
/**
* Exception Stubs
* ===============
*/
#define DEFINE_EXCEPTION_STUB(n) \
__attribute__((interrupt, noreturn)) \
void EXCEPTION_STUB(n)(struct interrupt_frame* frame) \
{ \
panic_exception_not_implemented(frame, n); \
}
DEFINE_EXCEPTION_STUB(0)
DEFINE_EXCEPTION_STUB(1)
DEFINE_EXCEPTION_STUB(2)
DEFINE_EXCEPTION_STUB(3)
DEFINE_EXCEPTION_STUB(4)
DEFINE_EXCEPTION_STUB(5)
DEFINE_EXCEPTION_STUB(6)
DEFINE_EXCEPTION_STUB(7)
DEFINE_EXCEPTION_STUB(8)
DEFINE_EXCEPTION_STUB(9)
DEFINE_EXCEPTION_STUB(10)
DEFINE_EXCEPTION_STUB(11)
DEFINE_EXCEPTION_STUB(12)
DEFINE_EXCEPTION_STUB(13)
DEFINE_EXCEPTION_STUB(14)
DEFINE_EXCEPTION_STUB(15)
DEFINE_EXCEPTION_STUB(16)
DEFINE_EXCEPTION_STUB(17)
DEFINE_EXCEPTION_STUB(18)
DEFINE_EXCEPTION_STUB(19)
DEFINE_EXCEPTION_STUB(20)
DEFINE_EXCEPTION_STUB(21)
DEFINE_EXCEPTION_STUB(22)
DEFINE_EXCEPTION_STUB(23)
DEFINE_EXCEPTION_STUB(24)
DEFINE_EXCEPTION_STUB(25)
DEFINE_EXCEPTION_STUB(26)
DEFINE_EXCEPTION_STUB(27)
DEFINE_EXCEPTION_STUB(28)
DEFINE_EXCEPTION_STUB(29)
DEFINE_EXCEPTION_STUB(30)
DEFINE_EXCEPTION_STUB(31)
DEFINE_EXCEPTION_STUB(32)
DEFINE_EXCEPTION_STUB(33)
DEFINE_EXCEPTION_STUB(34)
DEFINE_EXCEPTION_STUB(35)
DEFINE_EXCEPTION_STUB(36)
DEFINE_EXCEPTION_STUB(37)
DEFINE_EXCEPTION_STUB(38)
DEFINE_EXCEPTION_STUB(39)
DEFINE_EXCEPTION_STUB(40)
DEFINE_EXCEPTION_STUB(41)
DEFINE_EXCEPTION_STUB(42)
DEFINE_EXCEPTION_STUB(43)
DEFINE_EXCEPTION_STUB(44)
DEFINE_EXCEPTION_STUB(45)
DEFINE_EXCEPTION_STUB(46)
DEFINE_EXCEPTION_STUB(47)
DEFINE_EXCEPTION_STUB(48)
DEFINE_EXCEPTION_STUB(49)
DEFINE_EXCEPTION_STUB(50)
DEFINE_EXCEPTION_STUB(51)
DEFINE_EXCEPTION_STUB(52)
DEFINE_EXCEPTION_STUB(53)
DEFINE_EXCEPTION_STUB(54)
DEFINE_EXCEPTION_STUB(55)
DEFINE_EXCEPTION_STUB(56)
DEFINE_EXCEPTION_STUB(57)
DEFINE_EXCEPTION_STUB(58)
DEFINE_EXCEPTION_STUB(59)
DEFINE_EXCEPTION_STUB(60)
DEFINE_EXCEPTION_STUB(61)
DEFINE_EXCEPTION_STUB(62)
DEFINE_EXCEPTION_STUB(63)
DEFINE_EXCEPTION_STUB(64)
DEFINE_EXCEPTION_STUB(65)
DEFINE_EXCEPTION_STUB(66)
DEFINE_EXCEPTION_STUB(67)
DEFINE_EXCEPTION_STUB(68)
DEFINE_EXCEPTION_STUB(69)
DEFINE_EXCEPTION_STUB(70)
DEFINE_EXCEPTION_STUB(71)
DEFINE_EXCEPTION_STUB(72)
DEFINE_EXCEPTION_STUB(73)
DEFINE_EXCEPTION_STUB(74)
DEFINE_EXCEPTION_STUB(75)
DEFINE_EXCEPTION_STUB(76)
DEFINE_EXCEPTION_STUB(77)
DEFINE_EXCEPTION_STUB(78)
DEFINE_EXCEPTION_STUB(79)
DEFINE_EXCEPTION_STUB(80)
DEFINE_EXCEPTION_STUB(81)
DEFINE_EXCEPTION_STUB(82)
DEFINE_EXCEPTION_STUB(83)
DEFINE_EXCEPTION_STUB(84)
DEFINE_EXCEPTION_STUB(85)
DEFINE_EXCEPTION_STUB(86)
DEFINE_EXCEPTION_STUB(87)
DEFINE_EXCEPTION_STUB(88)
DEFINE_EXCEPTION_STUB(89)
DEFINE_EXCEPTION_STUB(90)
DEFINE_EXCEPTION_STUB(91)
DEFINE_EXCEPTION_STUB(92)
DEFINE_EXCEPTION_STUB(93)
DEFINE_EXCEPTION_STUB(94)
DEFINE_EXCEPTION_STUB(95)
DEFINE_EXCEPTION_STUB(96)
DEFINE_EXCEPTION_STUB(97)
DEFINE_EXCEPTION_STUB(98)
DEFINE_EXCEPTION_STUB(99)
DEFINE_EXCEPTION_STUB(100)
DEFINE_EXCEPTION_STUB(101)
DEFINE_EXCEPTION_STUB(102)
DEFINE_EXCEPTION_STUB(103)
DEFINE_EXCEPTION_STUB(104)
DEFINE_EXCEPTION_STUB(105)
DEFINE_EXCEPTION_STUB(106)
DEFINE_EXCEPTION_STUB(107)
DEFINE_EXCEPTION_STUB(108)
DEFINE_EXCEPTION_STUB(109)
DEFINE_EXCEPTION_STUB(110)
DEFINE_EXCEPTION_STUB(111)
DEFINE_EXCEPTION_STUB(112)
DEFINE_EXCEPTION_STUB(113)
DEFINE_EXCEPTION_STUB(114)
DEFINE_EXCEPTION_STUB(115)
DEFINE_EXCEPTION_STUB(116)
DEFINE_EXCEPTION_STUB(117)
DEFINE_EXCEPTION_STUB(118)
DEFINE_EXCEPTION_STUB(119)
DEFINE_EXCEPTION_STUB(120)
DEFINE_EXCEPTION_STUB(121)
DEFINE_EXCEPTION_STUB(122)
DEFINE_EXCEPTION_STUB(123)
DEFINE_EXCEPTION_STUB(124)
DEFINE_EXCEPTION_STUB(125)
DEFINE_EXCEPTION_STUB(126)
DEFINE_EXCEPTION_STUB(127)
DEFINE_EXCEPTION_STUB(128)
DEFINE_EXCEPTION_STUB(129)
DEFINE_EXCEPTION_STUB(130)
DEFINE_EXCEPTION_STUB(131)
DEFINE_EXCEPTION_STUB(132)
DEFINE_EXCEPTION_STUB(133)
DEFINE_EXCEPTION_STUB(134)
DEFINE_EXCEPTION_STUB(135)
DEFINE_EXCEPTION_STUB(136)
DEFINE_EXCEPTION_STUB(137)
DEFINE_EXCEPTION_STUB(138)
DEFINE_EXCEPTION_STUB(139)
DEFINE_EXCEPTION_STUB(140)
DEFINE_EXCEPTION_STUB(141)
DEFINE_EXCEPTION_STUB(142)
DEFINE_EXCEPTION_STUB(143)
DEFINE_EXCEPTION_STUB(144)
DEFINE_EXCEPTION_STUB(145)
DEFINE_EXCEPTION_STUB(146)
DEFINE_EXCEPTION_STUB(147)
DEFINE_EXCEPTION_STUB(148)
DEFINE_EXCEPTION_STUB(149)
DEFINE_EXCEPTION_STUB(150)
DEFINE_EXCEPTION_STUB(151)
DEFINE_EXCEPTION_STUB(152)
DEFINE_EXCEPTION_STUB(153)
DEFINE_EXCEPTION_STUB(154)
DEFINE_EXCEPTION_STUB(155)
DEFINE_EXCEPTION_STUB(156)
DEFINE_EXCEPTION_STUB(157)
DEFINE_EXCEPTION_STUB(158)
DEFINE_EXCEPTION_STUB(159)
DEFINE_EXCEPTION_STUB(160)
DEFINE_EXCEPTION_STUB(161)
DEFINE_EXCEPTION_STUB(162)
DEFINE_EXCEPTION_STUB(163)
DEFINE_EXCEPTION_STUB(164)
DEFINE_EXCEPTION_STUB(165)
DEFINE_EXCEPTION_STUB(166)
DEFINE_EXCEPTION_STUB(167)
DEFINE_EXCEPTION_STUB(168)
DEFINE_EXCEPTION_STUB(169)
DEFINE_EXCEPTION_STUB(170)
DEFINE_EXCEPTION_STUB(171)
DEFINE_EXCEPTION_STUB(172)
DEFINE_EXCEPTION_STUB(173)
DEFINE_EXCEPTION_STUB(174)
DEFINE_EXCEPTION_STUB(175)
DEFINE_EXCEPTION_STUB(176)
DEFINE_EXCEPTION_STUB(177)
DEFINE_EXCEPTION_STUB(178)
DEFINE_EXCEPTION_STUB(179)
DEFINE_EXCEPTION_STUB(180)
DEFINE_EXCEPTION_STUB(181)
DEFINE_EXCEPTION_STUB(182)
DEFINE_EXCEPTION_STUB(183)
DEFINE_EXCEPTION_STUB(184)
DEFINE_EXCEPTION_STUB(185)
DEFINE_EXCEPTION_STUB(186)
DEFINE_EXCEPTION_STUB(187)
DEFINE_EXCEPTION_STUB(188)
DEFINE_EXCEPTION_STUB(189)
DEFINE_EXCEPTION_STUB(190)
DEFINE_EXCEPTION_STUB(191)
DEFINE_EXCEPTION_STUB(192)
DEFINE_EXCEPTION_STUB(193)
DEFINE_EXCEPTION_STUB(194)
DEFINE_EXCEPTION_STUB(195)
DEFINE_EXCEPTION_STUB(196)
DEFINE_EXCEPTION_STUB(197)
DEFINE_EXCEPTION_STUB(198)
DEFINE_EXCEPTION_STUB(199)
DEFINE_EXCEPTION_STUB(200)
DEFINE_EXCEPTION_STUB(201)
DEFINE_EXCEPTION_STUB(202)
DEFINE_EXCEPTION_STUB(203)
DEFINE_EXCEPTION_STUB(204)
DEFINE_EXCEPTION_STUB(205)
DEFINE_EXCEPTION_STUB(206)
DEFINE_EXCEPTION_STUB(207)
DEFINE_EXCEPTION_STUB(208)
DEFINE_EXCEPTION_STUB(209)
DEFINE_EXCEPTION_STUB(210)
DEFINE_EXCEPTION_STUB(211)
DEFINE_EXCEPTION_STUB(212)
DEFINE_EXCEPTION_STUB(213)
DEFINE_EXCEPTION_STUB(214)
DEFINE_EXCEPTION_STUB(215)
DEFINE_EXCEPTION_STUB(216)
DEFINE_EXCEPTION_STUB(217)
DEFINE_EXCEPTION_STUB(218)
DEFINE_EXCEPTION_STUB(219)
DEFINE_EXCEPTION_STUB(220)
DEFINE_EXCEPTION_STUB(221)
DEFINE_EXCEPTION_STUB(222)
DEFINE_EXCEPTION_STUB(223)
DEFINE_EXCEPTION_STUB(224)
DEFINE_EXCEPTION_STUB(225)
DEFINE_EXCEPTION_STUB(226)
DEFINE_EXCEPTION_STUB(227)
DEFINE_EXCEPTION_STUB(228)
DEFINE_EXCEPTION_STUB(229)
DEFINE_EXCEPTION_STUB(230)
DEFINE_EXCEPTION_STUB(231)
DEFINE_EXCEPTION_STUB(232)
DEFINE_EXCEPTION_STUB(233)
DEFINE_EXCEPTION_STUB(234)
DEFINE_EXCEPTION_STUB(235)
DEFINE_EXCEPTION_STUB(236)
DEFINE_EXCEPTION_STUB(237)
DEFINE_EXCEPTION_STUB(238)
DEFINE_EXCEPTION_STUB(239)
DEFINE_EXCEPTION_STUB(240)
DEFINE_EXCEPTION_STUB(241)
DEFINE_EXCEPTION_STUB(242)
DEFINE_EXCEPTION_STUB(243)
DEFINE_EXCEPTION_STUB(244)
DEFINE_EXCEPTION_STUB(245)
DEFINE_EXCEPTION_STUB(246)
DEFINE_EXCEPTION_STUB(247)
DEFINE_EXCEPTION_STUB(248)
DEFINE_EXCEPTION_STUB(249)
DEFINE_EXCEPTION_STUB(250)
DEFINE_EXCEPTION_STUB(251)
DEFINE_EXCEPTION_STUB(252)
DEFINE_EXCEPTION_STUB(253)
DEFINE_EXCEPTION_STUB(254)
DEFINE_EXCEPTION_STUB(255)