@@ -163,6 +163,39 @@ void wali_init_native(wasm_module_inst_t module_inst) {
163163}
164164
165165
166+ /** Helper methods **/
167+ static uint32_t get_current_memory_size (wasm_exec_env_t exec_env ) {
168+ wasm_module_inst_t module_inst = get_module_inst (exec_env );
169+ wasm_function_inst_t memorysize_fn = wasm_runtime_lookup_function (module_inst , "wasm_memory_size" , "()i" );
170+ uint32_t cur_wasm_pages [1 ];
171+ uint32_t mem_size = 0 ;
172+ if (memorysize_fn && wasm_runtime_call_wasm (exec_env , memorysize_fn , 0 , cur_wasm_pages )) {
173+ // Success
174+ VB ("Used \'wasm_memory_size\' export for size query" );
175+ mem_size = cur_wasm_pages [0 ] * WASM_PAGESIZE ;
176+ } else {
177+ // Failure: Fallback to internal implementation
178+ mem_size = wasm_runtime_get_memory_size (get_module_inst (exec_env ));
179+ }
180+ return mem_size ;
181+ }
182+
183+ /* Not currently used since WAMR internal API for memory.grow performs
184+ * additional OS protection when growing memory which may interfere with
185+ * any mmap specifications */
186+ static void grow_memory_size (wasm_exec_env_t exec_env , uint32_t inc_wasm_pages ) {
187+ wasm_module_inst_t module_inst = get_module_inst (exec_env );
188+ wasm_function_inst_t memorygrow_fn = wasm_runtime_lookup_function (module_inst , "wasm_memory_grow" , "(i)i" );
189+ uint32_t prev_wasm_pages [1 ] = { inc_wasm_pages };
190+ if (memorygrow_fn && wasm_runtime_call_wasm (exec_env , memorygrow_fn , 1 , prev_wasm_pages )) {
191+ // Success
192+ VB ("Used \'wasm_memory_grow\' export for grow query" );
193+ } else {
194+ // Failure: Fallback to internal implementation
195+ wasm_enlarge_memory ((WASMModuleInstance * )module_inst , inc_wasm_pages , true);
196+ }
197+ }
198+
166199
167200/* Get page aligned address after memory to mmap; since base is mapped it's already aligned,
168201* and memory data size is a multiple of 64kB but rounding added for safety */
@@ -337,23 +370,25 @@ long wali_syscall_lseek (wasm_exec_env_t exec_env, long a1, long a2, long a3) {
337370long wali_syscall_mmap (wasm_exec_env_t exec_env , long a1 , long a2 , long a3 , long a4 , long a5 , long a6 ) {
338371 SC (9 ,mmap );
339372 VB ("mmap args | a1: %ld, a2: 0x%x, a3: %ld, a4: %ld, a5: %ld, a6: %ld | MMAP_PAGELEN: %d" , a1 , a2 , a3 , a4 , a5 , a6 , MMAP_PAGELEN );
373+ wasm_module_inst_t module_inst = get_module_inst (exec_env );
374+
340375 pthread_mutex_lock (& mmap_lock );
341376 Addr base_addr = BASE_ADDR ();
342377 Addr pa_aligned_addr = PA_ALIGN_MMAP_ADDR ();
343378 Addr mmap_addr = pa_aligned_addr + MMAP_PAGELEN * NATIVE_PAGESIZE ;
344379
345- uint32 mem_size = wasm_runtime_get_memory_size (get_module_inst (exec_env ));
380+ /* Get current memory size */
381+ uint32_t mem_size = get_current_memory_size (exec_env );
346382 VB ("Mem Base: %p | Mem End: %p | Mem Size: 0x%x | Mmap Addr: %p" , base_addr , base_addr + mem_size , mem_size , mmap_addr );
347383
348- wasm_module_inst_t module = get_module_inst ( exec_env );
384+ /* Check if wasm memory needs to be expanded and it is safe */
349385 int inc_wasm_pages = 0 ;
350386 int num_pages = ((a2 + NATIVE_PAGESIZE - 1 ) / NATIVE_PAGESIZE );
351387 int extended_mmap_pagelen = MMAP_PAGELEN + num_pages ;
352- /* Check if wasm memory needs to be expanded and it is safe */
353388 if (extended_mmap_pagelen > WASM_PAGELEN * WASM_TO_NATIVE_PAGE ) {
354389 int new_wasm_pagelen = ((extended_mmap_pagelen + WASM_TO_NATIVE_PAGE - 1 ) / WASM_TO_NATIVE_PAGE );
355390 inc_wasm_pages = new_wasm_pagelen - WASM_PAGELEN ;
356- if (!wasm_can_enlarge_memory ((WASMModuleInstance * )module , inc_wasm_pages )) {
391+ if (!wasm_can_enlarge_memory ((WASMModuleInstance * )module_inst , inc_wasm_pages )) {
357392 FATALSC (mmap , "Out of memory!\n" );
358393 goto mmap_fail ;
359394 }
@@ -365,12 +400,12 @@ long wali_syscall_mmap (wasm_exec_env_t exec_env, long a1, long a2, long a3, lon
365400 FATALSC (mmap , "Failed to mmap!\n" );
366401 goto mmap_fail ;
367402 }
368- /* On success */
403+ /* On successful mmap */
369404 else {
370405 MMAP_PAGELEN += num_pages ;
371406 /* Expand wasm memory if needed */
372407 if (inc_wasm_pages ) {
373- wasm_enlarge_memory ((WASMModuleInstance * )module , inc_wasm_pages , true);
408+ wasm_enlarge_memory ((WASMModuleInstance * )module_inst , inc_wasm_pages , true);
374409 WASM_PAGELEN += inc_wasm_pages ;
375410 }
376411 }
@@ -579,24 +614,25 @@ long wali_syscall_sched_yield (wasm_exec_env_t exec_env) {
579614long wali_syscall_mremap (wasm_exec_env_t exec_env , long a1 , long a2 , long a3 , long a4 , long a5 ) {
580615 SC (25 ,mremap );
581616 VB ("mremap args | a1: %ld, a2: 0x%x, a3: 0x%x, a4: %ld, a5: %ld | MMAP_PAGELEN: %d" , a1 , a2 , a3 , a4 , a5 , MMAP_PAGELEN );
617+ wasm_module_inst_t module_inst = get_module_inst (exec_env );
618+
582619 /* Remap pages to the end of the wasm memory, like mmap */
583620 pthread_mutex_lock (& mmap_lock );
584621 Addr base_addr = BASE_ADDR ();
585622 Addr pa_aligned_addr = PA_ALIGN_MMAP_ADDR ();
586623 Addr mmap_addr = pa_aligned_addr + MMAP_PAGELEN * NATIVE_PAGESIZE ;
587624
588- uint32 mem_size = wasm_runtime_get_memory_size ( get_module_inst ( exec_env ));
625+ uint32 mem_size = get_current_memory_size ( exec_env );
589626 VB ("Mem Base: %p | Mem End: %p | Mem Size: 0x%x | Mmap Addr: %p" , base_addr , base_addr + mem_size , mem_size , mmap_addr );
590627
591- wasm_module_inst_t module = get_module_inst ( exec_env );
628+ /* Check if wasm memory needs to be expanded and it is safe */
592629 int inc_wasm_pages = 0 ;
593630 int num_pages = ((a3 + NATIVE_PAGESIZE - 1 ) / NATIVE_PAGESIZE );
594631 int extended_mmap_pagelen = MMAP_PAGELEN + num_pages ;
595- /* Check if wasm memory needs to be expanded and it is safe */
596632 if (extended_mmap_pagelen > WASM_PAGELEN * WASM_TO_NATIVE_PAGE ) {
597633 int new_wasm_pagelen = ((extended_mmap_pagelen + WASM_TO_NATIVE_PAGE - 1 ) / WASM_TO_NATIVE_PAGE );
598634 inc_wasm_pages = new_wasm_pagelen - WASM_PAGELEN ;
599- if (!wasm_can_enlarge_memory ((WASMModuleInstance * )module , inc_wasm_pages )) {
635+ if (!wasm_can_enlarge_memory ((WASMModuleInstance * )module_inst , inc_wasm_pages )) {
600636 FATALSC (mremap , "Out of memory!\n" );
601637 goto mremap_fail ;
602638 }
@@ -614,7 +650,7 @@ long wali_syscall_mremap (wasm_exec_env_t exec_env, long a1, long a2, long a3, l
614650 MMAP_PAGELEN += num_pages ;
615651 /* Expand wasm memory if needed */
616652 if (inc_wasm_pages ) {
617- wasm_enlarge_memory ((WASMModuleInstance * )module , inc_wasm_pages , true);
653+ wasm_enlarge_memory ((WASMModuleInstance * )module_inst , inc_wasm_pages , true);
618654 WASM_PAGELEN += inc_wasm_pages ;
619655 }
620656 }
0 commit comments