most recent HBVM works

pull/4/head
able 2023-06-26 06:36:30 -05:00
parent 897a3921c8
commit bd001f85be
6 changed files with 256 additions and 72 deletions

120
Cargo.lock generated
View File

@ -43,6 +43,12 @@ dependencies = [
"memchr",
]
[[package]]
name = "allocator-api2"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56fc6cf8dc8c4158eed8649f9b8b0ea1518eb62b544fe9490d66fa0b349eafe9"
[[package]]
name = "android_system_properties"
version = "0.1.5"
@ -81,6 +87,12 @@ version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973"
[[package]]
name = "beef"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1"
[[package]]
name = "bit"
version = "0.1.1"
@ -158,6 +170,12 @@ dependencies = [
"unicode-width",
]
[[package]]
name = "convert_case"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
[[package]]
name = "core-foundation-sys"
version = "0.8.4"
@ -227,14 +245,27 @@ dependencies = [
"syn 2.0.13",
]
[[package]]
name = "delegate"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d358e0ec5c59a5e1603b933def447096886121660fc680dc1e64a0753981fe3c"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "derive_more"
version = "0.99.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
dependencies = [
"convert_case",
"proc-macro2",
"quote",
"rustc_version",
"syn 1.0.109",
]
@ -336,6 +367,12 @@ dependencies = [
"num-traits",
]
[[package]]
name = "fnv"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "getrandom"
version = "0.2.8"
@ -365,13 +402,45 @@ dependencies = [
"ahash 0.8.3",
]
[[package]]
name = "hashbrown"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
dependencies = [
"ahash 0.8.3",
"allocator-api2",
]
[[package]]
name = "hbasm"
version = "0.1.0"
source = "git+https://git.ablecorp.us/ableos/holey-bytes#b7c34775e4514c05bf0927bd2bd2f6de90715f0d"
dependencies = [
"hashbrown 0.14.0",
"hbbytecode",
"lasso",
"logos",
"paste",
]
[[package]]
name = "hbbytecode"
version = "0.1.0"
source = "git+https://git.ablecorp.us/ableos/holey-bytes#b7c34775e4514c05bf0927bd2bd2f6de90715f0d"
[[package]]
name = "hbvm"
version = "0.1.0"
source = "git+https://git.ablecorp.us/ableos/holey-bytes#76302b4ca8aeda6597ee51cb1cf5f59a5d385c4f"
source = "git+https://git.ablecorp.us/ableos/holey-bytes#b7c34775e4514c05bf0927bd2bd2f6de90715f0d"
dependencies = [
"delegate",
"derive_more",
"hashbrown 0.13.2",
"hbbytecode",
"log",
"paste",
"static_assertions",
]
[[package]]
@ -468,6 +537,7 @@ dependencies = [
"embedded-graphics",
"error-stack 0.3.1",
"hashbrown 0.12.3",
"hbasm",
"hbvm",
"limine",
"log",
@ -483,6 +553,16 @@ dependencies = [
"xml",
]
[[package]]
name = "lasso"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4644821e1c3d7a560fe13d842d13f587c07348a1a05d3a797152d41c90c56df2"
dependencies = [
"ahash 0.8.3",
"hashbrown 0.13.2",
]
[[package]]
name = "libc"
version = "0.2.141"
@ -528,6 +608,38 @@ dependencies = [
"cfg-if",
]
[[package]]
name = "logos"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c000ca4d908ff18ac99b93a062cb8958d331c3220719c52e77cb19cc6ac5d2c1"
dependencies = [
"logos-derive",
]
[[package]]
name = "logos-codegen"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc487311295e0002e452025d6b580b77bb17286de87b57138f3b5db711cded68"
dependencies = [
"beef",
"fnv",
"proc-macro2",
"quote",
"regex-syntax",
"syn 2.0.13",
]
[[package]]
name = "logos-derive"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbfc0d229f1f42d790440136d941afd806bc9e949e2bcb8faa813b0f00d1267e"
dependencies = [
"logos-codegen",
]
[[package]]
name = "memchr"
version = "2.5.0"
@ -740,6 +852,12 @@ dependencies = [
"lock_api",
]
[[package]]
name = "static_assertions"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "supports-color"
version = "1.3.1"

View File

@ -7,6 +7,8 @@ version = "0.2.0"
[dependencies]
hbvm = { git = "https://git.ablecorp.us/ableos/holey-bytes" }
hbasm = { git = "https://git.ablecorp.us/ableos/holey-bytes" }
embedded-graphics = "0.7.1"

101
kernel/src/host.rs Normal file
View File

@ -0,0 +1,101 @@
//! the system interface
// use {
// crate::ipc::message::Message,
// alloc::vec::Vec,
// crossbeam_queue::{ArrayQueue, SegQueue},
// // hbvm::engine::Engine,
// log::trace,
// HostError::MemoryError,
// };
/// Host errors
pub enum HostError {
/// A host memory error
MemoryError,
}
// / Check f0 register for the handle
// / check f1 for the message ptr
// / check f2 for the message length
// pub fn ipc_send(engine: &mut Engine) -> Result<(), HostError> {
// let _handle = engine.registers.f0;
// let message_start = engine.registers.f1;
// let message_length = engine.registers.f2;
// let mut ipc_msg: Vec<u8> = alloc::vec![];
// for x in message_start..message_start + message_length {
// let byte = engine.read_mem_addr_8(x);
// match byte {
// Ok(byte) => ipc_msg.push(byte),
// Err(_) => return Err(MemoryError),
// }
// }
// log::trace!("Message bytes {:?}", ipc_msg);
// Ok(())
// }
// // pub fn ipc_recv(_engine: &mut Engine) {}
// /// Check f0 for the buffer type
// /// 0 means an unbound buffer
// /// 1 means a bound buffer
// /// Check f1 if the buffer is bound
// ///
// /// f2 Return a handle to the sender
// /// f3 returns a handle the the reciever
// pub fn ipc_mkbuf(engine: &mut Engine) {
// match engine.registers.f0 as usize {
// 0 => {
// trace!("Making a new ipc unbound buffer");
// let _buf: SegQueue<Message> = SegQueue::new();
// }
// 1 => {
// let buf_len = engine.registers.f1 as usize;
// trace!("Making a new ipc buffer with capacity {}", buf_len);
// let _buf: ArrayQueue<Message> = ArrayQueue::new(buf_len);
// }
// _ => {}
// }
// }
// // pub fn rpc_discover(_engine: &mut Engine) {}
// // pub fn rpc_register(_engine: &mut Engine) {}
// // pub fn rpc_call(_engine: &mut Engine) {}
use hbvm::vm::{
mem::{Memory, MemoryAccessReason, PageSize},
trap::HandleTrap,
value::Value,
};
/// AbleOS HBVM traphandler
pub struct TrapHandler;
impl HandleTrap for TrapHandler {
fn page_fault(
&mut self,
_: MemoryAccessReason,
_: &mut Memory,
_: u64,
_: PageSize,
_: *mut u8,
) -> bool {
false
}
fn invalid_op(&mut self, _: &mut [Value; 256], _: &mut usize, _: &mut Memory, _: u8) -> bool
where
Self: Sized,
{
log::trace!("Invalid opcode");
false
}
fn ecall(&mut self, _: &mut [Value; 256], _: &mut usize, _: &mut Memory)
where
Self: Sized,
{
log::trace!("ableOS system call made");
}
}

View File

@ -1,64 +0,0 @@
//! the system interface
use {
crate::ipc::message::Message,
alloc::vec::Vec,
crossbeam_queue::{ArrayQueue, SegQueue},
hbvm::engine::Engine,
log::trace,
HostError::MemoryError,
};
/// Host errors
pub enum HostError {
/// A host memory error
MemoryError,
}
/// Check f0 register for the handle
/// check f1 for the message ptr
/// check f2 for the message length
pub fn ipc_send(engine: &mut Engine) -> Result<(), HostError> {
let _handle = engine.registers.f0;
let message_start = engine.registers.f1;
let message_length = engine.registers.f2;
let mut ipc_msg: Vec<u8> = alloc::vec![];
for x in message_start..message_start + message_length {
let byte = engine.read_mem_addr_8(x);
match byte {
Ok(byte) => ipc_msg.push(byte),
Err(_) => return Err(MemoryError),
}
}
log::trace!("Message bytes {:?}", ipc_msg);
Ok(())
}
// pub fn ipc_recv(_engine: &mut Engine) {}
/// Check f0 for the buffer type
/// 0 means an unbound buffer
/// 1 means a bound buffer
/// Check f1 if the buffer is bound
///
/// f2 Return a handle to the sender
/// f3 returns a handle the the reciever
pub fn ipc_mkbuf(engine: &mut Engine) {
match engine.registers.f0 as usize {
0 => {
trace!("Making a new ipc unbound buffer");
let _buf: SegQueue<Message> = SegQueue::new();
}
1 => {
let buf_len = engine.registers.f1 as usize;
trace!("Making a new ipc buffer with capacity {}", buf_len);
let _buf: ArrayQueue<Message> = ArrayQueue::new(buf_len);
}
_ => {}
}
}
// pub fn rpc_discover(_engine: &mut Engine) {}
// pub fn rpc_register(_engine: &mut Engine) {}
// pub fn rpc_call(_engine: &mut Engine) {}

View File

@ -3,7 +3,6 @@
use {
crate::{alloc::string::ToString, arch::logging::SERIAL_CONSOLE, device_tree::DeviceTree},
clparse::Arguments,
hbvm::engine::Engine,
log::{debug, trace},
spin::{Lazy, Mutex},
xml::XMLElement,
@ -42,12 +41,40 @@ pub fn kmain(cmdline: &str, bootstrap: Option<&'static [u8]>) -> ! {
// TODO: schedule the disk driver from the initramfs
// TODO: schedule the filesystem driver from the initramfs
// TODO: schedule the init system from the initramfs
let code = "li r1, 8
li r2, 10
add r1, r1, r2
let bytes = alloc::vec![0];
let mut prog = Engine::new(bytes);
// prog.enviroment_call_table[0] = read_device_tree;
let _ = prog.run();
prog.dump();
ecall"
.to_string();
let mut prog = alloc::vec![];
// TODO: Port hbasm to be fully nostd
if let Err(e) = hbasm::assembly(&code, &mut prog) {
log::error!(
"Error {:?} at {:?} (`{}`)",
e.kind,
e.span.clone(),
&code[e.span],
);
}
use hbvm::validate::validate;
#[allow(clippy::redundant_else)]
if let Err(e) = validate(&prog) {
log::error!("Program validation error: {e:?}");
} else {
log::info!("valid program");
unsafe {
use {crate::host::TrapHandler, hbvm::vm::Vm};
let mut vm = Vm::new_unchecked(&prog, TrapHandler);
vm.memory.insert_test_page();
log::info!("Program interrupt: {:?}", vm.run());
log::info!("{:?}", vm.registers);
}
}
// TODO: change this to a driver
{

View File

@ -23,7 +23,7 @@ mod allocator;
mod arch;
pub mod device_tree;
pub mod handle;
pub mod host_functions;
pub mod host;
pub mod ipc;
mod kmain;
mod logger;