diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2021-03-05 16:09:03 +0200 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2021-03-05 16:09:03 +0200 |
commit | 13ab5aef4da9ded93d7c93442911554e86ea9714 (patch) | |
tree | e9efd37e3c65f3e0be9293f64f0f03e0ad2f4336 /src/idt.cc | |
parent | Add makefile notes (diff) | |
download | kernel.cpp-13ab5aef4da9ded93d7c93442911554e86ea9714.tar.xz |
add broken Scheduler
Diffstat (limited to 'src/idt.cc')
-rw-r--r-- | src/idt.cc | 11 |
1 files changed, 6 insertions, 5 deletions
@@ -1,7 +1,6 @@ #include "idt.h" #include <stdlib.h> #include "cpu/irq.h" -#include "cpu/registers.h" #include "ports.h" static_assert(sizeof(IDT::Pointer) == 6); @@ -39,23 +38,25 @@ bool IDT::uninstall(uint8_t irq, InterruptHandler* h) { #define ICW4_BUF_MASTER 0x0C /* Buffered mode/master */ #define ICW4_SFNM 0x10 /* Special fully nested (not) */ -extern "C" void print_exception(cpu_state_t* r) { +extern "C" uint32_t handle_exception(cpu_state_t* r) { printk("exception ", uhex{r->irq}, " error ", uhex{r->error}, '\n'); asm volatile("cli"); while (true) asm volatile("hlt"); __builtin_unreachable(); + + return reinterpret_cast<uint32_t>(r); }; extern "C" uint32_t handle_interrupt(cpu_state_t* r) { - if (r->irq < irq_base) print_exception(r); + if (r->irq < irq_base) return reinterpret_cast<uint32_t>(r); if (handlers[r->irq] != nullptr) { - handlers[r->irq]->trigger(); + r = handlers[r->irq]->trigger(r); } pic1_t pic1; pic1.write(0x20); - if (r->irq > 7 + irq_base) { + if (r->irq > irq_base + 7) { pic2_t pic2; pic2.write(0x20); } |