diff --git a/kernel/src/arch/paging.c b/kernel/src/arch/paging.c index 557277c..6d95144 100644 --- a/kernel/src/arch/paging.c +++ b/kernel/src/arch/paging.c @@ -238,7 +238,7 @@ void paging_init(void) vmap(kernel_pagemap, addr, phys, VMM_PRESENT | VMM_WRITE | VMM_NX); } - /* Map physical memory */ + /* Map physical memory */ for (uint64_t i = 0; i < memmap->entry_count; i++) { if (!memmap->entries[i]->base || !memmap->entries[i]->length) diff --git a/kernel/src/emk.c b/kernel/src/emk.c index 0af2497..f9ebacd 100644 --- a/kernel/src/emk.c +++ b/kernel/src/emk.c @@ -100,15 +100,6 @@ void emk_entry(void) gdt_init(); idt_init(); - /* Setup SMP */ - if (!mp_request.response) - { - kpanic(NULL, "Failed to get MP request"); - } - - mp_response = mp_request.response; - smp_init(); - /* Setup physical memory*/ if (!hhdm_request.response) { @@ -169,6 +160,15 @@ void emk_entry(void) *c = 32; kfree(c); + /* Setup SMP */ + if (!mp_request.response) + { + kpanic(NULL, "Failed to get MP request"); + } + + mp_response = mp_request.response; + smp_init(); + /* Setup ACPI */ rsdp_response = rsdp_request.response; if (!rsdp_response) @@ -176,13 +176,13 @@ void emk_entry(void) kpanic(NULL, "Failed to get RSDP request"); } acpi_init(); + madt_init(); // Also init MADT, to prepare for APIC /* Disable legacy PIC to prepare for APIC */ outb(0x21, 0xff); outb(0xA1, 0xff); /* Setup APIC */ - madt_init(); lapic_init(); /* Finished */ diff --git a/kernel/src/sys/acpi.c b/kernel/src/sys/acpi.c index 1f36ac0..8e38375 100644 --- a/kernel/src/sys/acpi.c +++ b/kernel/src/sys/acpi.c @@ -17,7 +17,6 @@ void acpi_init(void) } acpi_rsdp_t *rsdp = (acpi_rsdp_t *)vallocat(kvm_ctx, 1, VALLOC_RW, rsdp_response->address); - if (memcmp(rsdp->signature, "RSD PTR", 7) != 0) kpanic(NULL, "Invalid RSDP signature!"); diff --git a/kernel/src/sys/apic/lapic.c b/kernel/src/sys/apic/lapic.c index 600b78e..f0c58bd 100644 --- a/kernel/src/sys/apic/lapic.c +++ b/kernel/src/sys/apic/lapic.c @@ -4,9 +4,9 @@ #include #include #include -#include +#include -uint64_t lapic_msr = 0; +atomic_uintptr_t lapic_msr = 0; volatile uint64_t *lapic_base = 0; void lapic_write(uint32_t offset, uint32_t value) @@ -16,8 +16,9 @@ void lapic_write(uint32_t offset, uint32_t value) log_early("warning: LAPIC not initialized!"); return; } + volatile uint32_t *reg = (volatile uint32_t *)((uint8_t *)lapic_base + offset); - *reg = value; + atomic_store((_Atomic uint32_t *)reg, value); } uint32_t lapic_read(uint32_t offset) @@ -27,16 +28,16 @@ uint32_t lapic_read(uint32_t offset) 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; + return atomic_load((_Atomic uint32_t *)reg); } 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; + uint64_t msr = rdmsr(LAPIC_BASE); + atomic_store(&lapic_msr, msr); + lapic_base = (volatile uint64_t *)(msr & ~(0xffff)); + atomic_store(&lapic_addr, (uint64_t)lapic_base); log_early("New LAPIC base: 0x%lx", lapic_base); } \ No newline at end of file