parent
2098f86910
commit
318b6da0d1
@ -1,2 +1,5 @@
|
||||
resolver = "2"
|
||||
|
||||
|
||||
[workspace]
|
||||
members = ["kernel", "repbuild"]
|
||||
|
@ -0,0 +1,36 @@
|
||||
(module
|
||||
(data "mouse")
|
||||
(data "x")
|
||||
(data "y")
|
||||
(func $rma (import "host" "read_mem_addr")(param i32)(result i32))
|
||||
(func $co (import "host" "create_object")(param i32 i32)(result i64))
|
||||
(func $roa (import "host" "read_object_attribute")(param i64 i32 i32)(result i32 i32))
|
||||
(memory (export "memory") 1)
|
||||
|
||||
(func
|
||||
(export "start")(result i32)
|
||||
;; Copy into memory the object name
|
||||
(memory.init 0
|
||||
(i32.const 0) ;; target offset
|
||||
(i32.const 0) ;; source offset
|
||||
(i32.const 5))
|
||||
(memory.init 1
|
||||
(i32.const 6) ;; target offset
|
||||
(i32.const 0) ;; source offset
|
||||
(i32.const 1))
|
||||
(memory.init 2
|
||||
(i32.const 7) ;; target offset
|
||||
(i32.const 0) ;; source offset
|
||||
(i32.const 1))
|
||||
|
||||
i32.const 0
|
||||
i32.const 5
|
||||
call $co
|
||||
|
||||
i32.const 6
|
||||
i32.const 1
|
||||
|
||||
call $roa
|
||||
|
||||
)
|
||||
)
|
@ -0,0 +1,46 @@
|
||||
use core::fmt::{self, Formatter};
|
||||
|
||||
use crate::arch::hardware_random_u64;
|
||||
|
||||
#[derive(Debug, Eq, Hash, PartialEq)]
|
||||
pub struct Handle {
|
||||
pub handle_data: i64,
|
||||
perms: Permissions,
|
||||
}
|
||||
|
||||
impl Handle {
|
||||
pub fn new() -> Handle {
|
||||
Handle {
|
||||
handle_data: hardware_random_u64() as i64,
|
||||
perms: Permissions::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for Handle {
|
||||
fn fmt(&self, w: &mut Formatter<'_>) -> Result<(), core::fmt::Error> {
|
||||
write!(w, "{}", self.handle_data);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl Into<i64> for Handle {
|
||||
fn into(self) -> i64 {
|
||||
self.handle_data
|
||||
// (abc[0..3] as i64, abc[4..8] as i64)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Hash, Eq, Debug)]
|
||||
pub struct Permissions {
|
||||
edit_children: bool,
|
||||
edit_attributes: bool,
|
||||
}
|
||||
impl Permissions {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
edit_children: true,
|
||||
edit_attributes: true,
|
||||
}
|
||||
}
|
||||
}
|
@ -1,46 +1,139 @@
|
||||
use alloc::vec::Vec;
|
||||
use alloc::{string::String, vec::Vec};
|
||||
use core::fmt::Debug;
|
||||
use core::fmt::Display;
|
||||
use log::trace;
|
||||
use wasmi::{Caller, Func, Linker, Module, Store};
|
||||
use xml::XMLElement;
|
||||
|
||||
use crate::handle::{self, Handle};
|
||||
|
||||
pub fn wasm() -> Result<(), wasmi::Error> {
|
||||
use wasmi::Config;
|
||||
use wasmi::Engine;
|
||||
trace!("");
|
||||
let conf = Config::default();
|
||||
let mut conf = Config::default();
|
||||
conf.wasm_bulk_memory(true);
|
||||
// conf.,
|
||||
let engine = Engine::new(&conf);
|
||||
trace!("Engine constructed");
|
||||
// trace!("Engine constructed");
|
||||
|
||||
let wasm = include_bytes!("../../wasm_syscall_test.wasm");
|
||||
// let wasm = include_bytes!("../../wasm_syscall_test.wasm");
|
||||
let wasm = include_bytes!("../../test.wasm");
|
||||
|
||||
trace!("Loading WASM binary");
|
||||
// trace!("Loading WASM binary");
|
||||
let module = Module::new(&engine, &wasm[..]).unwrap();
|
||||
trace!("Constructing wasm module");
|
||||
// trace!("Constructing wasm module");
|
||||
let hs = HostState {
|
||||
proc_handle: crate::handle::Handle::new(),
|
||||
};
|
||||
let mut store = Store::new(&engine, hs);
|
||||
// trace!("constructing host store");
|
||||
|
||||
let read_mem_addr = Func::wrap(
|
||||
&mut store,
|
||||
|caller: Caller<'_, HostState>, param: i32| -> i32 { read_memory_address(caller, param) },
|
||||
);
|
||||
|
||||
let mut store = Store::new(&engine, 42);
|
||||
trace!("constructing host store");
|
||||
let mut linker = <Linker<HostState>>::new(&engine);
|
||||
linker.define(
|
||||
"host",
|
||||
"read_mem_addr",
|
||||
Func::wrap(
|
||||
&mut store,
|
||||
|caller: Caller<'_, HostState>, param: i32| -> i32 {
|
||||
read_memory_address(caller, param)
|
||||
},
|
||||
),
|
||||
)?;
|
||||
|
||||
let read_mem_addr = Func::wrap(&mut store, |caller: Caller<'_, HostState>, param: u64| {
|
||||
read_memory_address(caller, param);
|
||||
linker.define(
|
||||
"host",
|
||||
"read_object_attribute",
|
||||
Func::wrap(&mut store, host_read_object_attribute),
|
||||
)?;
|
||||
|
||||
panic!(":)")
|
||||
});
|
||||
linker.define(
|
||||
"host",
|
||||
"create_object",
|
||||
Func::wrap(&mut store, host_make_object),
|
||||
)?;
|
||||
|
||||
let mut linker = <Linker<HostState>>::new(&engine);
|
||||
linker.define("host", "read_mem_addr", read_mem_addr)?;
|
||||
trace!("Linked read_mem_addr");
|
||||
let instance = linker
|
||||
.instantiate(&mut store, &module)?
|
||||
.ensure_no_start(&mut store)?;
|
||||
|
||||
let instance = linker.instantiate(&mut store, &module)?.start(&mut store)?;
|
||||
trace!("Instanced the engine and module");
|
||||
let version = instance.get_global(&store, "VERSION");
|
||||
|
||||
let hello = instance.get_typed_func::<(), ()>(&store, "_start")?;
|
||||
// trace!("Version: {:?}", version);
|
||||
let hello = instance.get_typed_func::<(), (i32, i32)>(&store, "start")?;
|
||||
|
||||
let ret = hello.call(&mut store, ())?;
|
||||
trace!("Called _start got return of {:?}", ret);
|
||||
|
||||
hello.call(&mut store, ())?;
|
||||
trace!("Called _start");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub type HostState = u32;
|
||||
pub fn read_memory_address(caller: Caller<'_, HostState>, address: u64) -> u64 {
|
||||
pub struct HostState {
|
||||
/// In ableOS a handle is an unsigned 128 bit number
|
||||
proc_handle: Handle,
|
||||
}
|
||||
|
||||
pub fn read_memory_address(caller: Caller<'_, HostState>, address: i32) -> i32 {
|
||||
trace!("Proccess Handle: {:?}", caller.data().proc_handle);
|
||||
trace!("Address: {}", address);
|
||||
// let obj = host_make_object(caller, 16, 23);
|
||||
0
|
||||
}
|
||||
use crate::kmain::OBJECTS;
|
||||
pub fn host_make_object(
|
||||
caller: Caller<'_, HostState>,
|
||||
address_start: i32,
|
||||
length_of_string: i32,
|
||||
) -> i64 {
|
||||
trace!(
|
||||
"Called with addr {{ start {} length {} }}",
|
||||
address_start,
|
||||
length_of_string
|
||||
);
|
||||
let mem = caller.get_export("memory").unwrap().into_memory().unwrap();
|
||||
let mem_array = mem.data(&caller);
|
||||
let mut name = String::new();
|
||||
for i in address_start..(address_start + length_of_string) {
|
||||
let ch = mem_array[i as usize] as char;
|
||||
name.push(ch);
|
||||
}
|
||||
trace!("Object Name {}", name);
|
||||
let hand = handle::Handle::new();
|
||||
{
|
||||
let binding = OBJECTS;
|
||||
let mut olock = binding.lock();
|
||||
let obj = XMLElement::new(name);
|
||||
|
||||
olock.insert(handle::Handle::new(), obj);
|
||||
}
|
||||
|
||||
hand.into()
|
||||
}
|
||||
|
||||
pub fn host_read_object_attribute(
|
||||
caller: Caller<'_, HostState>,
|
||||
handle: i64,
|
||||
address_start: i32,
|
||||
length_of_string: i32,
|
||||
) -> (i32, i32) {
|
||||
{
|
||||
let binding = OBJECTS;
|
||||
let mut olock = binding.lock();
|
||||
|
||||
// olock.get(&handle);
|
||||
}
|
||||
|
||||
let mem = caller.get_export("memory").unwrap().into_memory().unwrap();
|
||||
let mem_array = mem.data(&caller);
|
||||
let mut name = String::new();
|
||||
for i in address_start..(address_start + length_of_string) {
|
||||
let ch = mem_array[i as usize] as char;
|
||||
name.push(ch);
|
||||
}
|
||||
|
||||
(0, 0)
|
||||
}
|
||||
|
@ -0,0 +1,24 @@
|
||||
|
||||
|
||||
|
||||
`create_object`
|
||||
```
|
||||
params
|
||||
i32
|
||||
start address of the string to use as the object name
|
||||
i32
|
||||
length of string
|
||||
returns
|
||||
i64 Handle to the object
|
||||
```
|
||||
|
||||
`read_object_attribute`
|
||||
```
|
||||
params
|
||||
i64 Handle to the object
|
||||
i32
|
||||
start address of the string to use as the attribute name
|
||||
i32
|
||||
end address of the string to use as the attribute name
|
||||
returns
|
||||
```
|
Binary file not shown.
Loading…
Reference in new issue