Get env printf basic example working

This commit is contained in:
Syrus Akbary
2018-10-29 12:29:44 +01:00
parent c97312345e
commit 33b8757e90
3 changed files with 73 additions and 20 deletions

View File

@ -1,14 +1,21 @@
use crate::webassembly::{ImportObject, VmCtx};
use libc::putchar;
use libc::{printf, putchar};
use std::io;
use std::io::Write;
fn printf(format: i32, values: i32, context: &VmCtx) -> i32 {
println!("PRINTF {:?} {:?}", format, values);
return 0;
extern "C" fn _printf(memory_offset: i32, extra: i32, vm_context: &mut VmCtx) -> i32 {
// println!("PRINTF");
let mem = &vm_context.user_data.instance.memories[0];
// let x = mem.carve_slice(memory_offset as u32, 16).unwrap();
return unsafe {
let base_memory_offset = mem.mmap.as_ptr().offset(memory_offset as isize) as *const i8;
printf(base_memory_offset, extra)
};
}
pub fn generate_libc_env<'a, 'b>() -> ImportObject<&'a str, &'b str> {
let mut import_object = ImportObject::new();
import_object.set("env", "printf", printf as *const u8);
import_object.set("env", "printf", _printf as *const u8);
import_object.set("env", "putchar", putchar as *const u8);
import_object
}
@ -37,19 +44,19 @@ mod tests {
main(&context);
}
// #[test]
// fn test_printf() {
// let wasm_bytes = include_wast2wasm_bytes!("tests/printf.wast");
// let import_object = generate_libc_env();
// let result_object = instantiate(wasm_bytes, import_object).expect("Not compiled properly");
// let module = result_object.module;
// let mut instance = result_object.instance;
// let func_index = match module.info.exports.get("main") {
// Some(&Export::Function(index)) => index,
// _ => panic!("Function not found"),
// };
// let main: fn(&VmCtx) = get_instance_function!(instance, func_index);
// let context = instance.generate_context();
// main(&context);
// }
#[test]
fn test_print() {
let wasm_bytes = include_wast2wasm_bytes!("tests/printf.wast");
let import_object = generate_libc_env();
let result_object = instantiate(wasm_bytes, import_object).expect("Not compiled properly");
let module = result_object.module;
let mut instance = result_object.instance;
let func_index = match module.info.exports.get("main") {
Some(&Export::Function(index)) => index,
_ => panic!("Function not found"),
};
let main: fn(&VmCtx) = get_instance_function!(instance, func_index);
let context = instance.generate_context();
main(&context);
}
}

View File

@ -0,0 +1,19 @@
(module
(type $FUNCSIG$ii (func (param i32) (result i32)))
(type $FUNCSIG$iii (func (param i32 i32) (result i32)))
(import "env" "printf" (func $printf (param i32 i32) (result i32)))
(table 0 anyfunc)
(memory $0 1)
(data (i32.const 16) "Hello World\00")
(export "memory" (memory $0))
(export "main" (func $main))
(func $main (; 1 ;) (result i32)
(drop
(call $printf
(i32.const 16)
(i32.const 0)
)
)
(i32.const 0)
)
)

View File

@ -116,6 +116,18 @@ impl LinearMemory {
Some(prev_pages as i32)
}
pub fn carve_slice(&self, offset: u32, size: u32) -> Option<&[u8]> {
let start = offset as usize;
let end = start + size as usize;
let slice: &[u8] = &*self;
// if end <= self.mapped_size() {
Some(&slice[start..end])
// } else {
// None
// }
}
}
impl fmt::Debug for LinearMemory {
@ -151,3 +163,18 @@ impl DerefMut for LinearMemory {
&mut *self.mmap
}
}
// impl Clone for LinearMemory {
// fn clone(&self) -> LinearMemory {
// let mut mmap = MmapMut::map_anon(self.maximum.unwrap_or(self.current) as usize).unwrap();
// let mut base_mmap = &self.mmap;
// let to_init = &mut mmap[0..self.current as usize];
// to_init.copy_from_slice(&self.mmap);
// return LinearMemory {
// mmap: mmap,
// current: self.current,
// maximum: self.maximum,
// };
// }
// }