diff --git a/Cargo.lock b/Cargo.lock index 6e81e02..ca1d12b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,9 +27,39 @@ checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "build_const" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "core2" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239fa3ae9b63c2dc74bd3fa852d4792b8b305ae64eeede946265b6af62f1fff3" +dependencies = [ + "memchr", +] + +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +dependencies = [ + "build_const", +] [[package]] name = "critical-section" @@ -71,6 +101,7 @@ dependencies = [ "enumflags2", "flagset", "limine", + "lzma-rs", "once_cell", "spin", "talc", @@ -101,6 +132,22 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "lzma-rs" +version = "0.2.0" +source = "git+https://github.com/glaeqen/lzma-no-std-rs/#5635feaf5923f54161e9582dddb80cd457c07223" +dependencies = [ + "byteorder", + "core2", + "crc", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + [[package]] name = "once_cell" version = "1.21.3" diff --git a/Cargo.toml b/Cargo.toml index cff820c..00f67c8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ acpi = "5.1.0" enumflags2 = "0.7.11" flagset = "0.4.7" limine = "0.4.0" +lzma-rs = { git = "https://github.com/glaeqen/lzma-no-std-rs/", version = "0.2.0", default-features = false } once_cell = { version = "1.20.3", default-features = false, features = ["alloc", "critical-section"] } spin = "0.10.0" talc = "4.4.2" diff --git a/Makefile.toml b/Makefile.toml index 8942a4b..aa834b2 100644 --- a/Makefile.toml +++ b/Makefile.toml @@ -144,4 +144,4 @@ script = ''' [tasks.run] dependencies = ["iso"] command = "${QEMUCOMMAND}" -args = ["-drive", "file=build/gila.iso,format=raw,index=0,media=disk", "-serial", "stdio"] \ No newline at end of file +args = ["-display", "none", "-drive", "file=build/gila.iso,format=raw,index=0,media=disk", "-serial", "stdio"] \ No newline at end of file diff --git a/limine.conf b/limine.conf index f5a2ec4..01b3ae2 100644 --- a/limine.conf +++ b/limine.conf @@ -1,7 +1,7 @@ -timeout: 5 +timeout: 2 /Gila protocol: limine kernel_path: boot():/boot/kernel - cmdline: -loglevel=Trace -logdev=display,serial + cmdline: -loglevel=Trace -logdev=display,serial -initramfs=/boot/initramfs.tar.lzma module_path: boot():/boot/initramfs.tar.lzma diff --git a/src/kernel/main.rs b/src/kernel/main.rs index 08ab45c..ce52e43 100644 --- a/src/kernel/main.rs +++ b/src/kernel/main.rs @@ -17,11 +17,14 @@ mod syscall_runner; use arch::current::*; use arch::x86_64::serial::Serialport; +use limine::file::File; use spin::mutex::Mutex; +#[allow(unused_imports)] +use lzma_rs::lzma_decompress; use crate::boot::*; use crate::log::*; -use crate::memory::alloc::{boxed, format, string::*, vec}; +use crate::memory::alloc::{boxed, format, string::*, vec, collections::BTreeMap}; use crate::params::*; #[unsafe(no_mangle)] @@ -37,20 +40,22 @@ unsafe extern "C" fn main() -> ! { LOGGER.lock().log(level, msg); } + let mut params: BTreeMap = BTreeMap::new(); + // Set up some stuff based on kernel params if we get any if let Some(executable_file_response) = FILE_REQUEST.get_response() { - let kernel_parameters = get_kernel_params( + params = get_kernel_params( limine::file::File::string(executable_file_response.file()).to_bytes(), ); // Set up logging level from params - if let Some(level) = kernel_parameters.get("-loglevel") { + if let Some(level) = params.get("-loglevel") { if let Ok(parsed_level) = LogLevel::try_from(level.as_str()) { LOGGER.lock().level = parsed_level; } } // Add subscribers to logger - if let Some(device) = kernel_parameters.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 @@ -80,6 +85,7 @@ unsafe extern "C" fn main() -> ! { ), ); } + if let Some(address_response) = ADDRESS_REQUEST.get_response() { log( LogLevel::Trace, @@ -89,28 +95,12 @@ unsafe extern "C" fn main() -> ! { ), ) } - if let Some(module_response) = MODULE_REQUEST.get_response() { - log( - LogLevel::Info, - &format!( - "Boot: Kernel modules count: {}", - module_response.modules().len() - ), - ); - if !module_response.modules().is_empty() { - log(LogLevel::Info, "Boot: Kernel modules list:"); - for module in module_response.modules() { - log( - LogLevel::Info, - &format!("\t{}", String::from_utf8_lossy(module.path().to_bytes())), - ) - } - } - } + log( LogLevel::Info, "Boot: Log devices configured. Booting `gila`.", ); + log(LogLevel::Info, "Boot: Trans Rights!"); if let Some(framebuffer_response) = FRAMEBUFFER_REQUEST.get_response() { @@ -145,6 +135,47 @@ unsafe extern "C" fn main() -> ! { let _rsdp_response = RSDP_REQUEST.get_response(); + // TODO: Get the initramfs + if let Some(module_response) = MODULE_REQUEST.get_response() { + log( + LogLevel::Info, + &format!( + "Boot: Kernel modules count: {}", + module_response.modules().len() + ), + ); + if !module_response.modules().is_empty() { + log(LogLevel::Info, "Boot: Kernel modules list:"); + for module in module_response.modules() { + log( + LogLevel::Info, + &format!("\t{}", String::from_utf8_lossy(module.path().to_bytes())), + ) + } + } + if let Some(irfs_path) = params.get("-initramfs") { + log( + LogLevel::Info, + &format!("Boot: initramfs path requested: {}", irfs_path) + ); + let initramfs_option: Option<&File> = { + let mut result: Option<&File> = None; + for file in module_response.modules() { + if &file.path().to_string_lossy().to_string() == irfs_path { + result = Some(file); + } + }; + result + }; + if let Some(_initramfs_file) = initramfs_option { + log( + LogLevel::Info, + "Boot: Found initramfs at supplied path" + ) + } + } + } + loop { for _i in 0..100000000 { unsafe {