gila/src/kernel/main.rs
2025-03-29 00:44:54 -04:00

105 lines
2.9 KiB
Rust

// 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();
}
}
}