From 4534f1da147bf28628097a19ee6440f436a682a5 Mon Sep 17 00:00:00 2001 From: Kevin Alavik Date: Fri, 30 May 2025 11:05:07 +0200 Subject: [PATCH] feat/kernel: Started on LAPIC --- .vscode/settings.json | 3 ++- kernel/src/arch/cpu.h | 1 + kernel/src/emk.c | 2 ++ kernel/src/sys/apic/lapic.c | 42 +++++++++++++++++++++++++++++++++++++ kernel/src/sys/apic/lapic.h | 16 ++++++++++++++ 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 kernel/src/sys/apic/lapic.c create mode 100644 kernel/src/sys/apic/lapic.h diff --git a/.vscode/settings.json b/.vscode/settings.json index ac25aab..71349dc 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,7 +24,8 @@ "lapic.h": "c", "spinlock.h": "c", "fb.h": "c", - "acpi.h": "c" + "acpi.h": "c", + "madt.h": "c" }, "editor.formatOnPaste": true, "editor.formatOnSave": true, diff --git a/kernel/src/arch/cpu.h b/kernel/src/arch/cpu.h index e3cd47f..591e4d6 100644 --- a/kernel/src/arch/cpu.h +++ b/kernel/src/arch/cpu.h @@ -3,6 +3,7 @@ #define CPU_H #include +#include static inline noreturn void hlt() { diff --git a/kernel/src/emk.c b/kernel/src/emk.c index 8c41cab..0af2497 100644 --- a/kernel/src/emk.c +++ b/kernel/src/emk.c @@ -20,6 +20,7 @@ #include #include #include +#include __attribute__((used, section(".limine_requests"))) static volatile LIMINE_BASE_REVISION(3); __attribute__((used, section(".limine_requests"))) static volatile struct limine_memmap_request memmap_request = { @@ -182,6 +183,7 @@ void emk_entry(void) /* Setup APIC */ madt_init(); + lapic_init(); /* Finished */ log_early("%s", LOG_SEPARATOR); diff --git a/kernel/src/sys/apic/lapic.c b/kernel/src/sys/apic/lapic.c new file mode 100644 index 0000000..600b78e --- /dev/null +++ b/kernel/src/sys/apic/lapic.c @@ -0,0 +1,42 @@ +/* EMK 1.0 Copyright (c) 2025 Piraterna */ +#include +#include +#include +#include +#include +#include + +uint64_t lapic_msr = 0; +volatile uint64_t *lapic_base = 0; + +void lapic_write(uint32_t offset, uint32_t value) +{ + if (!lapic_base) + { + log_early("warning: LAPIC not initialized!"); + return; + } + volatile uint32_t *reg = (volatile uint32_t *)((uint8_t *)lapic_base + offset); + *reg = value; +} + +uint32_t lapic_read(uint32_t offset) +{ + if (!lapic_base) + { + log_early("warning: LAPIC not initialized!"); + return 0; + } + volatile uint32_t *reg = (volatile uint32_t *)((uint8_t *)lapic_base + offset); + uint32_t value = *reg; + return value; +} + +void lapic_init() +{ + lapic_msr = rdmsr(LAPIC_BASE); + lapic_base = (volatile uint64_t *)(lapic_msr & ~(0xffff)); + /* Change the lapic address that we got from MADT earlier */ + lapic_addr = (uint64_t)lapic_base; + log_early("New LAPIC base: 0x%lx", lapic_base); +} \ No newline at end of file diff --git a/kernel/src/sys/apic/lapic.h b/kernel/src/sys/apic/lapic.h new file mode 100644 index 0000000..2852b8f --- /dev/null +++ b/kernel/src/sys/apic/lapic.h @@ -0,0 +1,16 @@ +/* EMK 1.0 Copyright (c) 2025 Piraterna */ +#ifndef LAPIC_H +#define LAPIC_H + +#include + +#define LAPIC_BASE 0x1b +#define LAPIC_REGOFF_LAPICID 0x20 +#define LAPIC_REGOFF_EOI 0xB0 +#define LAPIC_REGOFF_SPIV 0xF0 + +uint32_t lapic_read(uint32_t offset); +void lapic_write(uint32_t offset, uint32_t value); +void lapic_init(); + +#endif // LAPIC_H \ No newline at end of file