Skip to content

Commit 81e1a31

Browse files
committed
Added optional hook into exported memory size/grow functions
1 parent d86899e commit 81e1a31

1 file changed

Lines changed: 47 additions & 11 deletions

File tree

  • core/iwasm/libraries/libc-wali

core/iwasm/libraries/libc-wali/wali.c

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {
337370
long 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) {
579614
long 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

Comments
 (0)