#include <hal/cpu.h>
#include <lunaix/syslog.h>
#include <lunaix/tty/tty.h>
+#include <lunaix/process.h>
+#include <lunaix/sched.h>
-int_subscriber subscribers[256];
+LOG_MODULE("intr")
+
+static int_subscriber subscribers[256];
static int_subscriber fallback = (int_subscriber) 0;
fallback = subscribers;
}
+
void
intr_handler(isr_param* param)
{
+ // if (param->vector == LUNAIX_SYS_CALL) {
+ // kprintf(KDEBUG "%p", param->registers.esp);
+ // }
+ __current->intr_ctx = *param;
+
if (param->vector <= 255) {
int_subscriber subscriber = subscribers[param->vector];
if (subscriber) {
param->eip);
done:
+
+ // if (__current->state != PROC_RUNNING) {
+ // schedule();
+ // }
+
// for all external interrupts except the spurious interrupt
// this is required by Intel Manual Vol.3A, section 10.8.1 & 10.8.5
if (param->vector >= EX_INTERRUPT_BEGIN && param->vector != APIC_SPIV_IV) {
apic_done_servicing();
}
+
+ *param = __current->intr_ctx;
+
return;
}
\ No newline at end of file