diff options
Diffstat (limited to 'kernel/src/arch/x86_64/x86_64.cpp')
| -rw-r--r-- | kernel/src/arch/x86_64/x86_64.cpp | 63 |
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 |
