summaryrefslogtreecommitdiff
path: root/kernel/src/arch/x86_64/x86_64.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/arch/x86_64/x86_64.cpp')
-rw-r--r--kernel/src/arch/x86_64/x86_64.cpp63
1 files changed, 14 insertions, 49 deletions
diff --git a/kernel/src/arch/x86_64/x86_64.cpp b/kernel/src/arch/x86_64/x86_64.cpp
index e45d336..804c54f 100644
--- a/kernel/src/arch/x86_64/x86_64.cpp
+++ b/kernel/src/arch/x86_64/x86_64.cpp
@@ -7,52 +7,11 @@
#include <arch/x86_64/drivers/tsc.hpp>
#include <arch/x86_64/cpu/gdt.hpp>
#include <arch/x86_64/cpu/idt.hpp>
+#include <arch/x86_64/cpu/lapic.hpp>
+#include <arch/x86_64/panic.hpp>
+#include <arch/x86_64/irq.hpp>
#include <klibc/stdio.hpp>
-
-typedef struct stackframe {
- struct stackframe* rbp;
- uint64_t rip;
-} __attribute__((packed)) stackframe_t;
-
-void print_regs(x86_64::idt::int_frame_t* ctx) {
- uint64_t cr2;
- asm volatile("mov %%cr2, %0" : "=r"(cr2) : : "memory");
- klibc::printf("Kernel panic\n\nReason: %s\n\r","cpu exception");
- klibc::printf("RAX: 0x%016llX RBX: 0x%016llX RDX: 0x%016llX RCX: 0x%016llX RDI: 0x%016llX\n\r"
- "RSI: 0x%016llX R8: 0x%016llX R9: 0x%016llX R10: 0x%016llX R11: 0x%016llX\n\r"
- "R12: 0x%016llX R13: 0x%016llX R14: 0x%016llX R15: 0x%016llX RBP: 0x%016llX\n\r"
- "RSP: 0x%016llX CR2: 0x%016llX CR3: 0x%016llX\n\r"
- "Vec: %d Err: %d cs: %p ss: %p\n\r",
- ctx->rax, ctx->rbx, ctx->rdx, ctx->rcx, ctx->rdi,
- ctx->rsi, ctx->r8, ctx->r9, ctx->r10, ctx->r11,
- ctx->r12, ctx->r13, ctx->r14, ctx->r15, ctx->rbp,
- ctx->rsp, cr2, ctx->cr3, ctx->vec, ctx->err_code, ctx->cs,ctx->ss);
- klibc::printf("\n\r Stacktrace\n\r\n\r");
-
- stackframe_t* rbp = (stackframe_t*)ctx->rbp;
-
- klibc::printf("[0] - 0x%016llX (current rip)\n\r",ctx->rip);
- for (int i = 1; i < 5 && rbp; ++i) {
- std::uint64_t ret_addr = rbp->rip;
- klibc::printf("[%d] - 0x%016llX\n\r", i, ret_addr);
- rbp = (stackframe_t*)rbp->rbp;
- }
-
-}
-
-std::uint8_t gaster[] = {
-#embed "src/gaster.txt"
-};
-
-void print_ascii_art() {
- klibc::printf("%s\n",gaster);
-}
-
-extern "C" void CPUKernelPanic(x86_64::idt::int_frame_t* frame) {
- print_ascii_art();
- print_regs(frame);
- arch::hcf();
-}
+#include <arch/x86_64/drivers/ioapic.hpp>
namespace arch {
[[gnu::weak]] void disable_interrupts() {
@@ -104,17 +63,23 @@ namespace arch {
x86_64::init_cpu_data();
drivers::hpet::init();
drivers::tsc::init();
- return;
- case ARCH_INIT_COMMON:
x86_64::gdt::init();
x86_64::idt::init();
+ x86_64::lapic::init(1500);
+ drivers::ioapic::init();
+ return;
+ case ARCH_INIT_COMMON:
return;
}
}
[[gnu::weak]] void panic(char* msg) {
- print_ascii_art();
- klibc::printf("Panic with message \"%s\"",msg);
+ x86_64::panic::print_ascii_art();
+ klibc::printf("Panic with message \"%s\"\r\n",msg);
+ }
+
+ [[gnu::weak]] int register_handler(int irq, int type, std::uint64_t flags, void (*func)(void* arg), void* arg) {
+ return x86_64::irq::create(irq,type,func,arg,flags);
}
} \ No newline at end of file