diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2021-02-22 09:59:58 +0200 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2021-02-22 09:59:58 +0200 |
commit | fb9d73ff32de7c83552707622512be0ef1db241c (patch) | |
tree | 2187542a85c998c43952ecf39c8f9598ba8f6929 /src/idt.cc | |
parent | Kconfig (diff) | |
download | kernel.cpp-fb9d73ff32de7c83552707622512be0ef1db241c.tar.xz |
Enable interrupts
Diffstat (limited to 'src/idt.cc')
-rw-r--r-- | src/idt.cc | 49 |
1 files changed, 41 insertions, 8 deletions
@@ -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'); } |