aboutsummaryrefslogtreecommitdiff
path: root/src/idt.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/idt.cc')
-rw-r--r--src/idt.cc49
1 files changed, 41 insertions, 8 deletions
diff --git a/src/idt.cc b/src/idt.cc
index fe4c159..e4c21b7 100644
--- a/src/idt.cc
+++ b/src/idt.cc
@@ -22,12 +22,29 @@ static_assert(sizeof(IDT::Entry) == 8);
#define ICW4_BUF_MASTER 0x0C /* Buffered mode/master */
#define ICW4_SFNM 0x10 /* Special fully nested (not) */
+template <uint8_t irq>
+__attribute__((interrupt)) void t_irq(interrupt_frame*) {
+ static_assert(irq <= 15);
+
+ com1_port_t com1;
+ com1.write("0123456789abcdef"[irq]);
+ com1.write('\n');
+ com1.write('\r');
+
+ pic1_t pic1;
+ pic1.write(0x20);
+ if constexpr (irq > 7) {
+ pic2_t pic2;
+ pic2.write(0x20);
+ }
+};
+
IDT::IDT() {
pic1_t pic1;
pic2_t pic2;
- const auto mask1 = pic1.read(0x1);
- const auto mask2 = pic2.read(0x1);
+ // const auto mask1 = pic1.read(0x1);
+ // const auto mask2 = pic2.read(0x1);
pic1.write(ICW1_INIT | ICW1_ICW4);
pic2.write(ICW1_INIT | ICW1_ICW4);
@@ -38,14 +55,30 @@ IDT::IDT() {
pic1.write(ICW4_8086, 0x1);
pic2.write(ICW4_8086, 0x1);
- pic1.write(mask1);
- pic2.write(mask2);
+ // pic1.write(mask1);
+ // pic2.write(mask2);
+ pic1.write(0xfd, 0x1); // only enable irq1
+ pic2.write(0xff, 0x1);
- table[32] = Entry((unsigned long)kirq<0x0>, 0x08, InterruptGate);
- table[33] = Entry((unsigned long)kirq<0x1>, 0x08, InterruptGate);
+ table[0x20] = Entry(reinterpret_cast<unsigned long>(t_irq<0x0>), 0x08, InterruptGate);
+ table[0x21] = Entry(reinterpret_cast<unsigned long>(t_irq<0x1>), 0x08, InterruptGate);
+ table[0x22] = Entry(reinterpret_cast<unsigned long>(t_irq<0x2>), 0x08, InterruptGate);
+ table[0x23] = Entry(reinterpret_cast<unsigned long>(t_irq<0x3>), 0x08, InterruptGate);
+ table[0x24] = Entry(reinterpret_cast<unsigned long>(t_irq<0x4>), 0x08, InterruptGate);
+ table[0x25] = Entry(reinterpret_cast<unsigned long>(t_irq<0x5>), 0x08, InterruptGate);
+ table[0x26] = Entry(reinterpret_cast<unsigned long>(t_irq<0x6>), 0x08, InterruptGate);
+ table[0x27] = Entry(reinterpret_cast<unsigned long>(t_irq<0x7>), 0x08, InterruptGate);
+ table[0x28] = Entry(reinterpret_cast<unsigned long>(t_irq<0x8>), 0x08, InterruptGate);
+ table[0x29] = Entry(reinterpret_cast<unsigned long>(t_irq<0x9>), 0x08, InterruptGate);
+ table[0x2a] = Entry(reinterpret_cast<unsigned long>(t_irq<0xa>), 0x08, InterruptGate);
+ table[0x2b] = Entry(reinterpret_cast<unsigned long>(t_irq<0xb>), 0x08, InterruptGate);
+ table[0x2c] = Entry(reinterpret_cast<unsigned long>(t_irq<0xc>), 0x08, InterruptGate);
+ table[0x2d] = Entry(reinterpret_cast<unsigned long>(t_irq<0xd>), 0x08, InterruptGate);
+ table[0x2e] = Entry(reinterpret_cast<unsigned long>(t_irq<0xe>), 0x08, InterruptGate);
- Pointer ptr{.limit = sizeof(table), .base = (uint32_t)table};
+ Pointer ptr{.limit = sizeof(table), .base = reinterpret_cast<uint32_t>(table)};
asm volatile("lidt %0" : : "m"(ptr));
+ asm volatile("sti");
- printk("IDT installed at ", (uint32_t)table, '\n');
+ printk("IDT installed at ", uhex{ptr.base}, '\n');
}