forked from AbleOS/ableos
47 lines
1.3 KiB
Rust
47 lines
1.3 KiB
Rust
|
use alloc::vec::Vec;
|
||
|
use log::trace;
|
||
|
use wasmi::{Caller, Func, Linker, Module, Store};
|
||
|
|
||
|
pub fn wasm() -> Result<(), wasmi::Error> {
|
||
|
use wasmi::Config;
|
||
|
use wasmi::Engine;
|
||
|
trace!("");
|
||
|
let conf = Config::default();
|
||
|
let engine = Engine::new(&conf);
|
||
|
trace!("Engine constructed");
|
||
|
|
||
|
let wasm = include_bytes!("../../wasm_syscall_test.wasm");
|
||
|
|
||
|
trace!("Loading WASM binary");
|
||
|
let module = Module::new(&engine, &wasm[..]).unwrap();
|
||
|
trace!("Constructing wasm module");
|
||
|
|
||
|
let mut store = Store::new(&engine, 42);
|
||
|
trace!("constructing host store");
|
||
|
|
||
|
let read_mem_addr = Func::wrap(&mut store, |caller: Caller<'_, HostState>, param: u64| {
|
||
|
read_memory_address(caller, param);
|
||
|
|
||
|
panic!(":)")
|
||
|
});
|
||
|
|
||
|
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)?.start(&mut store)?;
|
||
|
trace!("Instanced the engine and module");
|
||
|
|
||
|
let hello = instance.get_typed_func::<(), ()>(&store, "_start")?;
|
||
|
|
||
|
hello.call(&mut store, ())?;
|
||
|
trace!("Called _start");
|
||
|
Ok(())
|
||
|
}
|
||
|
|
||
|
pub type HostState = u32;
|
||
|
pub fn read_memory_address(caller: Caller<'_, HostState>, address: u64) -> u64 {
|
||
|
trace!("Address: {}", address);
|
||
|
0
|
||
|
}
|