63 lines
2.0 KiB
C++
Raw Normal View History

#define MODULE "isr"
#include "assert.h"
#include "interrupts/Context.h"
2022-09-05 16:13:51 +02:00
#include "interrupts/IRQ.h"
#include "interrupts/Interrupts.h"
#include "io/Serial.h"
#include "log/Log.h"
2022-09-21 17:56:53 +02:00
#include "misc/hang.h"
2022-09-25 16:56:00 +02:00
#include "panic/Panic.h"
2022-09-05 16:13:51 +02:00
#include "std/stdio.h"
#include "thread/Scheduler.h"
2022-09-19 21:11:43 +02:00
#include "trace/StackTracer.h"
2022-09-05 16:13:51 +02:00
extern "C" void common_handler(Context* context)
2022-09-05 16:13:51 +02:00
{
ASSERT(Interrupts::is_in_handler());
if (context->number >= 0x20 && context->number < 0x30)
{
IRQ::interrupt_handler(context);
return;
}
2022-09-05 16:13:51 +02:00
if (context->number == 13)
{
2022-09-25 16:56:00 +02:00
Interrupts::disable();
2022-09-19 21:11:43 +02:00
2022-09-25 16:56:00 +02:00
if (context->cs == 0x8) { int_panic(context, "GPF in kernel task"); }
else
{
2022-09-25 16:56:00 +02:00
kerrorln("General protection fault at RIP %lx, cs %ld, ss %ld, RSP %lx, error code %ld", context->rip,
context->cs, context->ss, context->rsp, context->error_code);
kinfoln("Stack trace:");
StackTracer tracer(context->rbp);
tracer.trace_with_ip(context->rip);
Scheduler::task_misbehave(context);
}
2022-09-05 16:13:51 +02:00
}
if (context->number == 14)
{
Interrupts::disable();
2022-09-19 21:11:43 +02:00
2022-09-25 16:56:00 +02:00
if (context->cs == 0x8) { int_panic(context, "Page fault in kernel task"); }
else
{
2022-09-25 16:56:00 +02:00
kerrorln("Page fault in ring 3 (RIP %lx), while trying to access %lx, error code %ld", context->rip,
context->cr2, context->error_code);
kinfoln("Stack trace:");
StackTracer tracer(context->rbp);
tracer.trace_with_ip(context->rip);
Scheduler::task_misbehave(context);
}
2022-09-11 08:23:32 +02:00
}
2022-09-25 16:56:00 +02:00
if (context->number == 8) { int_panic(context, "Double fault, halting"); }
if (context->number == 48) { Scheduler::task_yield(context); }
if (context->number == 49) { Scheduler::task_exit(context); }
if (context->number == 50) { Serial::print((const char*)context->rdi); }
if (context->number == 51) { Scheduler::task_sleep(context); }
if (context->number == 256) { kwarnln("Unused interrupt"); }
2022-09-05 16:13:51 +02:00
return;
}