#![doc = include_str!("../README.md")]
#![feature(alloc_error_handler)]
#![feature(allocator_api)]
#![feature(btree_cursors)]
#![feature(core_intrinsics)]
#![feature(linkage)]
#![feature(min_specialization)]
#![feature(negative_impls)]
#![feature(ptr_metadata)]
#![feature(sync_unsafe_cell)]
#![cfg_attr(target_arch = "x86_64", feature(iter_advance_by, macro_metavar_expr))]
#![expect(internal_features)]
#![no_std]
#![warn(missing_docs)]
extern crate alloc;
#[macro_use]
extern crate ostd_pod;
macro_rules! __log_prefix {
() => {
""
};
}
#[cfg_attr(target_arch = "x86_64", path = "arch/x86/mod.rs")]
#[cfg_attr(target_arch = "riscv64", path = "arch/riscv/mod.rs")]
#[cfg_attr(target_arch = "loongarch64", path = "arch/loongarch/mod.rs")]
pub mod arch;
pub mod boot;
pub mod bus;
pub mod console;
pub mod cpu;
mod error;
mod ex_table;
pub mod io;
pub mod irq;
pub mod log;
pub mod mm;
pub mod panic;
pub mod power;
pub mod prelude;
pub mod smp;
pub mod sync;
pub mod task;
pub mod timer;
pub mod user;
pub mod util;
#[cfg(feature = "coverage")]
mod coverage;
use core::sync::atomic::{AtomicBool, Ordering};
pub use ostd_macros::{
global_frame_allocator, global_heap_allocator, global_heap_allocator_slot_map, main,
panic_handler,
};
pub use self::{error::Error, prelude::Result};
unsafe fn init() {
arch::enable_cpu_features();
unsafe { mm::frame::allocator::init_early_allocator() };
#[cfg(target_arch = "x86_64")]
arch::if_tdx_enabled!({
} else {
arch::serial::init();
});
#[cfg(not(target_arch = "x86_64"))]
arch::serial::init();
log::init();
unsafe { cpu::init_on_bsp() };
let meta_pages = unsafe { mm::frame::meta::init() };
unsafe { mm::frame::allocator::init() };
mm::kspace::init_kernel_page_table(meta_pages);
unsafe { mm::kspace::activate_kernel_page_table() };
sync::init();
boot::init_after_heap();
unsafe { arch::late_init_on_bsp() };
#[cfg(target_arch = "x86_64")]
arch::if_tdx_enabled!({
arch::serial::init();
});
smp::init();
unsafe { crate::mm::page_table::boot_pt::dismiss() };
arch::irq::enable_local();
invoke_ffi_init_funcs();
IN_BOOTSTRAP_CONTEXT.store(false, Ordering::Relaxed);
}
pub(crate) static IN_BOOTSTRAP_CONTEXT: AtomicBool = AtomicBool::new(true);
fn invoke_ffi_init_funcs() {
unsafe extern "C" {
fn __sinit_array();
fn __einit_array();
}
let call_len = (__einit_array as *const () as usize - __sinit_array as *const () as usize) / 8;
for i in 0..call_len {
unsafe {
let function = (__sinit_array as *const () as usize + 8 * i) as *const fn();
(*function)();
}
}
}
mod feature_validation {
#[cfg(all(not(target_arch = "riscv64"), feature = "riscv_sv39_mode"))]
compile_error!(
"feature \"riscv_sv39_mode\" cannot be specified for architectures other than RISC-V"
);
}
#[cfg(ktest)]
mod test {
use crate::prelude::*;
#[expect(clippy::eq_op)]
#[ktest]
fn trivial_assertion() {
assert_eq!(0, 0);
}
#[ktest]
#[should_panic]
fn failing_assertion() {
assert_eq!(0, 1);
}
#[ktest]
#[should_panic(expected = "expected panic message")]
fn expect_panic() {
panic!("expected panic message");
}
}
#[doc(hidden)]
pub mod ktest {
pub use ostd_macros::{test_main as main, test_panic_handler as panic_handler};
pub use ostd_test::*;
}