aboutsummaryrefslogtreecommitdiff
path: root/src/idt.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/idt.cc')
-rw-r--r--src/idt.cc11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/idt.cc b/src/idt.cc
index 363afcd..5be738a 100644
--- a/src/idt.cc
+++ b/src/idt.cc
@@ -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);
}