wasmer_vm/trap/
mod.rs

1// This file contains code from external sources.
2// Attributions: https://github.com/wasmerio/wasmer/blob/main/docs/ATTRIBUTIONS.md
3
4//! This is the module that facilitates the usage of Traps
5//! in Wasmer Runtime
6
7use crate::vmcontext::{VMFunctionContext, VMTrampoline};
8use crate::{VMContext, VMFunctionBody};
9
10#[allow(clippy::module_inception)]
11mod trap;
12#[cfg(not(feature = "baremetal"))]
13mod traphandlers;
14#[cfg(feature = "baremetal")]
15#[path = "traphandlers_baremetal.rs"]
16mod traphandlers;
17
18pub use trap::{Trap, UnwindReason};
19#[cfg(feature = "baremetal")]
20pub use traphandlers::install_unwinder;
21pub use traphandlers::{
22    MAX_STACK_SIZE, TrapHandlerFn, VMConfig, catch_traps, drain_stack_pool, get_stack_size,
23    on_host_stack, raise_lib_trap, raise_user_trap, set_stack_size,
24};
25pub use traphandlers::{init_traps, resume_panic};
26pub use wasmer_types::TrapCode;
27
28/// Call a Wasm trampoline.
29///
30/// # Safety
31///
32/// All pointer arguments must be valid for the duration of the call.
33pub unsafe fn wasmer_call_trampoline(
34    trap_handler: Option<*const TrapHandlerFn<'static>>,
35    config: &VMConfig,
36    vmctx: VMFunctionContext,
37    trampoline: VMTrampoline,
38    callee: *const VMFunctionBody,
39    values_vec: *mut u8,
40) -> Result<(), Trap> {
41    unsafe {
42        catch_traps(trap_handler, config, move || {
43            // pointer types are ABI-compatible; transmute to unsafe fn to preserve unsafety
44            std::mem::transmute::<
45                unsafe extern "C" fn(
46                    *mut VMContext,
47                    *const VMFunctionBody,
48                    *mut wasmer_types::RawValue,
49                ),
50                unsafe extern "C" fn(VMFunctionContext, *const VMFunctionBody, *mut u8),
51            >(trampoline)(vmctx, callee, values_vec);
52        })
53    }
54}