2019-04-09 16:50:33 -07:00
|
|
|
use std::ptr::NonNull;
|
2019-10-30 13:01:31 +01:00
|
|
|
use wasmer_runtime_core::{
|
|
|
|
typed_func::Trampoline,
|
|
|
|
vm::{Ctx, Func},
|
|
|
|
};
|
2019-02-14 09:58:33 -08:00
|
|
|
|
|
|
|
type CallProtectedResult = Result<(), CallProtectedData>;
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct CallProtectedData {
|
|
|
|
pub code: u64,
|
2019-03-15 14:10:17 -07:00
|
|
|
pub exception_address: u64,
|
|
|
|
pub instruction_pointer: u64,
|
2019-02-14 09:58:33 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
#[link_name = "callProtected"]
|
|
|
|
pub fn __call_protected(
|
|
|
|
trampoline: Trampoline,
|
|
|
|
ctx: *mut Ctx,
|
2019-04-09 16:50:33 -07:00
|
|
|
func: NonNull<Func>,
|
2019-02-14 09:58:33 -08:00
|
|
|
param_vec: *const u64,
|
|
|
|
return_vec: *mut u64,
|
|
|
|
out_result: *mut CallProtectedData,
|
|
|
|
) -> u8;
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn _call_protected(
|
|
|
|
trampoline: Trampoline,
|
|
|
|
ctx: *mut Ctx,
|
2019-04-09 16:50:33 -07:00
|
|
|
func: NonNull<Func>,
|
2019-02-14 09:58:33 -08:00
|
|
|
param_vec: *const u64,
|
|
|
|
return_vec: *mut u64,
|
|
|
|
) -> CallProtectedResult {
|
|
|
|
let mut out_result = CallProtectedData {
|
|
|
|
code: 0,
|
2019-03-15 14:10:17 -07:00
|
|
|
exception_address: 0,
|
|
|
|
instruction_pointer: 0,
|
2019-02-14 09:58:33 -08:00
|
|
|
};
|
|
|
|
let result = unsafe {
|
|
|
|
__call_protected(
|
|
|
|
trampoline,
|
|
|
|
ctx,
|
|
|
|
func,
|
|
|
|
param_vec,
|
|
|
|
return_vec,
|
|
|
|
&mut out_result,
|
|
|
|
)
|
|
|
|
};
|
|
|
|
if result == 1 {
|
|
|
|
Ok(())
|
|
|
|
} else {
|
|
|
|
Err(out_result)
|
|
|
|
}
|
|
|
|
}
|