// Copyright (c) 2025 shibedrill // SPDX-License-Identifier: GPL-3.0-or-later #![no_std] #![no_main] #![feature(allocator_api)] mod arch; mod boot; mod log; mod memory; mod panic; mod params; mod process; mod resources; mod syscall_runner; use crate::boot::*; use crate::log::*; use crate::memory::alloc::{format, string::String, vec}; use crate::params::*; #[unsafe(no_mangle)] unsafe extern "C" fn main() -> ! { // Assert supported bootloader version assert!(BASE_REVISION.is_supported()); // Local logger fn fn log(level: LogLevel, msg: &str) { LOGGER.lock().log(level, msg); } // 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( 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 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 } log(LogLevel::Info, "Boot: Configured kernel logging devices.") } log( LogLevel::Info, &format!( "Boot: Kernel cmdline: {}", String::from_utf8_lossy( limine::file::File::string(executable_file_response.file()).to_bytes() ) ), ); log( LogLevel::Info, &format!( "Boot: Kernel file path: {}", String::from_utf8_lossy(executable_file_response.file().path().to_bytes()) ), ); } log( LogLevel::Info, "Boot: Log devices configured. Booting `gila`.", ); log(LogLevel::Info, "Boot: Trans Rights!"); let _smp_response = MP_REQUEST.get_response(); match _smp_response { None => log( LogLevel::Error, "MP: bootloader response not received. Multiprocessing is disabled.", ), Some(resp) => { log( LogLevel::Info, "MP: bootloader response received. Multiprocessing enabled.", ); log( LogLevel::Info, &format!("MP: {} CPUs found.", resp.cpus().len()), ); } } let _rsdp_response = RSDP_REQUEST.get_response(); loop { unsafe { arch::current::asm::halt(); } } }