Fix windows AOT hw bound check (#2475)
When AOT out of bound linear memory access or stack overflow occurs, the call stack of AOT functions cannot be unwound currently, so from the exception handler, runtime cannot jump back into the place that calls the AOT function. We temporarily skip the current instruction and let AOT code continue to run and return to caller as soon as possible. And use the zydis library the decode the current instruction to get its size. And remove using RtlAddFunctionTable to register the AOT functions since it doesn't work currently.
This commit is contained in:
@ -1644,27 +1644,6 @@ load_function_section(const uint8 *buf, const uint8 *buf_end, AOTModule *module,
|
||||
const uint8 *p = buf, *p_end = buf_end;
|
||||
uint32 i;
|
||||
uint64 size, text_offset;
|
||||
#if defined(OS_ENABLE_HW_BOUND_CHECK) && defined(BH_PLATFORM_WINDOWS)
|
||||
RUNTIME_FUNCTION *rtl_func_table;
|
||||
AOTUnwindInfo *unwind_info;
|
||||
uint32 unwind_info_offset = module->code_size - sizeof(AOTUnwindInfo);
|
||||
uint32 unwind_code_offset = unwind_info_offset - PLT_ITEM_SIZE;
|
||||
#endif
|
||||
|
||||
#if defined(OS_ENABLE_HW_BOUND_CHECK) && defined(BH_PLATFORM_WINDOWS)
|
||||
unwind_info = (AOTUnwindInfo *)((uint8 *)module->code + module->code_size
|
||||
- sizeof(AOTUnwindInfo));
|
||||
unwind_info->Version = 1;
|
||||
unwind_info->Flags = UNW_FLAG_NHANDLER;
|
||||
*(uint32 *)&unwind_info->UnwindCode[0] = unwind_code_offset;
|
||||
|
||||
size = sizeof(RUNTIME_FUNCTION) * (uint64)module->func_count;
|
||||
if (size > 0
|
||||
&& !(rtl_func_table = module->rtl_func_table =
|
||||
loader_malloc(size, error_buf, error_buf_size))) {
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
size = sizeof(void *) * (uint64)module->func_count;
|
||||
if (size > 0
|
||||
@ -1691,33 +1670,9 @@ load_function_section(const uint8 *buf, const uint8 *buf_end, AOTModule *module,
|
||||
#if defined(BUILD_TARGET_THUMB) || defined(BUILD_TARGET_THUMB_VFP)
|
||||
/* bits[0] of thumb function address must be 1 */
|
||||
module->func_ptrs[i] = (void *)((uintptr_t)module->func_ptrs[i] | 1);
|
||||
#endif
|
||||
#if defined(OS_ENABLE_HW_BOUND_CHECK) && defined(BH_PLATFORM_WINDOWS)
|
||||
rtl_func_table[i].BeginAddress = (DWORD)text_offset;
|
||||
if (i > 0) {
|
||||
rtl_func_table[i - 1].EndAddress = rtl_func_table[i].BeginAddress;
|
||||
}
|
||||
rtl_func_table[i].UnwindInfoAddress = (DWORD)unwind_info_offset;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(OS_ENABLE_HW_BOUND_CHECK) && defined(BH_PLATFORM_WINDOWS)
|
||||
if (module->func_count > 0) {
|
||||
uint32 plt_table_size =
|
||||
module->is_indirect_mode ? 0 : get_plt_table_size();
|
||||
rtl_func_table[module->func_count - 1].EndAddress =
|
||||
(DWORD)(module->code_size - plt_table_size);
|
||||
|
||||
if (!RtlAddFunctionTable(rtl_func_table, module->func_count,
|
||||
(DWORD64)(uintptr_t)module->code)) {
|
||||
set_error_buf(error_buf, error_buf_size,
|
||||
"add dynamic function table failed");
|
||||
return false;
|
||||
}
|
||||
module->rtl_func_table_registered = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Set start function when function pointers are resolved */
|
||||
if (module->start_func_index != (uint32)-1) {
|
||||
if (module->start_func_index >= module->import_func_count)
|
||||
@ -3261,14 +3216,6 @@ aot_unload(AOTModule *module)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(OS_ENABLE_HW_BOUND_CHECK) && defined(BH_PLATFORM_WINDOWS)
|
||||
if (module->rtl_func_table) {
|
||||
if (module->rtl_func_table_registered)
|
||||
RtlDeleteFunctionTable(module->rtl_func_table);
|
||||
wasm_runtime_free(module->rtl_func_table);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64)) \
|
||||
&& !defined(BH_PLATFORM_WINDOWS)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user