@@ -17,7 +17,7 @@ limitations under the License.
1717use alloc:: string:: ToString ;
1818use alloc:: vec:: Vec ;
1919use alloc:: { format, vec} ;
20- use core:: ops:: Deref ;
20+ use core:: ops:: { Deref , DerefMut } ;
2121
2222use hyperlight_common:: flatbuffer_wrappers:: function_call:: FunctionCall ;
2323use hyperlight_common:: flatbuffer_wrappers:: function_types:: {
@@ -34,57 +34,71 @@ use wasmtime::{Config, Engine, Linker, Module, Store, Val};
3434
3535use crate :: { hostfuncs, marshal, platform, wasip1} ;
3636
37+ // Set by transition to WasmSandbox (by init_wasm_runtime)
3738static CUR_ENGINE : Mutex < Option < Engine > > = Mutex :: new ( None ) ;
3839static CUR_LINKER : Mutex < Option < Linker < ( ) > > > = Mutex :: new ( None ) ;
40+ // Set by transition to LoadedWasmSandbox (by load_wasm_module/load_wasm_module_phys)
3941static CUR_MODULE : Mutex < Option < Module > > = Mutex :: new ( None ) ;
42+ static CUR_STORE : Mutex < Option < Store < ( ) > > > = Mutex :: new ( None ) ;
43+ static CUR_INSTANCE : Mutex < Option < wasmtime:: Instance > > = Mutex :: new ( None ) ;
4044
4145#[ no_mangle]
4246pub fn guest_dispatch_function ( function_call : & FunctionCall ) -> Result < Vec < u8 > > {
43- let engine = CUR_ENGINE . lock ( ) ;
44- let engine = engine . deref ( ) . as_ref ( ) . ok_or ( HyperlightGuestError :: new (
47+ let mut store = CUR_STORE . lock ( ) ;
48+ let store = store . deref_mut ( ) . as_mut ( ) . ok_or ( HyperlightGuestError :: new (
4549 ErrorCode :: GuestError ,
46- "Wasm runtime is not initialized " . to_string ( ) ,
50+ "No wasm store available " . to_string ( ) ,
4751 ) ) ?;
48- let linker = CUR_LINKER . lock ( ) ;
49- let linker = linker . deref ( ) . as_ref ( ) . ok_or ( HyperlightGuestError :: new (
52+ let instance = CUR_INSTANCE . lock ( ) ;
53+ let instance = instance . deref ( ) . as_ref ( ) . ok_or ( HyperlightGuestError :: new (
5054 ErrorCode :: GuestError ,
51- "impossible: wasm runtime has no valid linker " . to_string ( ) ,
55+ "No wasm instance available " . to_string ( ) ,
5256 ) ) ?;
53- let module = CUR_MODULE . lock ( ) ;
54- let module = module. deref ( ) . as_ref ( ) . ok_or ( HyperlightGuestError :: new (
55- ErrorCode :: GuestError ,
56- "No wasm module loaded" . to_string ( ) ,
57- ) ) ?;
58- let mut store = Store :: new ( engine, ( ) ) ;
59- let instance = linker. instantiate ( & mut store, module) ?;
57+
6058 let func = instance
61- . get_func ( & mut store, & function_call. function_name )
59+ . get_func ( & mut * store, & function_call. function_name )
6260 . ok_or ( HyperlightGuestError :: new (
6361 ErrorCode :: GuestError ,
6462 "Function not found" . to_string ( ) ,
6563 ) ) ?;
64+
6665 let mut w_params = vec ! [ ] ;
66+ let mut allocated_addrs = vec ! [ ] ;
6767 for f_param in ( function_call. parameters )
6868 . as_ref ( )
6969 . unwrap_or ( & vec ! [ ] )
7070 . iter ( )
7171 {
72- w_params. push ( marshal:: hl_param_to_val (
73- & mut store,
72+ w_params. push ( marshal:: hl_param_to_val_with_tracking (
73+ & mut * store,
7474 |ctx, name| instance. get_export ( ctx, name) ,
7575 f_param,
76+ & mut allocated_addrs,
7677 ) ?) ;
7778 }
7879 let is_void = ReturnType :: Void == function_call. expected_return_type ;
7980 let n_results = if is_void { 0 } else { 1 } ;
8081 let mut results = vec ! [ Val :: I32 ( 0 ) ; n_results] ;
81- func. call ( & mut store, & w_params, & mut results) ?;
82- marshal:: val_to_hl_result (
83- & mut store,
82+ func. call ( & mut * store, & w_params, & mut results) ?;
83+ let result = marshal:: val_to_hl_result (
84+ & mut * store,
8485 |ctx, name| instance. get_export ( ctx, name) ,
8586 function_call. expected_return_type ,
8687 & results,
88+ ) ;
89+
90+ marshal:: free_allocated_addrs (
91+ & mut * store,
92+ |ctx, name| instance. get_export ( ctx, name) ,
93+ & allocated_addrs,
8794 )
95+ . map_err ( |e| {
96+ HyperlightGuestError :: new (
97+ ErrorCode :: GuestError ,
98+ format ! ( "Failed to free memory allocated for params: {:?}" , e) ,
99+ )
100+ } ) ?;
101+ result
88102}
89103
90104fn init_wasm_runtime ( ) -> Result < Vec < u8 > > {
@@ -124,8 +138,19 @@ fn load_wasm_module(function_call: &FunctionCall) -> Result<Vec<u8>> {
124138 & function_call. parameters . as_ref ( ) . unwrap ( ) [ 1 ] ,
125139 & * CUR_ENGINE . lock ( ) ,
126140 ) {
141+ let linker = CUR_LINKER . lock ( ) ;
142+ let linker = linker. deref ( ) . as_ref ( ) . ok_or ( HyperlightGuestError :: new (
143+ ErrorCode :: GuestError ,
144+ "impossible: wasm runtime has no valid linker" . to_string ( ) ,
145+ ) ) ?;
146+
127147 let module = unsafe { Module :: deserialize ( engine, wasm_bytes) ? } ;
148+ let mut store = Store :: new ( engine, ( ) ) ;
149+ let instance = linker. instantiate ( & mut store, & module) ?;
150+
128151 * CUR_MODULE . lock ( ) = Some ( module) ;
152+ * CUR_STORE . lock ( ) = Some ( store) ;
153+ * CUR_INSTANCE . lock ( ) = Some ( instance) ;
129154 Ok ( get_flatbuffer_result :: < i32 > ( 0 ) )
130155 } else {
131156 Err ( HyperlightGuestError :: new (
@@ -141,8 +166,19 @@ fn load_wasm_module_phys(function_call: &FunctionCall) -> Result<Vec<u8>> {
141166 & function_call. parameters . as_ref ( ) . unwrap ( ) [ 1 ] ,
142167 & * CUR_ENGINE . lock ( ) ,
143168 ) {
169+ let linker = CUR_LINKER . lock ( ) ;
170+ let linker = linker. deref ( ) . as_ref ( ) . ok_or ( HyperlightGuestError :: new (
171+ ErrorCode :: GuestError ,
172+ "impossible: wasm runtime has no valid linker" . to_string ( ) ,
173+ ) ) ?;
174+
144175 let module = unsafe { Module :: deserialize_raw ( engine, platform:: map_buffer ( * phys, * len) ) ? } ;
176+ let mut store = Store :: new ( engine, ( ) ) ;
177+ let instance = linker. instantiate ( & mut store, & module) ?;
178+
145179 * CUR_MODULE . lock ( ) = Some ( module) ;
180+ * CUR_STORE . lock ( ) = Some ( store) ;
181+ * CUR_INSTANCE . lock ( ) = Some ( instance) ;
146182 Ok ( get_flatbuffer_result :: < ( ) > ( ( ) ) )
147183 } else {
148184 Err ( HyperlightGuestError :: new (
0 commit comments