diff --git a/README.md b/README.md index fb8a8f8..d7191c5 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,11 @@ Licensed under the GNU Public License v3. See [LICENSE](LICENSE) for details. - [boot.rs](src/boot.rs): Handles bootloader handoff. Gila uses Limine. Other bootloaders are NOT supported. - [display.rs](src/display.rs): Handles text-mode display via the VGA buffer. - [lib.rs](src/lib.rs): Glue to make all files accessible from [main.rs](src/main.rs). +- [log.rs](src/log.rs): Logging structures and singletons for logging to serial or the display. - [main.rs](src/main.rs): The entry point that gets called by the bootloader. - [memory.rs](src/memory.rs): Types relating to memory regions and allocation. - [panic.rs](src/panic.rs): The panic handler and associated functionality. +- [params.rs](src/params.rs): Kernel parameter handler code. - [process.rs](src/process.rs): Process types and functions. - [resources.rs](src/resources.rs): Resources that are accessible from multiple parts of the code. diff --git a/src/main.rs b/src/main.rs index 09792cf..cc58211 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,29 +16,67 @@ use gila::process; #[unsafe(no_mangle)] unsafe extern "C" fn main() -> ! { + // Assert supported bootloader version assert!(BASE_REVISION.is_supported()); - let kernel_file_response = FILE_REQUEST.get_response().unwrap(); + // Local logger fn + fn log(level: LogLevel, msg: &str) { + LOGGER.lock().log(level, msg); + } - let kernel_parameters = get_kernel_params(kernel_file_response.file().cmdline()); + // Set up some stuff based on kernel params if we get any + if let Some(kernel_file_response) = FILE_REQUEST.get_response() { + let kernel_parameters = get_kernel_params(kernel_file_response.file().cmdline()); - if let Some(level) = kernel_parameters.get("-loglevel") { - if let Ok(parsed_level) = LogLevel::try_from(level.as_str()) { - LOGGER.lock().level = parsed_level; - } - } - if let Some(device) = kernel_parameters.get("-logdev") { - let log_device_list: vec::Vec<&str> = device.split(',').collect(); - if log_device_list.contains(&"display") { - // Append display console to log subs - } - if log_device_list.contains(&"serial") { - // Append serial console to log subs + // Set up logging level from params + if let Some(level) = kernel_parameters.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") { + let log_device_list: vec::Vec<&str> = device.split(',').collect(); + if log_device_list.contains(&"display") { + // Append display console to log subs + } + if log_device_list.contains(&"serial") { + // Append serial console to log subs + } + } + + { + let kernel_cmdline_string = + string::String::from_utf8_lossy(kernel_file_response.file().cmdline()); + log( + LogLevel::INFO, + &format!("Kernel cmdline: {}", kernel_cmdline_string), + ); + drop(kernel_cmdline_string); + } + + { + let kernel_path = string::String::from_utf8_lossy(kernel_file_response.file().path()); + log( + LogLevel::INFO, + &format!("Kernel file path: {}", kernel_path), + ); + drop(kernel_path); } } + log(LogLevel::INFO, "Booting Gila..."); + let _smp_response = SMP_REQUEST.get_response(); + match _smp_response { + None => log(LogLevel::ERROR, "SMP response not received. Multiprocessing is disabled."), + Some(resp) => { + log(LogLevel::INFO, "SMP response received. Multiprocessing enabled."); + log(LogLevel::INFO, &format!("{} CPUs found.", resp.cpus().len())); + }, + } + loop { unsafe { asm::halt();