105 lines
2.9 KiB
Rust
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();
|
|
}
|
|
}
|
|
}
|