From e3c1a48104f58031b7680504791d1ada66f39dc0 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Fri, 12 Jul 2024 23:24:30 +0200 Subject: [PATCH] kern/misc: Ensure bootloader responses are not nil globally --- kernel/modules/acpi/acpi.v | 3 +++ kernel/modules/initramfs/initramfs.v | 4 ++++ kernel/modules/memory/physical.v | 10 ++++++---- kernel/modules/memory/virtual.v | 20 ++++++++++++++------ kernel/modules/term/term.v | 3 +++ kernel/modules/time/time.v | 6 +++++- kernel/modules/x86/smp/smp.v | 3 +++ 7 files changed, 38 insertions(+), 11 deletions(-) diff --git a/kernel/modules/acpi/acpi.v b/kernel/modules/acpi/acpi.v index 99fbccfe0..65008aa3e 100644 --- a/kernel/modules/acpi/acpi.v +++ b/kernel/modules/acpi/acpi.v @@ -53,6 +53,9 @@ __global ( ) pub fn initialise() { + if rsdp_req.response == unsafe { nil } { + panic('acpi: ACPI not supported on this machine.') + } rsdp_ptr := rsdp_req.response.address if rsdp_ptr == 0 { diff --git a/kernel/modules/initramfs/initramfs.v b/kernel/modules/initramfs/initramfs.v index 9020d7035..e0e1c4702 100644 --- a/kernel/modules/initramfs/initramfs.v +++ b/kernel/modules/initramfs/initramfs.v @@ -59,6 +59,10 @@ __global ( @[manualfree] pub fn initialise() { + if module_req.response == unsafe { nil } { + panic('Modules bootloader response missing') + } + if module_req.response.module_count < 1 { panic('No initramfs') } diff --git a/kernel/modules/memory/physical.v b/kernel/modules/memory/physical.v index 5d12d19e8..1dd21bfcf 100644 --- a/kernel/modules/memory/physical.v +++ b/kernel/modules/memory/physical.v @@ -24,10 +24,6 @@ __global ( volatile hhdm_req = limine.LimineHHDMRequest{ response: unsafe { nil } } - volatile paging_mode_req = limine.LiminePagingModeRequest{ - response: unsafe { nil } - mode: limine.limine_paging_mode_x86_64_5lvl - } ) pub fn print_free() { @@ -39,10 +35,16 @@ pub fn print_free() { } pub fn pmm_init() { + if hhdm_req.response == unsafe { nil } { + lib.kpanic(unsafe { nil }, c'HHDM bootloader response missing') + } higher_half = hhdm_req.response.offset C.printf(c'pmm: Higher half direct map at: %p\n', higher_half) + if memmap_req.response == unsafe { nil } { + lib.kpanic(unsafe { nil }, c'Memory map bootloader response missing') + } memmap := memmap_req.response unsafe { diff --git a/kernel/modules/memory/virtual.v b/kernel/modules/memory/virtual.v index 3a24728ae..6afd91f06 100644 --- a/kernel/modules/memory/virtual.v +++ b/kernel/modules/memory/virtual.v @@ -250,6 +250,10 @@ __global ( volatile memmap_req = limine.LimineMemmapRequest{ response: unsafe { nil } } + volatile paging_mode_req = limine.LiminePagingModeRequest{ + response: unsafe { nil } + mode: limine.limine_paging_mode_x86_64_5lvl + } ) fn map_kernel_span(virt u64, phys u64, len u64, flags u64) { @@ -265,14 +269,13 @@ fn map_kernel_span(virt u64, phys u64, len u64, flags u64) { } pub fn vmm_init() { - if paging_mode_req.response.mode == limine.limine_paging_mode_x86_64_5lvl { - print('vmm: Using 5 level paging\n') - la57 = true + if paging_mode_req.response != unsafe { nil } { + if paging_mode_req.response.mode == limine.limine_paging_mode_x86_64_5lvl { + print('vmm: Using 5 level paging\n') + la57 = true + } } - print('vmm: Kernel physical base: 0x${kaddr_req.response.physical_base:x}\n') - print('vmm: Kernel virtual base: 0x${kaddr_req.response.virtual_base:x}\n') - kernel_pagemap.top_level = pmm_alloc(1) if kernel_pagemap.top_level == 0 { panic('vmm_init() allocation failure') @@ -287,6 +290,11 @@ pub fn vmm_init() { } // Map kernel + if kaddr_req.response == unsafe { nil } { + panic('Kernel address bootloader response missing') + } + print('vmm: Kernel physical base: 0x${kaddr_req.response.physical_base:x}\n') + print('vmm: Kernel virtual base: 0x${kaddr_req.response.virtual_base:x}\n') virtual_base := kaddr_req.response.virtual_base physical_base := kaddr_req.response.physical_base diff --git a/kernel/modules/term/term.v b/kernel/modules/term/term.v index cd53efdae..e573342b6 100644 --- a/kernel/modules/term/term.v +++ b/kernel/modules/term/term.v @@ -31,6 +31,9 @@ __global ( ) pub fn initialise() { + if fb_req.response == unsafe { nil } { + panic('Framebuffer bootloader response missing') + } framebuffer_tag = unsafe { fb_req.response.framebuffers[0] } framebuffer_width = framebuffer_tag.width framebuffer_height = framebuffer_tag.height diff --git a/kernel/modules/time/time.v b/kernel/modules/time/time.v index c30cafabf..b417d11ef 100644 --- a/kernel/modules/time/time.v +++ b/kernel/modules/time/time.v @@ -71,7 +71,11 @@ __global ( ) pub fn initialise() { - epoch := boottime_req.response.boot_time + epoch := if boottime_req.response != unsafe { nil } { + boottime_req.response.boot_time + } else { + 0 + } monotonic_clock = TimeSpec{i64(epoch), 0} realtime_clock = TimeSpec{i64(epoch), 0} diff --git a/kernel/modules/x86/smp/smp.v b/kernel/modules/x86/smp/smp.v index 5e7f7377a..99bb67689 100644 --- a/kernel/modules/x86/smp/smp.v +++ b/kernel/modules/x86/smp/smp.v @@ -25,6 +25,9 @@ __global ( ) pub fn initialise() { + if smp_req.response == unsafe { nil } { + panic('SMP bootloader response missing') + } smp_tag := smp_req.response println('smp: BSP LAPIC ID: ${smp_tag.bsp_lapic_id:x}')