diff --git a/src/kernel/arch/x86_64/gdt.rs b/src/kernel/arch/x86_64/gdt.rs index 6175a1b..25c2831 100644 --- a/src/kernel/arch/x86_64/gdt.rs +++ b/src/kernel/arch/x86_64/gdt.rs @@ -4,8 +4,8 @@ use lazy_static::lazy_static; use super::asm::*; -use crate::{log_trace, format}; -use crate::log::{LogLevel, LOGGER}; +use crate::log::{LOGGER, LogLevel}; +use crate::{format, log_trace}; lazy_static! { pub static ref GDT: GlobalDescriptorTable = { diff --git a/src/kernel/device.rs b/src/kernel/device.rs index 1ae6d96..698cc99 100644 --- a/src/kernel/device.rs +++ b/src/kernel/device.rs @@ -4,11 +4,23 @@ use limine::response::{DeviceTreeBlobResponse, RsdpResponse}; use crate::boot::{DTB_REQUEST, RSDP_REQUEST}; use crate::log::{LOGGER, LogLevel}; -use crate::{format, log_trace}; +use crate::{format, log_info, log_trace, log_warning}; lazy_static! { - pub static ref DTB: Option<&'static DeviceTreeBlobResponse> = DTB_REQUEST.get_response(); - pub static ref RDSP: Option<&'static RsdpResponse> = RSDP_REQUEST.get_response(); + pub static ref DTB: Option<&'static DeviceTreeBlobResponse> = match DTB_REQUEST.get_response() { + Some(resp) => { log_info!("Device: Got DTB pointer"); Some(resp) }, + None => { log_warning!("Device: Did not get DTB pointer"); None }, + }; + pub static ref RSDP: Option<&'static RsdpResponse> = match RSDP_REQUEST.get_response() { + Some(resp) => { log_info!("Device: Got RSDP pointer"); Some(resp) }, + None => { log_warning!("Device: Did not get RSDP pointer, ACPI unavailable"); None }, + }; +} + +// Just to check +pub fn init_statics() { + let _ = DTB.is_some(); + let _ = RSDP.is_some(); } #[allow(dead_code)] diff --git a/src/kernel/main.rs b/src/kernel/main.rs index 8ef70a0..09e745c 100644 --- a/src/kernel/main.rs +++ b/src/kernel/main.rs @@ -39,21 +39,15 @@ unsafe extern "C" fn main() -> ! { // Assert supported bootloader version assert!(BASE_REVISION.is_supported()); - let executable_file_response = FILE_REQUEST - .get_response() - .expect("Bootloader did not return executable data"); - let params = - get_kernel_params(limine::file::File::string(executable_file_response.file()).to_bytes()); - // Set up logging level from params // Nothing we can do here if this fails since no log subscribers are initialized yet - if let Some(level) = params.get("-loglevel") + if let Some(level) = PARAMS.get("-loglevel") && let Ok(parsed_level) = LogLevel::try_from(level.as_str()) { LOGGER.set_level(parsed_level); } // Add subscribers to logger - if let Some(device) = params.get("-logdev") { + if let Some(device) = PARAMS.get("-logdev") { let log_device_list: vec::Vec<&str> = device.split(',').collect(); if log_device_list.contains(&"display") { // Append display console to log subs @@ -68,17 +62,19 @@ unsafe extern "C" fn main() -> ! { log_info!( "Boot: Kernel cmdline: {}", String::from_utf8_lossy( - limine::file::File::string(executable_file_response.file()).to_bytes() + limine::file::File::string(EXECUTABLE_FILE_RESPONSE.file()).to_bytes() ) ); log_info!( "Boot: Kernel file path: {}", - String::from_utf8_lossy(executable_file_response.file().path().to_bytes()) + String::from_utf8_lossy(EXECUTABLE_FILE_RESPONSE.file().path().to_bytes()) ); log_info!("Boot: Booting gila version {}", kernel_version_string()); log_info!("Boot: Trans rights!"); + device::init_statics(); + if let Some(framebuffer_response) = FRAMEBUFFER_REQUEST.get_response() { let fb = framebuffer_response.framebuffers().next().unwrap(); log_info!("Boot: Framebuffer response received"); @@ -101,18 +97,6 @@ unsafe extern "C" fn main() -> ! { } } - // Try to obtain ACPI information first. If not available, fall back to - // flattened device tree. - let rsdp_response = RSDP_REQUEST.get_response(); - let dtb_response = DTB_REQUEST.get_response(); - if let Some(rdsp) = rsdp_response { - log_info!("Boot: RDSP response received"); - log_trace!("Boot: RDSP located at 0x{:x}", rdsp.address()); - } else if let Some(dtb) = dtb_response { - log_info!("Boot: DTB response received"); - log_trace!("Boot: DTB located at 0x{:x}", dtb.dtb_ptr() as usize) - } - let module_response = MODULE_REQUEST .get_response() .expect("Bootloader did not return kernel modules"); @@ -132,7 +116,7 @@ unsafe extern "C" fn main() -> ! { } let irfs_path = { - if let Some(key) = params.get("-initramfs") { + if let Some(key) = PARAMS.get("-initramfs") { key } else { INITRAMFS_DEFAULT_PATH diff --git a/src/kernel/params.rs b/src/kernel/params.rs index 3a31435..a85929c 100644 --- a/src/kernel/params.rs +++ b/src/kernel/params.rs @@ -4,6 +4,17 @@ use crate::memory::alloc; use alloc::string::String; use alloc::vec::Vec; +use lazy_static::lazy_static; +use limine::response::ExecutableFileResponse; +use crate::boot::FILE_REQUEST; + +lazy_static! { + pub static ref EXECUTABLE_FILE_RESPONSE: &'static ExecutableFileResponse = FILE_REQUEST + .get_response() + .expect("Bootloader did not return executable data"); + pub static ref PARAMS: KernelParameters = + get_kernel_params(limine::file::File::string(EXECUTABLE_FILE_RESPONSE.file()).to_bytes()); +} pub type KernelParameters = alloc::collections::BTreeMap; @@ -11,17 +22,17 @@ pub type KernelParameters = alloc::collections::BTreeMap; pub fn get_kernel_params(cmdline: &[u8]) -> KernelParameters { let cmd_str = String::from_utf8_lossy(cmdline).into_owned(); let args: Vec<&str> = cmd_str.split_ascii_whitespace().collect(); - let mut params: alloc::collections::BTreeMap = + let mut local_params: alloc::collections::BTreeMap = alloc::collections::BTreeMap::new(); for arg in args { let split: Vec<&str> = arg.split('=').collect(); if let Some(first) = split.first() { if split.len() > 1 { - params.insert(String::from(*first), split[1..].join("=")); + local_params.insert(String::from(*first), split[1..].join("=")); } else { - params.insert(String::from(*first), String::new()); + local_params.insert(String::from(*first), String::new()); } } } - params + local_params }