ECALL work and expanded errors on HBVM shutdown

This commit is contained in:
able 2023-09-07 14:36:53 -05:00
parent b04ee13185
commit 54844b46a0
4 changed files with 69 additions and 6 deletions

View file

@ -1,6 +1,6 @@
use { use {
alloc::boxed::Box, alloc::boxed::Box,
core::{future::Future, task::Poll}, core::{default, future::Future, task::Poll},
hbvm::{ hbvm::{
mem::{ mem::{
softpaging::{icache::ICache, HandlePageFault, SoftPagedMem}, softpaging::{icache::ICache, HandlePageFault, SoftPagedMem},
@ -17,7 +17,6 @@ pub struct ExecThread<'p> {
} }
unsafe impl<'p> Send for ExecThread<'p> {} unsafe impl<'p> Send for ExecThread<'p> {}
impl<'p> ExecThread<'p> { impl<'p> ExecThread<'p> {
pub unsafe fn new(program: &'p [u8], entrypoint: Address) -> Self { pub unsafe fn new(program: &'p [u8], entrypoint: Address) -> Self {
ExecThread { ExecThread {
@ -44,11 +43,67 @@ impl<'p> Future for ExecThread<'p> {
cx: &mut core::task::Context<'_>, cx: &mut core::task::Context<'_>,
) -> Poll<Self::Output> { ) -> Poll<Self::Output> {
match self.vm.run() { match self.vm.run() {
Err(err) => return Poll::Ready(Err(err)), Err(err) => {
log::error!(
"HBVM Error\r
Register dump: {:?}",
self.vm.registers
);
return Poll::Ready(Err(err));
}
Ok(VmRunOk::End) => return Poll::Ready(Ok(())), Ok(VmRunOk::End) => return Poll::Ready(Ok(())),
Ok(VmRunOk::Ecall) => { Ok(VmRunOk::Ecall) => {
log::info!("Ecall"); let r255 = self.vm.registers[255];
log::info!("{:?}", self.vm.registers); let r254 = self.vm.registers[254];
let r253 = self.vm.registers[253];
log::debug!("Ecall number {:?}", r255);
log::trace!("Register dump: {:?}", self.vm.registers);
match r255.cast::<u64>() {
0 => {
// TODO: explode computer
// hello world ecall
for x in 0u64..=255 {
self.vm.registers[x as usize] = x.into();
}
}
1 => {
// Make buffer
log::trace!(
"bounded: {}\n\r
length: {:?}",
match unsafe { r254.u64 } {
0 => {
false
}
1 => {
true
}
_ => {
// TODO: throw this back to the runtime
panic!("Bad");
}
},
r253
)
}
2 => {
// Delete buffer
log::warn!("Syscall 2");
}
3 => {
log::warn!("Syscall 3");
}
4 => {
log::warn!("Syscall 4");
}
_ => {
log::error!("Syscall unknown {:?}", r255)
}
}
} }
Ok(VmRunOk::Timer) => (), Ok(VmRunOk::Timer) => (),
} }

View file

@ -5,7 +5,7 @@ use {
crossbeam_queue::{ArrayQueue, SegQueue}, crossbeam_queue::{ArrayQueue, SegQueue},
}; };
enum BufferTypes { pub enum BufferTypes {
Unbound(SegQueue<Message>), Unbound(SegQueue<Message>),
Bound(ArrayQueue<Message>), Bound(ArrayQueue<Message>),
} }

View file

@ -63,6 +63,12 @@ pub static DEVICE_TREE: Lazy<Mutex<DeviceTree>> = Lazy::new(|| {
Mutex::new(dt) Mutex::new(dt)
}); });
use {crate::ipc::buffer::BufferTypes, alloc::vec::Vec};
pub static IPC_BUFFERS: Lazy<Mutex<Vec<BufferTypes>>> = Lazy::new(|| {
let bufs = Vec::new();
Mutex::new(bufs)
});
#[test_case] #[test_case]
fn trivial_assertion() { fn trivial_assertion() {
trace!("trivial assertion... "); trace!("trivial assertion... ");

View file

@ -42,6 +42,8 @@ pub const VERSION: Version = Version {
#[panic_handler] #[panic_handler]
fn panic(info: &core::panic::PanicInfo) -> ! { fn panic(info: &core::panic::PanicInfo) -> ! {
arch::register_dump();
if let Some(loc) = info.location() { if let Some(loc) = info.location() {
let _ = crate::arch::log(format_args!( let _ = crate::arch::log(format_args!(
"Location: {}: {}, {}\r\n", "Location: {}: {}, {}\r\n",