|
|
|
|
@ -165,7 +165,7 @@ runtime_malloc(uint64 size)
|
|
|
|
|
WASMSharedHeap *
|
|
|
|
|
wasm_runtime_create_shared_heap(SharedHeapInitArgs *init_args)
|
|
|
|
|
{
|
|
|
|
|
uint64 heap_struct_size = sizeof(WASMSharedHeap);
|
|
|
|
|
uint64 heap_struct_size = sizeof(WASMSharedHeap), map_size;
|
|
|
|
|
uint32 size = init_args->size;
|
|
|
|
|
WASMSharedHeap *heap;
|
|
|
|
|
|
|
|
|
|
@ -192,7 +192,18 @@ wasm_runtime_create_shared_heap(SharedHeapInitArgs *init_args)
|
|
|
|
|
goto fail3;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!(heap->base_addr = wasm_mmap_linear_memory(size, size))) {
|
|
|
|
|
#ifndef OS_ENABLE_HW_BOUND_CHECK
|
|
|
|
|
map_size = size;
|
|
|
|
|
#else
|
|
|
|
|
/* Totally 8G is mapped, the opcode load/store address range is 0 to 8G:
|
|
|
|
|
* ea = i + memarg.offset
|
|
|
|
|
* both i and memarg.offset are u32 in range 0 to 4G
|
|
|
|
|
* so the range of ea is 0 to 8G
|
|
|
|
|
*/
|
|
|
|
|
map_size = 8 * (uint64)BH_GB;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (!(heap->base_addr = wasm_mmap_linear_memory(map_size, size))) {
|
|
|
|
|
goto fail3;
|
|
|
|
|
}
|
|
|
|
|
if (!mem_allocator_create_with_struct_and_pool(
|
|
|
|
|
@ -213,7 +224,7 @@ wasm_runtime_create_shared_heap(SharedHeapInitArgs *init_args)
|
|
|
|
|
return heap;
|
|
|
|
|
|
|
|
|
|
fail4:
|
|
|
|
|
wasm_munmap_linear_memory(heap->base_addr, size, size);
|
|
|
|
|
wasm_munmap_linear_memory(heap->base_addr, size, map_size);
|
|
|
|
|
fail3:
|
|
|
|
|
wasm_runtime_free(heap->heap_handle);
|
|
|
|
|
fail2:
|
|
|
|
|
@ -245,18 +256,52 @@ wasm_runtime_attach_shared_heap_internal(WASMModuleInstanceCommon *module_inst,
|
|
|
|
|
|
|
|
|
|
#if WASM_ENABLE_INTERP != 0
|
|
|
|
|
if (module_inst->module_type == Wasm_Module_Bytecode) {
|
|
|
|
|
if (((WASMModuleInstance *)module_inst)->e->shared_heap) {
|
|
|
|
|
WASMModuleInstanceExtra *e =
|
|
|
|
|
(WASMModuleInstanceExtra *)((WASMModuleInstance *)module_inst)->e;
|
|
|
|
|
if (e->shared_heap) {
|
|
|
|
|
LOG_WARNING("A shared heap is already attached");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
((WASMModuleInstance *)module_inst)->e->shared_heap = shared_heap;
|
|
|
|
|
}
|
|
|
|
|
e->shared_heap = shared_heap;
|
|
|
|
|
#if WASM_ENABLE_JIT != 0
|
|
|
|
|
#if UINTPTR_MAX == UINT64_MAX
|
|
|
|
|
if (memory->is_memory64)
|
|
|
|
|
e->shared_heap_start_off.u64 = shared_heap->start_off_mem64;
|
|
|
|
|
else
|
|
|
|
|
e->shared_heap_start_off.u64 = shared_heap->start_off_mem32;
|
|
|
|
|
e->shared_heap_base_addr_adj =
|
|
|
|
|
shared_heap->base_addr - e->shared_heap_start_off.u64;
|
|
|
|
|
#else
|
|
|
|
|
e->shared_heap_start_off.u32[0] = (uint32)shared_heap->start_off_mem32;
|
|
|
|
|
e->shared_heap_base_addr_adj =
|
|
|
|
|
shared_heap->base_addr - e->shared_heap_start_off.u32[0];
|
|
|
|
|
#endif
|
|
|
|
|
#endif /* end of WASM_ENABLE_JIT != 0 */
|
|
|
|
|
}
|
|
|
|
|
#endif /* end of WASM_ENABLE_INTERP != 0 */
|
|
|
|
|
#if WASM_ENABLE_AOT != 0
|
|
|
|
|
if (module_inst->module_type == Wasm_Module_AoT) {
|
|
|
|
|
// TODO
|
|
|
|
|
}
|
|
|
|
|
AOTModuleInstanceExtra *e =
|
|
|
|
|
(AOTModuleInstanceExtra *)((AOTModuleInstance *)module_inst)->e;
|
|
|
|
|
if (e->shared_heap) {
|
|
|
|
|
LOG_WARNING("A shared heap is already attached");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
e->shared_heap = shared_heap;
|
|
|
|
|
#if UINTPTR_MAX == UINT64_MAX
|
|
|
|
|
if (memory->is_memory64)
|
|
|
|
|
e->shared_heap_start_off.u64 = shared_heap->start_off_mem64;
|
|
|
|
|
else
|
|
|
|
|
e->shared_heap_start_off.u64 = shared_heap->start_off_mem32;
|
|
|
|
|
e->shared_heap_base_addr_adj =
|
|
|
|
|
shared_heap->base_addr - e->shared_heap_start_off.u64;
|
|
|
|
|
#else
|
|
|
|
|
e->shared_heap_start_off.u32[0] = (uint32)shared_heap->start_off_mem32;
|
|
|
|
|
e->shared_heap_base_addr_adj =
|
|
|
|
|
shared_heap->base_addr - e->shared_heap_start_off.u32[0];
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
#endif /* end of WASM_ENABLE_AOT != 0 */
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
@ -277,14 +322,32 @@ wasm_runtime_detach_shared_heap_internal(WASMModuleInstanceCommon *module_inst)
|
|
|
|
|
{
|
|
|
|
|
#if WASM_ENABLE_INTERP != 0
|
|
|
|
|
if (module_inst->module_type == Wasm_Module_Bytecode) {
|
|
|
|
|
((WASMModuleInstance *)module_inst)->e->shared_heap = NULL;
|
|
|
|
|
}
|
|
|
|
|
WASMModuleInstanceExtra *e =
|
|
|
|
|
(WASMModuleInstanceExtra *)((WASMModuleInstance *)module_inst)->e;
|
|
|
|
|
e->shared_heap = NULL;
|
|
|
|
|
#if WASM_ENABLE_JIT != 0
|
|
|
|
|
#if UINTPTR_MAX == UINT64_MAX
|
|
|
|
|
e->shared_heap_start_off.u64 = UINT64_MAX;
|
|
|
|
|
#else
|
|
|
|
|
e->shared_heap_start_off.u32[0] = UINT32_MAX;
|
|
|
|
|
#endif
|
|
|
|
|
e->shared_heap_base_addr_adj = NULL;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
#endif /* end of WASM_ENABLE_INTERP != 0 */
|
|
|
|
|
#if WASM_ENABLE_AOT != 0
|
|
|
|
|
if (module_inst->module_type == Wasm_Module_AoT) {
|
|
|
|
|
// TODO
|
|
|
|
|
}
|
|
|
|
|
AOTModuleInstanceExtra *e =
|
|
|
|
|
(AOTModuleInstanceExtra *)((AOTModuleInstance *)module_inst)->e;
|
|
|
|
|
e->shared_heap = NULL;
|
|
|
|
|
#if UINTPTR_MAX == UINT64_MAX
|
|
|
|
|
e->shared_heap_start_off.u64 = UINT64_MAX;
|
|
|
|
|
#else
|
|
|
|
|
e->shared_heap_start_off.u32[0] = UINT32_MAX;
|
|
|
|
|
#endif
|
|
|
|
|
e->shared_heap_base_addr_adj = NULL;
|
|
|
|
|
}
|
|
|
|
|
#endif /* end of WASM_ENABLE_AOT != 0 */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
@ -307,13 +370,21 @@ get_shared_heap(WASMModuleInstanceCommon *module_inst_comm)
|
|
|
|
|
#endif
|
|
|
|
|
#if WASM_ENABLE_AOT != 0
|
|
|
|
|
if (module_inst_comm->module_type == Wasm_Module_AoT) {
|
|
|
|
|
// TODO
|
|
|
|
|
return NULL;
|
|
|
|
|
AOTModuleInstanceExtra *e =
|
|
|
|
|
(AOTModuleInstanceExtra *)((AOTModuleInstance *)module_inst_comm)
|
|
|
|
|
->e;
|
|
|
|
|
return e->shared_heap;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WASMSharedHeap *
|
|
|
|
|
wasm_runtime_get_shared_heap(WASMModuleInstanceCommon *module_inst_comm)
|
|
|
|
|
{
|
|
|
|
|
return get_shared_heap(module_inst_comm);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool
|
|
|
|
|
is_app_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst,
|
|
|
|
|
bool is_memory64, uint64 app_offset, uint32 bytes)
|
|
|
|
|
@ -324,6 +395,10 @@ is_app_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst,
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (bytes == 0) {
|
|
|
|
|
bytes = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!is_memory64) {
|
|
|
|
|
if (app_offset >= heap->start_off_mem32
|
|
|
|
|
&& app_offset <= UINT32_MAX - bytes + 1) {
|
|
|
|
|
@ -457,17 +532,23 @@ wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type,
|
|
|
|
|
|
|
|
|
|
#if WASM_ENABLE_SHARED_HEAP != 0
|
|
|
|
|
static void
|
|
|
|
|
wasm_runtime_destroy_shared_heaps()
|
|
|
|
|
destroy_shared_heaps()
|
|
|
|
|
{
|
|
|
|
|
WASMSharedHeap *heap = shared_heap_list;
|
|
|
|
|
WASMSharedHeap *cur;
|
|
|
|
|
uint64 map_size;
|
|
|
|
|
|
|
|
|
|
while (heap) {
|
|
|
|
|
cur = heap;
|
|
|
|
|
heap = heap->next;
|
|
|
|
|
mem_allocator_destroy(cur->heap_handle);
|
|
|
|
|
wasm_runtime_free(cur->heap_handle);
|
|
|
|
|
wasm_munmap_linear_memory(cur->base_addr, cur->size, cur->size);
|
|
|
|
|
#ifndef OS_ENABLE_HW_BOUND_CHECK
|
|
|
|
|
map_size = cur->size;
|
|
|
|
|
#else
|
|
|
|
|
map_size = 8 * (uint64)BH_GB;
|
|
|
|
|
#endif
|
|
|
|
|
wasm_munmap_linear_memory(cur->base_addr, cur->size, map_size);
|
|
|
|
|
wasm_runtime_free(cur);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -477,7 +558,7 @@ void
|
|
|
|
|
wasm_runtime_memory_destroy(void)
|
|
|
|
|
{
|
|
|
|
|
#if WASM_ENABLE_SHARED_HEAP != 0
|
|
|
|
|
wasm_runtime_destroy_shared_heaps();
|
|
|
|
|
destroy_shared_heaps();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (memory_mode == MEMORY_MODE_POOL) {
|
|
|
|
|
@ -1178,7 +1259,7 @@ wasm_mremap_linear_memory(void *mapped_mem, uint64 old_size, uint64 new_size,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void *
|
|
|
|
|
wasm_mmap_linear_memory(uint64_t map_size, uint64 commit_size)
|
|
|
|
|
wasm_mmap_linear_memory(uint64 map_size, uint64 commit_size)
|
|
|
|
|
{
|
|
|
|
|
return wasm_mremap_linear_memory(NULL, 0, map_size, commit_size);
|
|
|
|
|
}
|
|
|
|
|
|