diff --git a/core/iwasm/common/wasm_shared_memory.h b/core/iwasm/common/wasm_shared_memory.h index 8b8af3efa..e1c5154a5 100644 --- a/core/iwasm/common/wasm_shared_memory.h +++ b/core/iwasm/common/wasm_shared_memory.h @@ -56,54 +56,6 @@ uint32 wasm_runtime_atomic_notify(WASMModuleInstanceCommon *module, void *address, uint32 count); -#if WASM_ENABLE_MULTI_MEMORY != 0 -/* Only enable shared heap for the default memory */ -#define is_default_memory (memidx == 0) -#else -#define is_default_memory true -#endif -#if WASM_ENABLE_MEMORY64 != 0 -#define get_shared_heap_start_off(shared_heap) \ - (is_memory64 ? shared_heap->start_off_mem64 : shared_heap->start_off_mem32) -#else -#define get_shared_heap_start_off(shared_heap) (shared_heap->start_off_mem32) -#endif -/* Check whether the app addr in the last visited shared heap, if not, check the - * shared heap chain to find which(if any) shared heap the app addr in, and - * update the last visited shared heap info if found. */ -#define app_addr_in_shared_heap(app_addr, bytes) \ - (shared_heap && is_default_memory && (app_addr) >= shared_heap_start_off \ - && (app_addr) <= shared_heap_end_off - bytes + 1) \ - || ({ \ - bool in_chain = false; \ - WASMSharedHeap *cur; \ - uint64 cur_shared_heap_start_off, cur_shared_heap_end_off; \ - for (cur = shared_heap; cur; cur = cur->chain_next) { \ - cur_shared_heap_start_off = get_shared_heap_start_off(cur); \ - cur_shared_heap_end_off = \ - cur_shared_heap_start_off - 1 + cur->size; \ - if ((app_addr) >= cur_shared_heap_start_off \ - && (app_addr) <= cur_shared_heap_end_off - bytes + 1) { \ - shared_heap_start_off = cur_shared_heap_start_off; \ - shared_heap_end_off = cur_shared_heap_end_off; \ - shared_heap_base_addr = cur->base_addr; \ - in_chain = true; \ - break; \ - } \ - } \ - in_chain; \ - }) - -#define shared_heap_addr_app_to_native(app_addr, native_addr) \ - native_addr = shared_heap_base_addr + ((app_addr)-shared_heap_start_off) - -#define CHECK_SHARED_HEAP_OVERFLOW(app_addr, bytes, native_addr) \ - if (app_addr_in_shared_heap(app_addr, bytes)) \ - shared_heap_addr_app_to_native(app_addr, native_addr); \ - else -#else -#define CHECK_SHARED_HEAP_OVERFLOW(app_addr, bytes, native_addr) - #ifdef __cplusplus } #endif diff --git a/core/iwasm/interpreter/wasm_loader.h b/core/iwasm/interpreter/wasm_loader.h index 676770ee2..9171d71d3 100644 --- a/core/iwasm/interpreter/wasm_loader.h +++ b/core/iwasm/interpreter/wasm_loader.h @@ -73,6 +73,56 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache, uint8 block_type, uint8 **p_else_addr, uint8 **p_end_addr); +#if WASM_ENABLE_SHARED_HEAP != 0 +#if WASM_ENABLE_MULTI_MEMORY != 0 +/* Only enable shared heap for the default memory */ +#define is_default_memory (memidx == 0) +#else +#define is_default_memory true +#endif +#if WASM_ENABLE_MEMORY64 != 0 +#define get_shared_heap_start_off(shared_heap) \ + (is_memory64 ? shared_heap->start_off_mem64 : shared_heap->start_off_mem32) +#else +#define get_shared_heap_start_off(shared_heap) (shared_heap->start_off_mem32) +#endif +/* Check whether the app addr in the last visited shared heap, if not, check the + * shared heap chain to find which(if any) shared heap the app addr in, and + * update the last visited shared heap info if found. */ +#define app_addr_in_shared_heap(app_addr, bytes) \ + (shared_heap && is_default_memory && (app_addr) >= shared_heap_start_off \ + && (app_addr) <= shared_heap_end_off - bytes + 1) \ + || ({ \ + bool in_chain = false; \ + WASMSharedHeap *cur; \ + uint64 cur_shared_heap_start_off, cur_shared_heap_end_off; \ + for (cur = shared_heap; cur; cur = cur->chain_next) { \ + cur_shared_heap_start_off = get_shared_heap_start_off(cur); \ + cur_shared_heap_end_off = \ + cur_shared_heap_start_off - 1 + cur->size; \ + if ((app_addr) >= cur_shared_heap_start_off \ + && (app_addr) <= cur_shared_heap_end_off - bytes + 1) { \ + shared_heap_start_off = cur_shared_heap_start_off; \ + shared_heap_end_off = cur_shared_heap_end_off; \ + shared_heap_base_addr = cur->base_addr; \ + in_chain = true; \ + break; \ + } \ + } \ + in_chain; \ + }) + +#define shared_heap_addr_app_to_native(app_addr, native_addr) \ + native_addr = shared_heap_base_addr + ((app_addr)-shared_heap_start_off) + +#define CHECK_SHARED_HEAP_OVERFLOW(app_addr, bytes, native_addr) \ + if (app_addr_in_shared_heap(app_addr, bytes)) \ + shared_heap_addr_app_to_native(app_addr, native_addr); \ + else +#else +#define CHECK_SHARED_HEAP_OVERFLOW(app_addr, bytes, native_addr) +#endif /* end of WASM_ENABLE_SHARED_HEAP != 0 */ + #ifdef __cplusplus } #endif