diff --git a/kernel/src/holeybytes/kernel_services/mem_serve.rs b/kernel/src/holeybytes/kernel_services/mem_serve.rs index 30be845..816f4be 100644 --- a/kernel/src/holeybytes/kernel_services/mem_serve.rs +++ b/kernel/src/holeybytes/kernel_services/mem_serve.rs @@ -4,12 +4,20 @@ use { kernel_services::{block_read, mem_serve}, Vm, }, - log::info, + alloc::alloc::alloc_zeroed, + log::{debug, info}, }; pub enum MemoryServiceError { InvalidMemoryFormat, } +#[derive(Debug)] +pub enum MemoryQuotaType { + NoQuota = 0, + SoftQuota = 1, + HardQuota = 2, + KillQuota = 3, +} fn alloc_page(vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), MemoryServiceError> { let mut val = alloc::vec::Vec::new(); @@ -28,14 +36,57 @@ pub fn memory_msg_handler( length: usize, ) -> Result<(), MemoryServiceError> { let mut msg_vec = block_read(mem_addr, length); + let msg_type = msg_vec[0]; + msg_vec.remove(0); + match msg_type { + 0 => { + let page_count = msg_vec[0]; + msg_vec.remove(0); + + // let mptr_raw: [u8; 8] = msg_vec[0..8].try_into().unwrap(); + // let mptr: u64 = u64::from_le_bytes(mptr_raw); + + // log::debug!("Allocating {} pages @ {}", page_count, mptr); + + let mut val = alloc::vec::Vec::new(); + for _ in 0..(page_count as isize * 4096) { + val.push(0); + } + vm.registers[1] = hbvm::value::Value(val.as_ptr() as u64); + } + 1 => { + let page_count = msg_vec[0]; + msg_vec.remove(0); + } + 2 => { + use MemoryQuotaType::*; + let quota_type = match msg_vec[0] { + 0 => NoQuota, + 1 => SoftQuota, + 2 => HardQuota, + 3 => KillQuota, + _ => NoQuota, + }; + msg_vec.remove(0); + let hid_raw: [u8; 8] = msg_vec[0..8].try_into().unwrap(); + let hid: u64 = u64::from_le_bytes(hid_raw); + for _ in 0..8 { + msg_vec.remove(0); + } + + let pid_raw: [u8; 8] = msg_vec[0..8].try_into().unwrap(); + let pid: u64 = u64::from_le_bytes(hid_raw); + for _ in 0..8 { + msg_vec.remove(0); + } + + debug!( + "Setting HID-{:x}:PID-{:x}'s quota type to {:?}", + hid, pid, quota_type + ) + } + _ => {} + } Ok(()) } - -// match memory_msg_handler(vm, mem_addr, length) { -// Ok(()) => { -// let free_chunks = allocator::get_free_chunks_count(); -// debug!("Free chunk count: {}", free_chunks); -// } -// Err(err) => log::error!("Improper log format"), -// }; diff --git a/kernel/src/holeybytes/mem.rs b/kernel/src/holeybytes/mem.rs index a53d66a..e9024c5 100644 --- a/kernel/src/holeybytes/mem.rs +++ b/kernel/src/holeybytes/mem.rs @@ -39,7 +39,6 @@ impl hbvm::mem::Memory for Memory { ) -> Result<(), hbvm::mem::LoadError> { use log::{error, info}; if addr.get() % 4096 == 0 {} - info!("a"); core::ptr::copy(addr.get() as *const u8, target, count); Ok(()) } diff --git a/kernel/src/kmain.rs b/kernel/src/kmain.rs index c016f31..0c6790c 100644 --- a/kernel/src/kmain.rs +++ b/kernel/src/kmain.rs @@ -94,7 +94,7 @@ pub fn kmain(cmdline: &str, boot_modules: BootModules) -> ! { }); } - info!("{}", hardware_random_u64()); + info!("Random number: {}", hardware_random_u64()); executor.run(); };