#![no_std]
#![warn(missing_docs)]
#![deny(warnings)]
extern crate alloc;
mod application;
pub mod panic_wait;
pub mod schedulers;
pub use application::Application;
#[macro_export]
macro_rules! kernel
{
(
name: $kernel_name:ident,
instance: $kernel_instance:ident,
main_arguments: ( $($main_arg_name:ident : $main_arg_type:ty),* $(,)? ),
devices: { $($dev_name:ident : $dev_type:ty => ($($dev_create_arg:tt)*) / ($($dev_init_arg:tt)*)),+ $(,)? },
stdout: None,
scheduler: $scheduler_type:ty => ($($scheduler_create_args:tt)*) / ($($scheduler_init_args:tt)*),
applications: { $($app_name:ident : $app_type:ty => ($($app_create_arg:tt)*)),+ $(,)? }
) => (
mango_os::boot::entry_point!($kernel_name);
pub struct Kernel
{
$(pub $dev_name: spin::Mutex<$dev_type>,)+
pub scheduler: spin::Mutex<$scheduler_type>,
}
lazy_static! {
pub static ref $kernel_instance: Kernel = Kernel {
$($dev_name: spin::Mutex::new(<$dev_type>::new($($dev_create_arg, )*)),)+
scheduler: spin::Mutex::new(<$scheduler_type>::new($($scheduler_create_args, )*)),
};
}
fn $kernel_name($($main_arg_name: $main_arg_type,)*) -> !
{
$($kernel_instance.$dev_name.lock().initialise($($dev_init_arg, )*);)+
$kernel_instance.scheduler.lock().initialise($($scheduler_init_args)*);
$(let mut $app_name = <$app_type>::new($($app_create_arg)*);)+
$($app_name.start();)+
$kernel_instance.scheduler.lock().run();
}
);
(
name: $kernel_name:ident,
instance: $kernel_instance:ident,
main_arguments: ( $($main_arg_name:ident : $main_arg_type:ty),* $(,)? ),
devices: { $($dev_name:ident : $dev_type:ty => ($($dev_create_arg:tt)*) / ($($dev_init_arg:tt)*)),+ $(,)? },
stdout: $stdout_name:expr,
scheduler: $scheduler_type:ty => ($($scheduler_create_args:tt)*) / ($($scheduler_init_args:tt)*),
applications: { $($app_name:ident : $app_type:ty => ($($app_create_arg:tt)*)),* $(,)? }
) => (
mango_os::boot::entry_point!($kernel_name);
pub struct Kernel
{
$(pub $dev_name: spin::Mutex<$dev_type>,)+
pub scheduler: spin::Mutex<$scheduler_type>,
}
lazy_static! {
pub static ref $kernel_instance: Kernel = Kernel {
$($dev_name: spin::Mutex::new(<$dev_type>::new($($dev_create_arg, )*)),)+
scheduler: spin::Mutex::new(<$scheduler_type>::new($($scheduler_create_args, )*)),
};
}
fn $kernel_name($($main_arg_name: $main_arg_type,)*) -> !
{
$($kernel_instance.$dev_name.lock().initialise($($dev_init_arg, )*);)+
$kernel_instance.scheduler.lock().initialise($($scheduler_init_args)*);
mango_os::core::STDOUT.lock().set_printer_fn(
|x| {
if let Some(dev) = $stdout_name
{
use core::fmt::Write;
dev.lock().write_str(x)
} else {
Ok(())
}
});
$(let mut $app_name = <$app_type>::new($($app_create_arg)*);)*
$($app_name.start();)*
$kernel_instance.scheduler.lock().run();
}
#[panic_handler]
fn panic_handler(info: &core::panic::PanicInfo) -> !
{
$crate::panic_wait::panic_handler(info, &$kernel_instance.system)
}
);
}