#![no_std]
#![feature(doc_cfg)]
#[allow(unused_imports)]
#[macro_use]
extern crate log;
#[allow(unused_imports)]
#[macro_use]
extern crate memory_addr;
cfg_if::cfg_if! {
if #[cfg(feature = "myplat")] {
}
else if #[cfg(plat_dyn)] {
extern crate axplat_dyn;
}
else if #[cfg(all(target_os = "none", feature = "defplat"))] {
#[cfg(target_arch = "x86_64")]
extern crate axplat_x86_pc;
#[cfg(target_arch = "aarch64")]
extern crate axplat_aarch64_qemu_virt;
#[cfg(target_arch = "riscv64")]
extern crate axplat_riscv64_qemu_virt;
#[cfg(target_arch = "loongarch64")]
extern crate axplat_loongarch64_qemu_virt;
} else {
mod dummy;
}
}
pub mod dtb;
pub mod mem;
pub mod percpu;
pub mod time;
#[cfg(feature = "tls")]
pub mod tls;
#[cfg(feature = "irq")]
pub mod irq;
#[cfg(feature = "paging")]
pub mod paging;
pub mod console {
#[cfg(feature = "irq")]
pub use axplat::console::irq_num;
pub use axplat::console::{read_bytes, write_bytes};
}
pub mod power {
#[cfg(feature = "smp")]
pub use axplat::power::cpu_boot;
pub use axplat::power::system_off;
}
pub mod trap {
pub use axcpu::trap::{IRQ, PAGE_FAULT, PageFaultFlags, register_trap_handler};
}
pub mod context {
pub use axcpu::{TaskContext, TrapFrame};
}
pub use axcpu::asm;
#[cfg(feature = "uspace")]
pub use axcpu::uspace;
pub use axplat::init::init_later;
#[cfg(feature = "smp")]
pub use axplat::init::{init_early_secondary, init_later_secondary};
pub fn init_early(cpu_id: usize, arg: usize) {
dtb::init(arg);
axplat::init::init_early(cpu_id, arg);
}
pub fn cpu_num() -> usize {
#[cfg(feature = "smp")]
{
use spin::Lazy;
static CPU_NUM: Lazy<usize> = Lazy::new(|| {
let max_cpu_num = axconfig::plat::MAX_CPU_NUM;
let plat_cpu_num = axplat::power::cpu_num();
let cpu_num = plat_cpu_num.min(max_cpu_num);
info!("CPU number: max = {max_cpu_num}, platform = {plat_cpu_num}, use = {cpu_num}");
if plat_cpu_num > max_cpu_num {
warn!(
"platform declares more CPUs ({plat_cpu_num}) than configured max \
({max_cpu_num}), only the first {max_cpu_num} CPUs will be used."
);
}
cpu_num
});
*CPU_NUM
}
#[cfg(not(feature = "smp"))]
{
1
}
}
#[allow(unused_macros)]
macro_rules! addr_of_sym {
($e:ident) => {
$e as *const () as usize
};
}
pub(crate) use addr_of_sym;