diff --git a/kernel/src/arch/x86_64/mod.rs b/kernel/src/arch/x86_64/mod.rs index 16ec21d..18809cf 100644 --- a/kernel/src/arch/x86_64/mod.rs +++ b/kernel/src/arch/x86_64/mod.rs @@ -1,8 +1,9 @@ -use embedded_graphics::pixelcolor::Rgb888; - use { crate::{arch::x86_64::graphics::DISPLAY, bootmodules::BootModule}, core::arch::asm, + embedded_graphics::pixelcolor::Rgb888, + log::warn, + rdrand::RdSeed, }; pub mod memory; @@ -186,11 +187,29 @@ pub fn spin_loop() -> ! { pub fn hardware_random_u64() -> u64 { use {log::trace, rdrand::RdRand}; - let gen = RdRand::new().unwrap(); - let ret = gen.try_next_u64().unwrap(); - trace!("Random {}", ret); - - ret + let gen = RdRand::new(); + match gen { + Ok(gen) => { + let ret = gen.try_next_u64().unwrap(); + trace!("Random {}", ret); + return ret; + } + Err(err) => { + warn!("RDRand not supported."); + // Try rdseed + let gen = RdSeed::new(); + match gen { + Ok(gen) => { + let ret = gen.try_next_u64().unwrap(); + trace!("Random {}", ret); + return ret; + } + Err(err) => { + panic!("Neither RDRand or RDSeed are supported") + } + } + } + } } pub fn get_edid() {} diff --git a/kernel/src/holeybytes/ecalls.rs b/kernel/src/holeybytes/ecalls.rs deleted file mode 100644 index 3c821df..0000000 --- a/kernel/src/holeybytes/ecalls.rs +++ /dev/null @@ -1,41 +0,0 @@ -use { - crate::{ - ipc::buffer::{BufferTypes, IpcBuffer}, - kmain::IPC_BUFFERS, - }, - hbvm::value::Value, -}; - -pub fn make_ipc_buffer(registers: [Value; 256]) { - let r255 = registers[255]; - let r254 = registers[254]; - let r253 = registers[253]; - - let bounded = match unsafe { r254.u64 } { - 0 => false, - 1 => true, - _ => { - panic!("Bad"); - } - }; - - let length = unsafe { r254.u64 }; - - let mut buffs = IPC_BUFFERS.lock(); - match bounded { - false => { - let abc = IpcBuffer::new(false, 0); - buffs.push(abc); - } - true => { - let abc = IpcBuffer::new(true, length); - buffs.push(abc); - } - }; -} - -pub fn delete_ipc_buffer(registers: [Value; 256]) { - log::warn!("Unstable ecall"); - //TODO: fully define out how to layout the ecall for deleting buffers - //and figure out what happens if there are still messages in the queue -} diff --git a/kernel/src/holeybytes/mod.rs b/kernel/src/holeybytes/mod.rs index c63ea97..fc8e2e8 100644 --- a/kernel/src/holeybytes/mod.rs +++ b/kernel/src/holeybytes/mod.rs @@ -1,19 +1,17 @@ -use crate::kmain::IPC_BUFFERS; - use { + crate::{arch, ipc::buffer::IpcBuffer, kmain::IPC_BUFFERS}, alloc::boxed::Box, core::{default, future::Future, task::Poll}, hbvm::{ mem::{ softpaging::{icache::ICache, HandlePageFault, SoftPagedMem}, - Address, + Address, Memory, }, Vm, VmRunError, VmRunOk, }, + log::{debug, info, trace, warn}, }; -mod ecalls; - const TIMER_QUOTIENT: usize = 100; pub struct ExecThread<'p> { @@ -75,13 +73,56 @@ Register dump: {:?}", } 1 => { // Make buffer - ecalls::make_ipc_buffer(self.vm.registers); + let r255 = self.vm.registers[255]; + let r254 = self.vm.registers[254]; + let r253 = self.vm.registers[253]; + + let bounded = match unsafe { r254.u64 } { + 0 => false, + 1 => true, + _ => { + panic!("Bad"); + } + }; + + let length = unsafe { r254.u64 }; + + let mut buffs = IPC_BUFFERS.lock(); + let abc; + + match bounded { + false => { + abc = IpcBuffer::new(false, 0); + } + true => { + abc = IpcBuffer::new(true, length); + } + }; + let buff_id = arch::hardware_random_u64(); + buffs.insert(buff_id, abc); + debug!("Buffer ID: {}", buff_id); } 2 => { // Delete buffer - ecalls::delete_ipc_buffer(self.vm.registers); } + 3 => { + // Send a message to a buffer + let r254 = self.vm.registers[254]; + let r253 = self.vm.registers[253]; + let r252 = self.vm.registers[252]; + let buffer_id = unsafe { r254.u64 }; + let mem_addr = unsafe { r253.u64 }; + let length = unsafe { r252.u64 as usize }; + trace!("{:?}", mem_addr); + use alloc::vec::Vec; + + if buffer_id == 1 { + info!("Logging") + } + } + // 4 + // 5 _ => { log::error!("Syscall unknown {:?}", r255) } diff --git a/kernel/src/kmain.rs b/kernel/src/kmain.rs index 53e2786..192dc31 100644 --- a/kernel/src/kmain.rs +++ b/kernel/src/kmain.rs @@ -1,6 +1,6 @@ //! AbleOS Kernel Entrypoint -use hbvm::mem::Address; +use {hashbrown::HashMap, hbvm::mem::Address}; use crate::{capabilities, holeybytes::ExecThread, ipc::buffer::IpcBuffer}; // use crate::arch::sloop; @@ -65,8 +65,9 @@ pub static DEVICE_TREE: Lazy> = Lazy::new(|| { }); use alloc::vec::Vec; -pub static IPC_BUFFERS: Lazy>> = Lazy::new(|| { - let bufs = Vec::new(); +pub type IpcBuffers = HashMap; +pub static IPC_BUFFERS: Lazy> = Lazy::new(|| { + let bufs = HashMap::new(); Mutex::new(bufs) }); diff --git a/repbuild/holeybytes/ecall.hb b/repbuild/holeybytes/ecall.hb index 9183271..77c83ec 100644 Binary files a/repbuild/holeybytes/ecall.hb and b/repbuild/holeybytes/ecall.hb differ diff --git a/repbuild/src/main.rs b/repbuild/src/main.rs index 88d9ea2..2758e25 100644 --- a/repbuild/src/main.rs +++ b/repbuild/src/main.rs @@ -191,6 +191,7 @@ fn run(release: bool, target: Target) -> Result<(), Error> { "-drive", "file=target/disk.img,format=raw", "-m", "4G", "-smp", "cores=4", + "-cpu", "Broadwell-v4" ]); } Target::Riscv64Virt => {