diff --git a/a.out b/a.out new file mode 100644 index 00000000..e69de29b diff --git a/kernel/src/kmain.rs b/kernel/src/kmain.rs index 0cd2b4ea..a4481629 100644 --- a/kernel/src/kmain.rs +++ b/kernel/src/kmain.rs @@ -8,6 +8,8 @@ use { arch::logging::SERIAL_CONSOLE, bootmodules::{build_cmd, BootModules}, device_tree::DeviceTree, + scheduler::Scheduler, + }, alloc::format, log::{debug, info, trace}, @@ -32,7 +34,7 @@ pub fn kmain(cmdline: &str, boot_modules: BootModules) -> ! { let dt = DEVICE_TREE.lock(); - info!("Device Tree{}", dt); + info!("Device Tree: {}", dt); info!("Boot complete. Moving to init_system"); // TODO: schedule the disk driver from the initramfs @@ -63,13 +65,17 @@ pub fn kmain(cmdline: &str, boot_modules: BootModules) -> ! { // log::error!("Program validation error: {e:?}"); } Ok(_) => { + // log::info!("valid program"); - use {crate::host::TrapHandler, hbvm::vm::Vm}; - let mut vm; - unsafe { - vm = Vm::new_unchecked(&prog, TrapHandler); - vm.memory.insert_test_page(); - } + // use {crate::host::TrapHandler, hbvm::vm::Vm}; + let mut sched = Scheduler::new(); + sched.new_process(prog.clone()); + sched.scheduler_run(); + // let mut vm; + // unsafe { + // vm = Vm::new_unchecked(&prog, TrapHandler); + // vm.memory.insert_test_page(); + // } // log::info!("Program interrupt: {:?}", vm.run()); // log::debug!("{:?}", vm.registers); } diff --git a/kernel/src/scheduler.rs b/kernel/src/scheduler.rs index 6543e6c7..d7724fd8 100644 --- a/kernel/src/scheduler.rs +++ b/kernel/src/scheduler.rs @@ -1,22 +1,51 @@ -use {crate::host::TrapHandler, alloc::vec::Vec, hbvm::vm::Vm}; +use { + alloc::{collections::VecDeque, rc::Rc, slice, vec::Vec}, + hbvm::validate::validate, +}; + +use {crate::host::TrapHandler, hbvm::vm::Vm}; pub struct Scheduler<'a> { - data: Vec>, + data: VecDeque>, } +// NOTE: This is a very simple schduler and it sucks and should be replaced with a better one +// Written By Yours Truly: Munir + + + impl Scheduler<'_> { - // fn new_process(&mut self, program: Vec) { - // let prog = program.clone(); - // #[allow(clippy::redundant_else)] - // if let Err(e) = validate(&prog) { - // log::error!("Program validation error: {e:?}"); - // } else { - // log::info!("valid program"); - // unsafe { - // let mut vm = Vm::new_unchecked(&prog, TrapHandler); - // vm.memory.insert_test_page(); - // self.data.push(vm); - // } - // } - // } + pub fn new() -> Self { + Self { + data: VecDeque::new(), + + } + } + pub fn new_process(&mut self, program: Vec) { + let prog = program.clone(); + let prog_arc = Rc::new(prog); + + let binding = Rc::try_unwrap(prog_arc).ok().unwrap(); + + #[allow(clippy::redundant_else)] + if let Err(e) = validate(&program.as_slice()) { + log::error!("Program validation error: {e:?}"); + } else { + log::info!("valid program"); + unsafe { + let slice = slice::from_raw_parts(binding.as_ptr(), binding.len()); + let mut vm = Vm::new_unchecked(&*slice, TrapHandler); + vm.memory.insert_test_page(); + self.data.push_front(vm); + } + } + } + + pub fn scheduler_run(&mut self) -> Option { + loop { + let mut prog = self.data.pop_front().unwrap(); + prog.run().unwrap(); + self.data.push_back(prog); + } + } }