From 4535274cf36022b992dd67b3fd49913219463825 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Mon, 22 Jul 2019 11:23:41 -0700 Subject: [PATCH] Update the loader interface for 128 bit types. --- lib/kernel-loader/src/lib.rs | 6 +++--- lib/kernel-loader/src/service.rs | 12 ++++++------ lib/runtime-core/src/loader.rs | 16 ++++++++-------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/kernel-loader/src/lib.rs b/lib/kernel-loader/src/lib.rs index 8abc850af..51ca6c7da 100644 --- a/lib/kernel-loader/src/lib.rs +++ b/lib/kernel-loader/src/lib.rs @@ -75,7 +75,7 @@ impl Loader for KernelLoader { if module.imported_globals.len() > 0 { return Err("imported globals are not supported".into()); } - let globals: Vec = unsafe { + let globals: Vec = unsafe { let globals: &[*mut LocalGlobal] = ::std::slice::from_raw_parts(ctx.globals, module.globals.len()); globals.iter().map(|x| (**x).data).collect() @@ -138,11 +138,11 @@ pub struct KernelInstance { impl Instance for KernelInstance { type Error = String; - fn call(&mut self, id: usize, args: &[Value]) -> Result { + fn call(&mut self, id: usize, args: &[Value]) -> Result { if args.len() != self.param_counts[id] { return Err("param count mismatch".into()); } - let args: Vec = args.iter().map(|x| x.to_u64()).collect(); + let args: Vec = args.iter().map(|x| x.to_u128()).collect(); let ret = self .context diff --git a/lib/kernel-loader/src/service.rs b/lib/kernel-loader/src/service.rs index 45ccdd869..2477cc30f 100644 --- a/lib/kernel-loader/src/service.rs +++ b/lib/kernel-loader/src/service.rs @@ -54,7 +54,7 @@ struct LoadCodeRequest { memory_max: u32, table: *const TableEntryRequest, table_count: u32, - globals: *const u64, + globals: *const u128, global_count: u32, imported_funcs: *const ImportRequest, @@ -67,7 +67,7 @@ struct LoadCodeRequest { #[repr(C)] struct RunCodeRequest { entry_offset: u32, - params: *const u64, + params: *const u128, param_count: u32, result: *mut RunCodeResult, } @@ -75,7 +75,7 @@ struct RunCodeRequest { #[repr(C)] struct RunCodeResult { success: u32, - retval: u64, + retval: u128, } #[repr(C)] @@ -108,7 +108,7 @@ pub struct LoadProfile<'a> { pub code: &'a [u8], pub memory: Option<&'a [u8]>, pub memory_max: usize, - pub globals: &'a [u64], + pub globals: &'a [u128], pub imports: &'a [ImportInfo], pub dynamic_sigindices: &'a [u32], pub table: Option<&'a [TableEntryRequest]>, @@ -121,7 +121,7 @@ pub struct ImportInfo { pub struct RunProfile<'a> { pub entry_offset: u32, - pub params: &'a [u64], + pub params: &'a [u128], } pub struct ServiceContext { @@ -181,7 +181,7 @@ impl ServiceContext { } } - pub fn run_code(&mut self, run: RunProfile) -> ServiceResult { + pub fn run_code(&mut self, run: RunProfile) -> ServiceResult { let mut result: RunCodeResult = unsafe { ::std::mem::zeroed() }; let mut req = RunCodeRequest { entry_offset: run.entry_offset, diff --git a/lib/runtime-core/src/loader.rs b/lib/runtime-core/src/loader.rs index b02e9e859..44be58ce9 100644 --- a/lib/runtime-core/src/loader.rs +++ b/lib/runtime-core/src/loader.rs @@ -20,7 +20,7 @@ pub trait Loader { pub trait Instance { type Error: Debug; - fn call(&mut self, id: usize, args: &[Value]) -> Result; + fn call(&mut self, id: usize, args: &[Value]) -> Result; fn read_memory(&mut self, _offset: u32, _len: u32) -> Result, Self::Error> { unimplemented!() } @@ -61,7 +61,7 @@ pub struct LocalInstance { impl Instance for LocalInstance { type Error = String; - fn call(&mut self, id: usize, args: &[Value]) -> Result { + fn call(&mut self, id: usize, args: &[Value]) -> Result { let mut args_u64: Vec = Vec::new(); for arg in args { if arg.ty() == Type::V128 { @@ -81,23 +81,23 @@ impl Instance for LocalInstance { use std::mem::transmute; Ok(unsafe { match args_u64.len() { - 0 => (transmute::<_, extern "C" fn() -> u64>(addr))(), - 1 => (transmute::<_, extern "C" fn(u64) -> u64>(addr))(args_u64[0]), + 0 => (transmute::<_, extern "C" fn() -> u128>(addr))(), + 1 => (transmute::<_, extern "C" fn(u64) -> u128>(addr))(args_u64[0]), 2 => { - (transmute::<_, extern "C" fn(u64, u64) -> u64>(addr))(args_u64[0], args_u64[1]) + (transmute::<_, extern "C" fn(u64, u64) -> u128>(addr))(args_u64[0], args_u64[1]) } - 3 => (transmute::<_, extern "C" fn(u64, u64, u64) -> u64>(addr))( + 3 => (transmute::<_, extern "C" fn(u64, u64, u64) -> u128>(addr))( args_u64[0], args_u64[1], args_u64[2], ), - 4 => (transmute::<_, extern "C" fn(u64, u64, u64, u64) -> u64>(addr))( + 4 => (transmute::<_, extern "C" fn(u64, u64, u64, u64) -> u128>(addr))( args_u64[0], args_u64[1], args_u64[2], args_u64[3], ), - 5 => (transmute::<_, extern "C" fn(u64, u64, u64, u64, u64) -> u64>(addr))( + 5 => (transmute::<_, extern "C" fn(u64, u64, u64, u64, u64) -> u128>(addr))( args_u64[0], args_u64[1], args_u64[2],