From 2a8b1ef4544e23dd183c4a032b7bc5121c5ec210 Mon Sep 17 00:00:00 2001 From: Weining <50284696+Weining2019@users.noreply.github.com> Date: Fri, 11 Oct 2019 15:25:23 +0800 Subject: [PATCH] Remove the binding between current thread and module instance and bugs fix (#131) Remove wasm_export_api.h that may confuse Implement wasm_runtime_validate_app_str_addr() Fix bugs of loader and pass more spec cases Signed-off-by: Weining Lu --- core/app-mgr/app-manager/app_manager.c | 6 +- core/app-mgr/app-manager/app_manager.h | 2 +- core/app-mgr/app-manager/module_utils.c | 24 +-- core/app-mgr/app-manager/module_wasm_app.c | 36 ++-- core/app-mgr/app-manager/module_wasm_lib.c | 3 +- .../app-mgr-shared/app_manager_export.h | 12 +- .../lib/app-libs/extension/gui/src/wgl_btn.c | 1 + .../lib/app-libs/extension/gui/src/wgl_cb.c | 1 + .../app-libs/extension/gui/src/wgl_label.c | 1 + .../lib/app-libs/extension/gui/src/wgl_list.c | 5 +- .../lib/native-interface/native_interface.h | 3 + .../lib/native-interface/wasm_export_api.h | 162 ------------------ core/iwasm/lib/native/base/base_lib_export.c | 126 -------------- core/iwasm/lib/native/base/request_response.c | 13 +- core/iwasm/lib/native/base/timer_wrapper.c | 13 +- .../extension/connection/connection_lib.h | 4 +- .../extension/connection/connection_wrapper.c | 4 +- .../connection/linux/connection_mgr.c | 9 +- .../native/extension/gui/wgl_btn_wrapper.c | 118 +++++++++++-- .../lib/native/extension/gui/wgl_cb_wrapper.c | 37 +++- .../native/extension/gui/wgl_label_wrapper.c | 27 ++- .../native/extension/gui/wgl_list_wrapper.c | 17 +- .../native/extension/gui/wgl_native_utils.c | 50 +++--- .../native/extension/gui/wgl_native_utils.h | 3 +- .../native/extension/gui/wgl_obj_wrapper.c | 43 ++++- .../native/extension/sensor/runtime_sensor.c | 11 +- core/iwasm/lib/native/libc/libc_wrapper.c | 44 ++--- core/iwasm/runtime/include/wasm_export.h | 51 +++--- .../vmcore-wasm/invokeNative_general.c | 9 +- core/iwasm/runtime/vmcore-wasm/wasm_interp.c | 5 +- core/iwasm/runtime/vmcore-wasm/wasm_interp.h | 4 +- core/iwasm/runtime/vmcore-wasm/wasm_loader.c | 85 ++++++--- core/iwasm/runtime/vmcore-wasm/wasm_runtime.c | 62 +++---- core/iwasm/runtime/vmcore-wasm/wasm_runtime.h | 38 +++- core/shared-lib/include/bh_queue.h | 10 +- core/shared-lib/utils/bh_queue.c | 5 +- samples/littlevgl/README.md | 4 +- 37 files changed, 496 insertions(+), 552 deletions(-) delete mode 100644 core/iwasm/lib/native-interface/wasm_export_api.h diff --git a/core/app-mgr/app-manager/app_manager.c b/core/app-mgr/app-manager/app_manager.c index 6aca1659..b349191f 100644 --- a/core/app-mgr/app-manager/app_manager.c +++ b/core/app-mgr/app-manager/app_manager.c @@ -246,11 +246,13 @@ static int get_module_type(char *kv_str) /* Queue callback of App Manager */ -static void app_manager_queue_callback(void *message) +static void app_manager_queue_callback(void *message, void *arg) { request_t *request = (request_t *) bh_message_payload((bh_message_t)message); int mid = request->mid, module_type, offset; + (void)arg; + if ((offset = check_url_start(request->url, strlen(request->url), "/applet")) > 0) { module_type = get_module_type(request->url + offset); @@ -376,7 +378,7 @@ void app_manager_startup(host_interface *interface) app_manager_printf("App Manager started.\n"); /* Enter loop run */ - bh_queue_enter_loop_run(g_app_mgr_queue, app_manager_queue_callback); + bh_queue_enter_loop_run(g_app_mgr_queue, app_manager_queue_callback, NULL); fail2: module_data_list_destroy(); diff --git a/core/app-mgr/app-manager/app_manager.h b/core/app-mgr/app-manager/app_manager.h index 0fe86802..8021e30d 100644 --- a/core/app-mgr/app-manager/app_manager.h +++ b/core/app-mgr/app-manager/app_manager.h @@ -65,7 +65,7 @@ void module_data_list_destroy(); bool -app_manager_is_interrupting_module(uint32 module_type); +app_manager_is_interrupting_module(uint32 module_type, void *module_inst); void release_module(module_data *m_data); diff --git a/core/app-mgr/app-manager/module_utils.c b/core/app-mgr/app-manager/module_utils.c index 1f973176..36ad5426 100644 --- a/core/app-mgr/app-manager/module_utils.c +++ b/core/app-mgr/app-manager/module_utils.c @@ -130,35 +130,35 @@ module_data_list_lookup_id(unsigned int module_id) } module_data * -app_manager_get_module_data(uint32 module_type) +app_manager_get_module_data(uint32 module_type, void *module_inst) { if (g_module_interfaces[module_type] && g_module_interfaces[module_type]->module_get_module_data) - return g_module_interfaces[module_type]->module_get_module_data(); + return g_module_interfaces[module_type]->module_get_module_data(module_inst); return NULL; } void* -app_manager_get_module_queue(uint32 module_type) +app_manager_get_module_queue(uint32 module_type, void *module_inst) { - return app_manager_get_module_data(module_type)->queue; + return app_manager_get_module_data(module_type, module_inst)->queue; } const char* -app_manager_get_module_name(uint32 module_type) +app_manager_get_module_name(uint32 module_type, void *module_inst) { - return app_manager_get_module_data(module_type)->module_name; + return app_manager_get_module_data(module_type, module_inst)->module_name; } -unsigned int app_manager_get_module_id(uint32 module_type) +unsigned int app_manager_get_module_id(uint32 module_type, void *module_inst) { - return app_manager_get_module_data(module_type)->id; + return app_manager_get_module_data(module_type, module_inst)->id; } void* -app_manager_get_module_heap(uint32 module_type) +app_manager_get_module_heap(uint32 module_type, void *module_inst) { - return app_manager_get_module_data(module_type)->heap; + return app_manager_get_module_data(module_type, module_inst)->heap; } module_data* @@ -179,9 +179,9 @@ void app_manager_del_module_data(module_data *m_data) release_module(m_data); } -bool app_manager_is_interrupting_module(uint32 module_type) +bool app_manager_is_interrupting_module(uint32 module_type, void *module_inst) { - return app_manager_get_module_data(module_type)->wd_timer.is_interrupting; + return app_manager_get_module_data(module_type, module_inst)->wd_timer.is_interrupting; } extern void destroy_module_timer_ctx(unsigned int module_id); diff --git a/core/app-mgr/app-manager/module_wasm_app.c b/core/app-mgr/app-manager/module_wasm_app.c index 4154b33e..580e76fc 100644 --- a/core/app-mgr/app-manager/module_wasm_app.c +++ b/core/app-mgr/app-manager/module_wasm_app.c @@ -81,7 +81,7 @@ static bool wasm_app_module_install(request_t *msg); static bool wasm_app_module_uninstall(request_t *msg); static void wasm_app_module_watchdog_kill(module_data *module_data); static bool wasm_app_module_handle_host_url(void *queue_msg); -static module_data *wasm_app_module_get_module_data(void); +static module_data *wasm_app_module_get_module_data(void *inst); static bool wasm_app_module_on_install_request_byte_arrive(uint8 ch, int request_total_size, int *received_size); @@ -110,14 +110,13 @@ static unsigned align_uint(unsigned v, unsigned b) return (v + m) & ~m; } -static void app_instance_queue_callback(void *queue_msg) +static void app_instance_queue_callback(void *queue_msg, void *arg) { uint32 argv[2]; wasm_function_inst_t func_onRequest, func_onTimer; - module_data *m_data = app_manager_get_module_data(Module_WASM_App); - wasm_data *wasm_app_data = (wasm_data*) m_data->internal_data; - wasm_module_inst_t inst = wasm_app_data->wasm_module_inst; + wasm_module_inst_t inst = (wasm_module_inst_t)arg; + module_data *m_data = app_manager_get_module_data(Module_WASM_App, inst); int message_type = bh_message_type(queue_msg); switch (message_type) { @@ -262,17 +261,16 @@ wasm_app_routine(void *arg) wasm_module_inst_t inst = wasm_app_data->wasm_module_inst; korp_tid thread = wasm_app_data->thread_id; - /* attach newly created thread to the VM managed instance */ - if (!wasm_runtime_attach_current_thread(inst, m_data)) { - goto fail1; - } + /* Set m_data to the VM managed instance's custom data */ + wasm_runtime_set_custom_data(inst, m_data); + app_manager_printf("WASM app '%s' started\n", m_data->module_name); /* Call app's onInit() method */ func_onInit = wasm_runtime_lookup_function(inst, "_on_init", "()"); if (!func_onInit) { app_manager_printf("Cannot find function on_init().\n"); - goto fail2; + goto fail1; } if (!wasm_runtime_call_wasm(inst, NULL, func_onInit, 0, NULL)) { @@ -281,23 +279,21 @@ wasm_app_routine(void *arg) wasm_runtime_clear_exception(inst); /* call on_destroy() in case some resources are opened in on_init() * and then exception thrown */ - goto fail3; + goto fail2; } /* Enter queue loop run to receive and process applet queue message */ - bh_queue_enter_loop_run(m_data->queue, app_instance_queue_callback); + bh_queue_enter_loop_run(m_data->queue, app_instance_queue_callback, inst); app_manager_printf("App instance main thread exit.\n"); - fail3: +fail2: /* Call WASM app onDestroy() method if there is */ func_onDestroy = wasm_runtime_lookup_function(inst, "_on_destroy", "()"); if (func_onDestroy) wasm_runtime_call_wasm(inst, NULL, func_onDestroy, 0, NULL); - fail2: wasm_runtime_detach_current_thread(inst); - - fail1: +fail1: vm_thread_detach(thread); vm_thread_exit(NULL); @@ -548,8 +544,7 @@ static bool wasm_app_module_install(request_t * msg) goto fail; } - /* create a thread. This thread may not dedicate for this WASM app. - WASM app instance needs to attach to one thread */ + /* Create WASM app thread. */ if (vm_thread_create(&wasm_app_data->thread_id, wasm_app_routine, (void*) m_data, APP_THREAD_STACK_SIZE_DEFAULT) != 0) { module_data_list_remove(m_data); @@ -648,9 +643,10 @@ static bool wasm_app_module_handle_host_url(void *queue_msg) } static module_data* -wasm_app_module_get_module_data(void) +wasm_app_module_get_module_data(void *inst) { - return wasm_runtime_get_current_thread_data(); + wasm_module_inst_t module_inst = (wasm_module_inst_t)inst; + return (module_data *)wasm_runtime_get_custom_data(module_inst); } static void wasm_app_module_watchdog_kill(module_data *m_data) diff --git a/core/app-mgr/app-manager/module_wasm_lib.c b/core/app-mgr/app-manager/module_wasm_lib.c index e4fc2d5a..f69e7a4c 100644 --- a/core/app-mgr/app-manager/module_wasm_lib.c +++ b/core/app-mgr/app-manager/module_wasm_lib.c @@ -46,8 +46,9 @@ static bool wasm_lib_module_handle_host_url(void *queue_msg) } static module_data* -wasm_lib_module_get_module_data(void) +wasm_lib_module_get_module_data(void *inst) { + (void) inst; return NULL; } diff --git a/core/app-mgr/app-mgr-shared/app_manager_export.h b/core/app-mgr/app-mgr-shared/app_manager_export.h index 7686cc25..2a7ea21d 100644 --- a/core/app-mgr/app-mgr-shared/app_manager_export.h +++ b/core/app-mgr/app-mgr-shared/app_manager_export.h @@ -105,7 +105,7 @@ typedef bool (*module_install_func)(request_t *msg); typedef bool (*module_uninstall_func)(request_t *msg); typedef void (*module_watchdog_kill_func)(module_data *module_data); typedef bool (*module_handle_host_url_func)(void *queue_msg); -typedef module_data *(*module_get_module_data_func)(void); +typedef module_data *(*module_get_module_data_func)(void *inst); /** * @typedef module_on_install_request_byte_arrive_func @@ -194,24 +194,24 @@ app_manager_startup(host_interface *interface); /* Get queue of current applet */ void * -app_manager_get_module_queue(uint32 module_type); +app_manager_get_module_queue(uint32 module_type, void *module_inst); /* Get applet name of current applet */ const char * -app_manager_get_module_name(uint32 module_type); +app_manager_get_module_name(uint32 module_type, void *module_inst); /* Get heap of current applet */ void * -app_manager_get_module_heap(uint32 module_type); +app_manager_get_module_heap(uint32 module_type, void *module_inst); void* get_app_manager_queue(); module_data* -app_manager_get_module_data(uint32 module_type); +app_manager_get_module_data(uint32 module_type, void *module_inst); unsigned int -app_manager_get_module_id(uint32 module_type); +app_manager_get_module_id(uint32 module_type, void *module_inst); module_data* app_manager_lookup_module_data(const char *name); diff --git a/core/iwasm/lib/app-libs/extension/gui/src/wgl_btn.c b/core/iwasm/lib/app-libs/extension/gui/src/wgl_btn.c index 5623abe6..2124892e 100644 --- a/core/iwasm/lib/app-libs/extension/gui/src/wgl_btn.c +++ b/core/iwasm/lib/app-libs/extension/gui/src/wgl_btn.c @@ -24,6 +24,7 @@ wgl_obj_t wgl_btn_create(wgl_obj_t par, wgl_obj_t copy) { uint32 argv[2] = {0}; + argv[0] = (uint32)par; argv[1] = (uint32)copy; CALL_BTN_NATIVE_FUNC(BTN_FUNC_ID_CREATE); diff --git a/core/iwasm/lib/app-libs/extension/gui/src/wgl_cb.c b/core/iwasm/lib/app-libs/extension/gui/src/wgl_cb.c index cbfa11eb..d089b58a 100644 --- a/core/iwasm/lib/app-libs/extension/gui/src/wgl_cb.c +++ b/core/iwasm/lib/app-libs/extension/gui/src/wgl_cb.c @@ -25,6 +25,7 @@ wgl_obj_t wgl_cb_create(wgl_obj_t par, const wgl_obj_t copy) { uint32 argv[2] = {0}; + argv[0] = (uint32)par; argv[1] = (uint32)copy; CALL_CB_NATIVE_FUNC(CB_FUNC_ID_CREATE); diff --git a/core/iwasm/lib/app-libs/extension/gui/src/wgl_label.c b/core/iwasm/lib/app-libs/extension/gui/src/wgl_label.c index a602e2ae..cb45154e 100644 --- a/core/iwasm/lib/app-libs/extension/gui/src/wgl_label.c +++ b/core/iwasm/lib/app-libs/extension/gui/src/wgl_label.c @@ -26,6 +26,7 @@ wgl_obj_t wgl_label_create(wgl_obj_t par, wgl_obj_t copy) { uint32 argv[2] = {0}; + argv[0] = (uint32)par; argv[1] = (uint32)copy; CALL_LABEL_NATIVE_FUNC(LABEL_FUNC_ID_CREATE); diff --git a/core/iwasm/lib/app-libs/extension/gui/src/wgl_list.c b/core/iwasm/lib/app-libs/extension/gui/src/wgl_list.c index c815964d..4be3fe6f 100644 --- a/core/iwasm/lib/app-libs/extension/gui/src/wgl_list.c +++ b/core/iwasm/lib/app-libs/extension/gui/src/wgl_list.c @@ -26,8 +26,10 @@ wgl_obj_t wgl_list_create(wgl_obj_t par, const wgl_obj_t copy) { uint32 argv[2] = {0}; + argv[0] = (uint32)par; argv[1] = (uint32)copy; + CALL_LIST_NATIVE_FUNC(LIST_FUNC_ID_CREATE); return (wgl_obj_t)argv[0]; } @@ -41,9 +43,10 @@ wgl_obj_t wgl_list_create(wgl_obj_t par, const wgl_obj_t copy) wgl_obj_t wgl_list_add_btn(wgl_obj_t list, const void * img_src, const char * txt) { + uint32 argv[3] = {0}; + (void)img_src; /* doesn't support img src currently */ - uint32 argv[3] = {0}; argv[0] = (uint32)list; argv[1] = (uint32)txt; argv[2] = strlen(txt) + 1; diff --git a/core/iwasm/lib/native-interface/native_interface.h b/core/iwasm/lib/native-interface/native_interface.h index fd8be85b..74422616 100644 --- a/core/iwasm/lib/native-interface/native_interface.h +++ b/core/iwasm/lib/native-interface/native_interface.h @@ -25,6 +25,9 @@ #define validate_app_addr(offset, size) \ wasm_runtime_validate_app_addr(module_inst, offset, size) +#define validate_app_str_addr(offset) \ + wasm_runtime_validate_app_str_addr(module_inst, offset) + #define addr_app_to_native(offset) \ wasm_runtime_addr_app_to_native(module_inst, offset) diff --git a/core/iwasm/lib/native-interface/wasm_export_api.h b/core/iwasm/lib/native-interface/wasm_export_api.h deleted file mode 100644 index ebd67b5d..00000000 --- a/core/iwasm/lib/native-interface/wasm_export_api.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2019 Intel Corporation. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _WASM_EXPORT_API_H -#define _WASM_EXPORT_API_H - -#include -#include - -/** - * API exported to WASM application - */ - -#ifdef __cplusplus -extern "C" { -#endif - -void -wasm_runtime_get_current_module_inst1(uint64_t *p_module_inst); - -bool -wasm_runtime_validate_app_addr1(uint32_t module_inst_part0, - uint32_t module_inst_part1, - int32_t app_offset, uint32_t size); -bool -wasm_runtime_validate_native_addr1(uint32_t module_inst_part0, - uint32_t module_inst_part1, - uint32_t native_ptr_part0, - uint32_t native_ptr_part1, - uint32_t size); -bool -wasm_runtime_addr_app_to_native1(uint32_t module_inst_part0, - uint32_t module_inst_part1, - int32_t app_offset, - uint64_t *p_native_ptr); - -int32_t -wasm_runtime_addr_native_to_app1(uint32_t module_inst_part0, - uint32_t module_inst_part1, - uint32_t native_ptr_part0, - uint32_t native_ptr_part1); - -/** - * Get current WASM module instance of the current native thread - * - * @return current WASM module instance of the current native thread, 0 - * if not found - * Note: the return type is uint64_t but not pointer type, because that - * the we only supports WASM-32, in which the pointer type is - * compiled to WASM i32 type, but the pointer type in native can be - * 32-bit and 64-bit. And if the native pointer is 64-bit, data loss - * occurs after converting it to WASM i32 type. - */ -static inline uint64_t -wasm_runtime_get_current_module_inst() -{ - uint64_t module_inst; - wasm_runtime_get_current_module_inst1(&module_inst); - return module_inst; -} - -/** - * Validate the app address, check whether it belongs to WASM module - * instance's address space, or in its heap space or memory space. - * - * @param module_inst the WASM module instance - * @param app_offset the app address to validate, which is a relative address - * @param size the size bytes of the app address - * - * @return true if success, false otherwise. - */ -static inline bool -wasm_runtime_validate_app_addr(uint64_t module_inst, - int32_t app_offset, uint32_t size) -{ - union { uint64_t val; uint32_t parts[2]; } u; - u.val = module_inst; - return wasm_runtime_validate_app_addr1(u.parts[0], u.parts[1], - app_offset, size); -} - -/** - * Validate the native address, check whether it belongs to WASM module - * instance's address space, or in its heap space or memory space. - * - * @param module_inst the WASM module instance - * @param native_ptr the native address to validate, which is an absolute - * address - * @param size the size bytes of the app address - * - * @return true if success, false otherwise. - */ -static inline bool -wasm_runtime_validate_native_addr(uint64_t module_inst, - uint64_t native_ptr, uint32_t size) -{ - union { uint64_t val; uint32_t parts[2]; } u1, u2; - u1.val = module_inst; - u2.val = native_ptr; - return wasm_runtime_validate_native_addr1(u1.parts[0], u1.parts[1], - u2.parts[0], u2.parts[1], - size); -} - -/** - * Convert app address(relative address) to native address(absolute address) - * - * @param module_inst the WASM module instance - * @param app_offset the app adress - * - * @return the native address converted - */ -static inline uint64_t -wasm_runtime_addr_app_to_native(uint64_t module_inst, - int32_t app_offset) -{ - union { uint64_t val; uint32_t parts[2]; } u; - uint64_t native_ptr; - u.val = module_inst; - if (!wasm_runtime_addr_app_to_native1(u.parts[0], u.parts[1], - app_offset, &native_ptr)) - return 0; - return native_ptr; -} - -/** - * Convert native address(absolute address) to app address(relative address) - * - * @param module_inst the WASM module instance - * @param native_ptr the native address - * - * @return the app address converted - */ -static inline int32_t -wasm_runtime_addr_native_to_app(uint64_t module_inst, - uint64_t native_ptr) -{ - union { uint64_t val; uint32_t parts[2]; } u1, u2; - u1.val = module_inst; - u2.val = native_ptr; - return wasm_runtime_addr_native_to_app1(u1.parts[0], u1.parts[1], - u2.parts[0], u2.parts[1]); -} - -#ifdef __cplusplus -} -#endif - -#endif /* end of _WASM_EXPORT_API_H */ diff --git a/core/iwasm/lib/native/base/base_lib_export.c b/core/iwasm/lib/native/base/base_lib_export.c index eb90f94c..fb62e7be 100644 --- a/core/iwasm/lib/native/base/base_lib_export.c +++ b/core/iwasm/lib/native/base/base_lib_export.c @@ -18,132 +18,11 @@ #include #include #include "lib_export.h" -#include "bh_platform.h" -#include "wasm_export.h" #ifdef WASM_ENABLE_BASE_LIB #include "base_lib_export.h" #endif -static void -wasm_runtime_get_current_module_inst1(wasm_module_inst_t module_inst, - int32 inst_offset) -{ - uint64 *p_module_inst; - - if (!wasm_runtime_validate_app_addr(module_inst, inst_offset, 8)) - return; - - p_module_inst = - wasm_runtime_addr_app_to_native(module_inst, inst_offset); - *p_module_inst = (uint64)(uintptr_t)module_inst; -} - - -static bool -wasm_runtime_validate_app_addr1(wasm_module_inst_t module_inst, - uint32 inst_part0, uint32 inst_part1, - int32 app_offset, uint32 size) -{ - bool ret; - union { uint64 u64; uint32 parts[2]; } inst; - - inst.parts[0] = inst_part0; - inst.parts[1] = inst_part1; - - if (inst.u64 != (uint64)(uintptr_t)module_inst) { - bh_printf("Invalid module instance\n"); - return false; - } - - ret = wasm_runtime_validate_app_addr(module_inst, app_offset, size); - if (!ret) - wasm_runtime_clear_exception(module_inst); - return ret; -} - -static bool -wasm_runtime_validate_native_addr1(wasm_module_inst_t module_inst, - uint32 inst_part0, uint32 inst_part1, - uint32 native_ptr_part0, - uint32 native_ptr_part1, - uint32 size) -{ - bool ret; - union { uint64 u64; uint32 parts[2]; } inst; - union { uint64 u64; uint32 parts[2]; } native_ptr; - - inst.parts[0] = inst_part0; - inst.parts[1] = inst_part1; - - if (inst.u64 != (uint64)(uintptr_t)module_inst) { - printf("Invalid module instance\n"); - return false; - } - - native_ptr.parts[0] = native_ptr_part0; - native_ptr.parts[1] = native_ptr_part1; - ret = wasm_runtime_validate_native_addr(module_inst, - (void*)(uintptr_t)native_ptr.u64, - size); - if (!ret) - wasm_runtime_clear_exception(module_inst); - return ret; -} - -static bool -wasm_runtime_addr_app_to_native1(wasm_module_inst_t module_inst, - uint32 inst_part0, uint32 inst_part1, - int32 app_offset, - int32 native_ptr_offset) - -{ - union { uint64 u64; uint32 parts[2]; } inst; - uint64 *p_native_ptr; - - inst.parts[0] = inst_part0; - inst.parts[1] = inst_part1; - - if (inst.u64 != (uint64)(uintptr_t)module_inst) { - printf("Invalid module instance\n"); - return false; - } - - if (!wasm_runtime_validate_app_addr(module_inst, native_ptr_offset, 8)) { - wasm_runtime_clear_exception(module_inst); - return false; - } - - p_native_ptr = - wasm_runtime_addr_app_to_native(module_inst, native_ptr_offset); - *p_native_ptr = (uint64)(uintptr_t) - wasm_runtime_addr_app_to_native(module_inst, app_offset); - return true; -} - -static int32 -wasm_runtime_addr_native_to_app1(wasm_module_inst_t module_inst, - uint32 inst_part0, uint32 inst_part1, - uint32 native_ptr_part0, - uint32 native_ptr_part1) -{ - union { uint64 u64; uint32 parts[2]; } inst; - union { uint64 u64; uint32 parts[2]; } native_ptr; - - inst.parts[0] = inst_part0; - inst.parts[1] = inst_part1; - - if (inst.u64 != (uint64)(uintptr_t)module_inst) { - printf("Invalid module instance\n"); - return 0; - } - - native_ptr.parts[0] = native_ptr_part0; - native_ptr.parts[1] = native_ptr_part1; - return wasm_runtime_addr_native_to_app(module_inst, - (void*)(uintptr_t)native_ptr.u64); -} - static NativeSymbol extended_native_symbol_defs[] = { /* TODO: use macro EXPORT_WASM_API() or EXPORT_WASM_API2() to add functions to register. */ @@ -159,11 +38,6 @@ static NativeSymbol extended_native_symbol_defs[] = { EXPORT_WASM_API(wasm_timer_restart), EXPORT_WASM_API(wasm_get_sys_tick_ms), #endif - EXPORT_WASM_API(wasm_runtime_get_current_module_inst1), - EXPORT_WASM_API(wasm_runtime_validate_app_addr1), - EXPORT_WASM_API(wasm_runtime_validate_native_addr1), - EXPORT_WASM_API(wasm_runtime_addr_app_to_native1), - EXPORT_WASM_API(wasm_runtime_addr_native_to_app1), }; int get_base_lib_export_apis(NativeSymbol **p_base_lib_apis) diff --git a/core/iwasm/lib/native/base/request_response.c b/core/iwasm/lib/native/base/request_response.c index 6e6ab599..7efccb90 100644 --- a/core/iwasm/lib/native/base/request_response.c +++ b/core/iwasm/lib/native/base/request_response.c @@ -50,13 +50,14 @@ wasm_register_resource(wasm_module_inst_t module_inst, int32 url_offset) { char *url = NULL; - if (!validate_app_addr(url_offset, 1)) + if (!validate_app_str_addr(url_offset)) return; url = addr_app_to_native(url_offset); if (url != NULL) { - unsigned int mod_id = app_manager_get_module_id(Module_WASM_App); + unsigned int mod_id = app_manager_get_module_id(Module_WASM_App, + module_inst); am_register_resource(url, module_request_handler, mod_id); } } @@ -81,7 +82,8 @@ wasm_post_request(wasm_module_inst_t module_inst, // TODO: add permission check, ensure app can't do harm // set sender to help dispatch the response to the sender ap - unsigned int mod_id = app_manager_get_module_id(Module_WASM_App); + unsigned int mod_id = app_manager_get_module_id(Module_WASM_App, + module_inst); req->sender = mod_id; if (req->action == COAP_EVENT) { @@ -98,13 +100,14 @@ wasm_sub_event(wasm_module_inst_t module_inst, int32 url_offset) { char *url = NULL; - if (!validate_app_addr(url_offset, 1)) + if (!validate_app_str_addr(url_offset)) return; url = addr_app_to_native(url_offset); if (url != NULL) { - unsigned int mod_id = app_manager_get_module_id(Module_WASM_App); + unsigned int mod_id = app_manager_get_module_id(Module_WASM_App, + module_inst); am_register_event(url, mod_id); } diff --git a/core/iwasm/lib/native/base/timer_wrapper.c b/core/iwasm/lib/native/base/timer_wrapper.c index 16d87bd9..7c7e1e05 100644 --- a/core/iwasm/lib/native/base/timer_wrapper.c +++ b/core/iwasm/lib/native/base/timer_wrapper.c @@ -141,9 +141,10 @@ void destroy_module_timer_ctx(unsigned int module_id) vm_mutex_unlock(&g_timer_ctx_list_mutex); } -timer_ctx_t get_wasm_timer_ctx() +timer_ctx_t get_wasm_timer_ctx(wasm_module_inst_t module_inst) { - module_data * m = app_manager_get_module_data(Module_WASM_App); + module_data * m = app_manager_get_module_data(Module_WASM_App, + module_inst); if (m == NULL) return NULL; return m->timer_ctx; @@ -153,27 +154,27 @@ timer_id_t wasm_create_timer(wasm_module_inst_t module_inst, int interval, bool is_period, bool auto_start) { - return sys_create_timer(get_wasm_timer_ctx(), interval, is_period, + return sys_create_timer(get_wasm_timer_ctx(module_inst), interval, is_period, auto_start); } void wasm_timer_destroy(wasm_module_inst_t module_inst, timer_id_t timer_id) { - sys_timer_destroy(get_wasm_timer_ctx(), timer_id); + sys_timer_destroy(get_wasm_timer_ctx(module_inst), timer_id); } void wasm_timer_cancel(wasm_module_inst_t module_inst, timer_id_t timer_id) { - sys_timer_cancel(get_wasm_timer_ctx(), timer_id); + sys_timer_cancel(get_wasm_timer_ctx(module_inst), timer_id); } void wasm_timer_restart(wasm_module_inst_t module_inst, timer_id_t timer_id, int interval) { - sys_timer_restart(get_wasm_timer_ctx(), timer_id, interval); + sys_timer_restart(get_wasm_timer_ctx(module_inst), timer_id, interval); } extern uint32 get_sys_tick_ms(); diff --git a/core/iwasm/lib/native/extension/connection/connection_lib.h b/core/iwasm/lib/native/extension/connection/connection_lib.h index 49d2e397..15b6d035 100644 --- a/core/iwasm/lib/native/extension/connection/connection_lib.h +++ b/core/iwasm/lib/native/extension/connection/connection_lib.h @@ -18,6 +18,7 @@ #define CONNECTION_LIB_H_ #include "attr_container.h" +#include "wasm_export.h" #ifdef __cplusplus extern "C" { @@ -37,7 +38,8 @@ extern "C" { * * @return 0~0xFFFFFFFE means id of the connection, otherwise(-1) means fail */ -typedef uint32 (*connection_open_f)(const char *name, attr_container_t *args); +typedef uint32 (*connection_open_f)(wasm_module_inst_t module_inst, + const char *name, attr_container_t *args); /* * @brief Close a connection. diff --git a/core/iwasm/lib/native/extension/connection/connection_wrapper.c b/core/iwasm/lib/native/extension/connection/connection_wrapper.c index 1a163e42..d74d37ce 100644 --- a/core/iwasm/lib/native/extension/connection/connection_wrapper.c +++ b/core/iwasm/lib/native/extension/connection/connection_wrapper.c @@ -30,7 +30,7 @@ wasm_open_connection(wasm_module_inst_t module_inst, attr_container_t *args; char *name, *args_buf; - if (!validate_app_addr(name_offset, 1) || + if (!validate_app_str_addr(name_offset) || !validate_app_addr(args_offset, len) || !(name = addr_app_to_native(name_offset)) || !(args_buf = addr_app_to_native(args_offset))) @@ -39,7 +39,7 @@ wasm_open_connection(wasm_module_inst_t module_inst, args = (attr_container_t *)args_buf; if (connection_impl._open != NULL) - return connection_impl._open(name, args); + return connection_impl._open(module_inst, name, args); return -1; } diff --git a/core/iwasm/lib/native/extension/connection/linux/connection_mgr.c b/core/iwasm/lib/native/extension/connection/linux/connection_mgr.c index 27c18cd7..ad1f68c4 100644 --- a/core/iwasm/lib/native/extension/connection/linux/connection_mgr.c +++ b/core/iwasm/lib/native/extension/connection/linux/connection_mgr.c @@ -86,7 +86,8 @@ static struct epoll_event epoll_events[MAX_EVENTS]; /* Buffer to receive data */ static char io_buf[IO_BUF_SIZE]; -static uint32 _conn_open(const char *name, attr_container_t *args); +static uint32 _conn_open(wasm_module_inst_t module_inst, + const char *name, attr_container_t *args); static void _conn_close(uint32 handle); static int _conn_send(uint32 handle, const char *data, int len); static bool _conn_config(uint32 handle, attr_container_t *cfg); @@ -217,12 +218,14 @@ static conn_type_t get_conn_type(const char *name) } /* --- connection lib function --- */ -static uint32 _conn_open(const char *name, attr_container_t *args) +static uint32 _conn_open(wasm_module_inst_t module_inst, + const char *name, attr_container_t *args) { int fd; sys_connection_t *conn; struct epoll_event ev; - uint32 module_id = app_manager_get_module_id(Module_WASM_App); + uint32 module_id = app_manager_get_module_id(Module_WASM_App, + module_inst); if (get_app_conns_num(module_id) >= MAX_CONNECTION_PER_APP) return -1; diff --git a/core/iwasm/lib/native/extension/gui/wgl_btn_wrapper.c b/core/iwasm/lib/native/extension/gui/wgl_btn_wrapper.c index 04ed88a0..9b5c85a9 100644 --- a/core/iwasm/lib/native/extension/gui/wgl_btn_wrapper.c +++ b/core/iwasm/lib/native/extension/gui/wgl_btn_wrapper.c @@ -22,25 +22,115 @@ /* ------------------------------------------------------------------------- * Button widget native function wrappers * -------------------------------------------------------------------------*/ -static int32 _btn_create(lv_obj_t *par, lv_obj_t *copy) +static int32 +lv_btn_create_wrapper(wasm_module_inst_t module_inst, + lv_obj_t *par, lv_obj_t *copy) { - return wgl_native_wigdet_create(WIDGET_TYPE_BTN, par, copy); + return wgl_native_wigdet_create(WIDGET_TYPE_BTN, par, copy, module_inst); +} + +static void +lv_btn_set_toggle_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * btn, bool tgl) +{ + (void)module_inst; + lv_btn_set_toggle(btn, tgl); +} + +static void +lv_btn_set_state_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * btn, lv_btn_state_t state) +{ + (void)module_inst; + lv_btn_set_state(btn, state); +} + +static void +lv_btn_set_ink_in_time_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * btn, uint16_t time) +{ + (void)module_inst; + lv_btn_set_ink_in_time(btn, time); +} + +static void +lv_btn_set_ink_out_time_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * btn, uint16_t time) +{ + (void)module_inst; + lv_btn_set_ink_out_time(btn, time); +} + +static void +lv_btn_set_ink_wait_time_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * btn, uint16_t time) +{ + (void)module_inst; + lv_btn_set_ink_wait_time(btn, time); +} + +static uint16_t +lv_btn_get_ink_in_time_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * btn) +{ + (void)module_inst; + return lv_btn_get_ink_in_time(btn); +} + +static uint16_t +lv_btn_get_ink_out_time_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * btn) +{ + (void)module_inst; + return lv_btn_get_ink_out_time(btn); +} + +static uint16_t +lv_btn_get_ink_wait_time_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * btn) +{ + (void)module_inst; + return lv_btn_get_ink_wait_time(btn); +} + +static lv_btn_state_t +lv_btn_get_state_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * btn) +{ + (void)module_inst; + return lv_btn_get_state(btn); +} + +static bool +lv_btn_get_toggle_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * btn) +{ + (void)module_inst; + return lv_btn_get_toggle(btn); +} + +static void +lv_btn_toggle_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * btn) +{ + (void)module_inst; + lv_btn_toggle(btn); } static WGLNativeFuncDef btn_native_func_defs[] = { - { BTN_FUNC_ID_CREATE, _btn_create, HAS_RET, 2, {0 | NULL_OK, 1 | NULL_OK, -1}, {-1} }, - { BTN_FUNC_ID_SET_TOGGLE, lv_btn_set_toggle, NO_RET, 2, {0, -1}, {-1} }, - { BTN_FUNC_ID_SET_STATE, lv_btn_set_state, NO_RET, 2, {0, -1}, {-1} }, + { BTN_FUNC_ID_CREATE, lv_btn_create_wrapper, HAS_RET, 3, {1 | NULL_OK, 2 | NULL_OK, -1}, {-1} }, + { BTN_FUNC_ID_SET_TOGGLE, lv_btn_set_toggle_wrapper, NO_RET, 3, {1, -1}, {-1} }, + { BTN_FUNC_ID_SET_STATE, lv_btn_set_state_wrapper, NO_RET, 3, {1, -1}, {-1} }, // { BTN_FUNC_ID_SET_STYLE, _btn_set_style, NO_RET, 2, {0, -1}, {-1} }, - { BTN_FUNC_ID_SET_INK_IN_TIME, lv_btn_set_ink_in_time, NO_RET, 2, {0, -1}, {-1} }, - { BTN_FUNC_ID_SET_INK_OUT_TIME, lv_btn_set_ink_out_time, NO_RET, 2, {0, -1}, {-1} }, - { BTN_FUNC_ID_SET_INK_WAIT_TIME, lv_btn_set_ink_wait_time, NO_RET, 2, {0, -1}, {-1} }, - { BTN_FUNC_ID_GET_INK_IN_TIME, lv_btn_get_ink_in_time, HAS_RET, 1, {0, -1}, {-1} }, - { BTN_FUNC_ID_GET_INK_OUT_TIME, lv_btn_get_ink_out_time, HAS_RET, 1, {0, -1}, {-1} }, - { BTN_FUNC_ID_GET_INK_WAIT_TIME, lv_btn_get_ink_wait_time, HAS_RET, 1, {0, -1}, {-1} }, - { BTN_FUNC_ID_GET_STATE, lv_btn_get_state, HAS_RET, 1, {0, -1}, {-1} }, - { BTN_FUNC_ID_GET_TOGGLE, lv_btn_get_toggle, HAS_RET, 1, {0, -1}, {-1} }, - { BTN_FUNC_ID_TOGGLE, lv_btn_toggle, NO_RET, 1, {0, -1}, {-1} }, + { BTN_FUNC_ID_SET_INK_IN_TIME, lv_btn_set_ink_in_time_wrapper, NO_RET, 3, {1, -1}, {-1} }, + { BTN_FUNC_ID_SET_INK_OUT_TIME, lv_btn_set_ink_out_time_wrapper, NO_RET, 3, {1, -1}, {-1} }, + { BTN_FUNC_ID_SET_INK_WAIT_TIME, lv_btn_set_ink_wait_time_wrapper, NO_RET, 3, {1, -1}, {-1} }, + { BTN_FUNC_ID_GET_INK_IN_TIME, lv_btn_get_ink_in_time_wrapper, HAS_RET, 2, {1, -1}, {-1} }, + { BTN_FUNC_ID_GET_INK_OUT_TIME, lv_btn_get_ink_out_time_wrapper, HAS_RET, 2, {1, -1}, {-1} }, + { BTN_FUNC_ID_GET_INK_WAIT_TIME, lv_btn_get_ink_wait_time_wrapper, HAS_RET, 2, {1, -1}, {-1} }, + { BTN_FUNC_ID_GET_STATE, lv_btn_get_state_wrapper, HAS_RET, 2, {1, -1}, {-1} }, + { BTN_FUNC_ID_GET_TOGGLE, lv_btn_get_toggle_wrapper, HAS_RET, 2, {1, -1}, {-1} }, + { BTN_FUNC_ID_TOGGLE, lv_btn_toggle_wrapper, NO_RET, 2, {1, -1}, {-1} }, }; diff --git a/core/iwasm/lib/native/extension/gui/wgl_cb_wrapper.c b/core/iwasm/lib/native/extension/gui/wgl_cb_wrapper.c index b999ffa3..90abbc40 100644 --- a/core/iwasm/lib/native/extension/gui/wgl_cb_wrapper.c +++ b/core/iwasm/lib/native/extension/gui/wgl_cb_wrapper.c @@ -24,13 +24,31 @@ * Label widget native function wrappers * -------------------------------------------------------------------------*/ static int32 -_cb_create(lv_obj_t *par, lv_obj_t *copy) +lv_cb_create_wrapper(wasm_module_inst_t module_inst, + lv_obj_t *par, lv_obj_t *copy) { - return wgl_native_wigdet_create(WIDGET_TYPE_CB, par, copy); + return wgl_native_wigdet_create(WIDGET_TYPE_CB, par, copy, module_inst); +} + +static void +lv_cb_set_text_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * cb, const char * txt) +{ + (void)module_inst; + lv_cb_set_text(cb, txt); +} + +static void +lv_cb_set_static_text_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * cb, const char * txt) +{ + (void)module_inst; + lv_cb_set_static_text(cb, txt); } static int32 -_cb_get_text_length(lv_obj_t *cb) +lv_cb_get_text_length_wrapper(wasm_module_inst_t module_inst, + lv_obj_t *cb) { const char *text = lv_cb_get_text(cb); @@ -41,7 +59,8 @@ _cb_get_text_length(lv_obj_t *cb) } static char * -_cb_get_text(lv_obj_t *cb, char *buffer, int buffer_len) +lv_cb_get_text_wrapper(wasm_module_inst_t module_inst, + lv_obj_t *cb, char *buffer, int buffer_len) { const char *text = lv_cb_get_text(cb); @@ -55,11 +74,11 @@ _cb_get_text(lv_obj_t *cb, char *buffer, int buffer_len) } static WGLNativeFuncDef cb_native_func_defs[] = { - { CB_FUNC_ID_CREATE, _cb_create, HAS_RET, 2, {0 | NULL_OK, 1 | NULL_OK, -1}, {-1} }, - { CB_FUNC_ID_SET_TEXT, lv_cb_set_text, NO_RET, 2, {0, -1}, {1, -1} }, - { CB_FUNC_ID_SET_STATIC_TEXT, lv_cb_set_static_text, NO_RET, 2, {0, -1}, {1, -1} }, - { CB_FUNC_ID_GET_TEXT_LENGTH, _cb_get_text_length, HAS_RET, 1, {0, -1}, {-1} }, - { CB_FUNC_ID_GET_TEXT, _cb_get_text, RET_PTR, 3, {0, -1}, {1, -1} }, + { CB_FUNC_ID_CREATE, lv_cb_create_wrapper, HAS_RET, 3, {1 | NULL_OK, 2 | NULL_OK, -1}, {-1} }, + { CB_FUNC_ID_SET_TEXT, lv_cb_set_text_wrapper, NO_RET, 3, {1, -1}, {2, -1} }, + { CB_FUNC_ID_SET_STATIC_TEXT, lv_cb_set_static_text_wrapper, NO_RET, 3, {1, -1}, {2, -1} }, + { CB_FUNC_ID_GET_TEXT_LENGTH, lv_cb_get_text_length_wrapper, HAS_RET, 2, {1, -1}, {-1} }, + { CB_FUNC_ID_GET_TEXT, lv_cb_get_text_wrapper, RET_PTR, 4, {1, -1}, {2, -1} }, }; /*************** Native Interface to Wasm App ***********/ diff --git a/core/iwasm/lib/native/extension/gui/wgl_label_wrapper.c b/core/iwasm/lib/native/extension/gui/wgl_label_wrapper.c index 3c39382d..0a7062de 100644 --- a/core/iwasm/lib/native/extension/gui/wgl_label_wrapper.c +++ b/core/iwasm/lib/native/extension/gui/wgl_label_wrapper.c @@ -24,13 +24,23 @@ * Label widget native function wrappers * -------------------------------------------------------------------------*/ static int32 -_label_create(lv_obj_t *par, lv_obj_t *copy) +lv_label_create_wrapper(wasm_module_inst_t module_inst, + lv_obj_t *par, lv_obj_t *copy) { - return wgl_native_wigdet_create(WIDGET_TYPE_LABEL, par, copy); + return wgl_native_wigdet_create(WIDGET_TYPE_LABEL, par, copy, module_inst); +} + +static void +lv_label_set_text_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * label, const char * text) +{ + (void)module_inst; + lv_label_set_text(label, text); } static int32 -_label_get_text_length(lv_obj_t *label) +lv_label_get_text_length_wrapper(wasm_module_inst_t module_inst, + lv_obj_t *label) { char *text = lv_label_get_text(label); @@ -41,7 +51,8 @@ _label_get_text_length(lv_obj_t *label) } static char * -_label_get_text(lv_obj_t *label, char *buffer, int buffer_len) +lv_label_get_text_wrapper(wasm_module_inst_t module_inst, + lv_obj_t *label, char *buffer, int buffer_len) { char *text = lv_label_get_text(label); @@ -55,10 +66,10 @@ _label_get_text(lv_obj_t *label, char *buffer, int buffer_len) } static WGLNativeFuncDef label_native_func_defs[] = { - { LABEL_FUNC_ID_CREATE, _label_create, HAS_RET, 2, {0 | NULL_OK, 1 | NULL_OK, -1}, {-1} }, - { LABEL_FUNC_ID_SET_TEXT, lv_label_set_text, NO_RET, 2, {0, -1}, {1, -1} }, - { LABEL_FUNC_ID_GET_TEXT_LENGTH, _label_get_text_length, HAS_RET, 1, {0, -1}, {-1} }, - { LABEL_FUNC_ID_GET_TEXT, _label_get_text, RET_PTR, 3, {0, -1}, {1, -1} }, + { LABEL_FUNC_ID_CREATE, lv_label_create_wrapper, HAS_RET, 3, {1 | NULL_OK, 2 | NULL_OK, -1}, {-1} }, + { LABEL_FUNC_ID_SET_TEXT, lv_label_set_text_wrapper, NO_RET, 3, {1, -1}, {2, -1} }, + { LABEL_FUNC_ID_GET_TEXT_LENGTH, lv_label_get_text_length_wrapper, HAS_RET, 2, {1, -1}, {-1} }, + { LABEL_FUNC_ID_GET_TEXT, lv_label_get_text_wrapper, RET_PTR, 4, {1, -1}, {2, -1} }, }; /*************** Native Interface to Wasm App ***********/ diff --git a/core/iwasm/lib/native/extension/gui/wgl_list_wrapper.c b/core/iwasm/lib/native/extension/gui/wgl_list_wrapper.c index 2d633ac6..df9ba3d3 100644 --- a/core/iwasm/lib/native/extension/gui/wgl_list_wrapper.c +++ b/core/iwasm/lib/native/extension/gui/wgl_list_wrapper.c @@ -22,12 +22,16 @@ /* ------------------------------------------------------------------------- * List widget native function wrappers * -------------------------------------------------------------------------*/ -static int32 _list_create(lv_obj_t *par, lv_obj_t *copy) +static int32 +lv_list_create_wrapper(wasm_module_inst_t module_inst, + lv_obj_t *par, lv_obj_t *copy) { - return wgl_native_wigdet_create(WIDGET_TYPE_LIST, par, copy); + return wgl_native_wigdet_create(WIDGET_TYPE_LIST, par, copy, module_inst); } -static int32 _list_add_btn(lv_obj_t *list, const char *text) +static int32 +lv_list_add_btn_wrapper(wasm_module_inst_t module_inst, + lv_obj_t *list, const char *text) { uint32 btn_obj_id; lv_obj_t *btn; @@ -38,7 +42,8 @@ static int32 _list_add_btn(lv_obj_t *list, const char *text) return 0; if (wgl_native_add_object(btn, - app_manager_get_module_id(Module_WASM_App), + app_manager_get_module_id(Module_WASM_App, + module_inst), &btn_obj_id)) return btn_obj_id; /* success return */ @@ -46,8 +51,8 @@ static int32 _list_add_btn(lv_obj_t *list, const char *text) } static WGLNativeFuncDef list_native_func_defs[] = { - { LIST_FUNC_ID_CREATE, _list_create, HAS_RET, 2, {0 | NULL_OK, 1 | NULL_OK, -1}, {-1} }, - { LIST_FUNC_ID_ADD_BTN, _list_add_btn, HAS_RET, 2, {0, -1}, {1, -1} }, + { LIST_FUNC_ID_CREATE, lv_list_create_wrapper, HAS_RET, 3, {1 | NULL_OK, 2 | NULL_OK, -1}, {-1} }, + { LIST_FUNC_ID_ADD_BTN, lv_list_add_btn_wrapper, HAS_RET, 3, {1, -1}, {2, -1} }, }; /*************** Native Interface to Wasm App ***********/ diff --git a/core/iwasm/lib/native/extension/gui/wgl_native_utils.c b/core/iwasm/lib/native/extension/gui/wgl_native_utils.c index 1d51a7ae..d07b13a8 100644 --- a/core/iwasm/lib/native/extension/gui/wgl_native_utils.c +++ b/core/iwasm/lib/native/extension/gui/wgl_native_utils.c @@ -4,6 +4,7 @@ #include "lvgl.h" #include "module_wasm_app.h" #include "wasm_export.h" +#include "wasm_assert.h" #include @@ -12,7 +13,8 @@ void wasm_runtime_set_exception(wasm_module_inst_t module, const char *exception); -uint32 wgl_native_wigdet_create(int8 widget_type, lv_obj_t *par, lv_obj_t *copy) +uint32 wgl_native_wigdet_create(int8 widget_type, lv_obj_t *par, lv_obj_t *copy, + wasm_module_inst_t module_inst) { uint32 obj_id; lv_obj_t *wigdet; @@ -37,20 +39,19 @@ uint32 wgl_native_wigdet_create(int8 widget_type, lv_obj_t *par, lv_obj_t *copy) return 0; if (wgl_native_add_object(wigdet, - app_manager_get_module_id(Module_WASM_App), + app_manager_get_module_id(Module_WASM_App, + module_inst), &obj_id)) return obj_id; /* success return */ return 0; } -static void invokeNative(wasm_module_inst_t module_inst, - intptr_t argv[], uint32 argc, void (*native_code)()) +static void invokeNative(intptr_t argv[], uint32 argc, void (*native_code)()) { + wasm_assert(argc >= 1); + switch(argc) { - case 0: - native_code(); - break; case 1: native_code(argv[0]); break; @@ -87,15 +88,18 @@ static void invokeNative(wasm_module_inst_t module_inst, break; default: + { /* FIXME: If this happen, add more cases. */ + wasm_module_inst_t module_inst = (wasm_module_inst_t)argv[0]; THROW_EXC("the argument number of native function exceeds maximum"); return; + } } } typedef void (*GenericFunctionPointer)(); -typedef int32 (*Int32FuncPtr)(wasm_module_inst_t, intptr_t *, uint32, GenericFunctionPointer); -typedef void (*VoidFuncPtr)(wasm_module_inst_t, intptr_t *, uint32, GenericFunctionPointer); +typedef int32 (*Int32FuncPtr)(intptr_t *, uint32, GenericFunctionPointer); +typedef void (*VoidFuncPtr)(intptr_t *, uint32, GenericFunctionPointer); static Int32FuncPtr invokeNative_Int32 = (Int32FuncPtr)invokeNative; static VoidFuncPtr invokeNative_Void = (VoidFuncPtr)invokeNative; @@ -118,11 +122,13 @@ void wgl_native_func_call(wasm_module_inst_t module_inst, while (func_def < func_def_end) { if (func_def->func_id == func_id) { - int i, obj_arg_num = 0, ptr_arg_num = 0; + int i, obj_arg_num = 0, ptr_arg_num = 0, argc1 = 0; intptr_t argv_copy_buf[16]; intptr_t *argv_copy = argv_copy_buf; - if (func_def->arg_num > 16) { + argc1++; /* module_inst */ + argc1 += func_def->arg_num; + if (argc1 > 16) { argv_copy = (intptr_t *)bh_malloc(func_def->arg_num * sizeof(intptr_t)); if (argv_copy == NULL) @@ -130,8 +136,9 @@ void wgl_native_func_call(wasm_module_inst_t module_inst, } /* Init argv_copy */ + argv_copy[0] = (intptr_t)module_inst; for (i = 0; i < func_def->arg_num; i++) - argv_copy[i] = (intptr_t)argv[i]; + argv_copy[i + 1] = (intptr_t)argv[i]; /* Validate object arguments */ i = 0; @@ -143,7 +150,7 @@ void wgl_native_func_call(wasm_module_inst_t module_inst, index = index & (~NULL_OK); /* Some API's allow to pass NULL obj, such as xxx_create() */ - if (argv[index] == 0) { + if (argv_copy[index] == 0) { if (!null_ok) { THROW_EXC("the object id is 0 and invalid"); goto fail; @@ -152,7 +159,8 @@ void wgl_native_func_call(wasm_module_inst_t module_inst, continue; } - if (!wgl_native_validate_object(argv[index], (lv_obj_t **)&argv_copy[index])) { + if (!wgl_native_validate_object(argv_copy[index], + (lv_obj_t **)&argv_copy[index])) { THROW_EXC("the object is invalid"); goto fail; } @@ -165,22 +173,20 @@ void wgl_native_func_call(wasm_module_inst_t module_inst, uint8 index = func_def->ptr_arg_indexes[i]; /* The index+1 arg is the data size to be validated */ - if (!validate_app_addr(argv[index], argv[index + 1])) + if (!validate_app_addr(argv_copy[index], argv_copy[index + 1])) goto fail; /* Convert to native address before call lvgl function */ - argv_copy[index] = (intptr_t)addr_app_to_native(argv[index]); + argv_copy[index] = (intptr_t)addr_app_to_native(argv_copy[index]); } if (func_def->has_ret == NO_RET) - invokeNative_Void(module_inst, - argv_copy, - func_def->arg_num, + invokeNative_Void(argv_copy, + argc1, func_def->func_ptr); else { - argv[0] = invokeNative_Int32(module_inst, - argv_copy, - func_def->arg_num, + argv[0] = invokeNative_Int32(argv_copy, + argc1, func_def->func_ptr); /* Convert to app memory offset if return value is a * native address pointer */ diff --git a/core/iwasm/lib/native/extension/gui/wgl_native_utils.h b/core/iwasm/lib/native/extension/gui/wgl_native_utils.h index 1761e28f..27fb126d 100644 --- a/core/iwasm/lib/native/extension/gui/wgl_native_utils.h +++ b/core/iwasm/lib/native/extension/gui/wgl_native_utils.h @@ -63,7 +63,8 @@ bool wgl_native_add_object(lv_obj_t *obj, uint32 module_id, uint32 *obj_id); uint32 wgl_native_wigdet_create(int8 widget_type, lv_obj_t *par, - lv_obj_t *copy); + lv_obj_t *copy, + wasm_module_inst_t module_inst); void wgl_native_func_call(wasm_module_inst_t module_inst, WGLNativeFuncDef *funcs, diff --git a/core/iwasm/lib/native/extension/gui/wgl_obj_wrapper.c b/core/iwasm/lib/native/extension/gui/wgl_obj_wrapper.c index 158b4131..cd15dab2 100644 --- a/core/iwasm/lib/native/extension/gui/wgl_obj_wrapper.c +++ b/core/iwasm/lib/native/extension/gui/wgl_obj_wrapper.c @@ -306,8 +306,11 @@ void wgl_init(void) /* ------------------------------------------------------------------------- * Obj native function wrappers * -------------------------------------------------------------------------*/ -static lv_res_t _obj_del(lv_obj_t *obj) +static lv_res_t +lv_obj_del_wrapper(wasm_module_inst_t module_inst, lv_obj_t *obj) { + (void)module_inst; + /* Recursively delete object node in the list belong to this * parent object including itself */ _obj_del_recursive(obj); @@ -315,8 +318,18 @@ static lv_res_t _obj_del(lv_obj_t *obj) return lv_obj_del(obj); } -static void _obj_clean(lv_obj_t *obj) +static void +lv_obj_del_async_wrapper(wasm_module_inst_t module_inst, lv_obj_t * obj) { + (void)module_inst; + lv_obj_del_async(obj); +} + +static void +lv_obj_clean_wrapper(wasm_module_inst_t module_inst, lv_obj_t *obj) +{ + (void)module_inst; + /* Recursively delete child object node in the list belong to this * parent object */ _obj_clean_recursive(obj); @@ -325,19 +338,33 @@ static void _obj_clean(lv_obj_t *obj) lv_obj_clean(obj); } -static void _obj_set_event_cb(lv_obj_t *obj) +static void +lv_obj_align_wrapper(wasm_module_inst_t module_inst, + lv_obj_t * obj, + const lv_obj_t * base, + lv_align_t align, + lv_coord_t x_mod, + lv_coord_t y_mod) { + (void)module_inst; + lv_obj_align(obj, base, align, x_mod, y_mod); +} + +static void +lv_obj_set_event_cb_wrapper(wasm_module_inst_t module_inst, lv_obj_t *obj) +{ + (void)module_inst; lv_obj_set_event_cb(obj, internal_lv_obj_event_cb); } /* ------------------------------------------------------------------------- */ static WGLNativeFuncDef obj_native_func_defs[] = { - { OBJ_FUNC_ID_DEL, _obj_del, HAS_RET, 1, {0, -1}, {-1} }, - { OBJ_FUNC_ID_DEL_ASYNC, lv_obj_del_async, NO_RET, 1, {0, -1}, {-1} }, - { OBJ_FUNC_ID_CLEAN, _obj_clean, NO_RET, 1, {0, -1}, {-1} }, - { OBJ_FUNC_ID_ALIGN, lv_obj_align, NO_RET, 5, {0, 1 | NULL_OK, -1}, {-1} }, - { OBJ_FUNC_ID_SET_EVT_CB, _obj_set_event_cb, NO_RET, 1, {0, -1}, {-1} }, + { OBJ_FUNC_ID_DEL, lv_obj_del_wrapper, HAS_RET, 2, {1, -1}, {-1} }, + { OBJ_FUNC_ID_DEL_ASYNC, lv_obj_del_async_wrapper, NO_RET, 2, {1, -1}, {-1} }, + { OBJ_FUNC_ID_CLEAN, lv_obj_clean_wrapper, NO_RET, 2, {1, -1}, {-1} }, + { OBJ_FUNC_ID_ALIGN, lv_obj_align_wrapper, NO_RET, 6, {1, 2 | NULL_OK, -1}, {-1} }, + { OBJ_FUNC_ID_SET_EVT_CB, lv_obj_set_event_cb_wrapper, NO_RET, 2, {1, -1}, {-1} }, }; /*************** Native Interface to Wasm App ***********/ diff --git a/core/iwasm/lib/native/extension/sensor/runtime_sensor.c b/core/iwasm/lib/native/extension/sensor/runtime_sensor.c index 54e1e799..3dd0cf62 100644 --- a/core/iwasm/lib/native/extension/sensor/runtime_sensor.c +++ b/core/iwasm/lib/native/extension/sensor/runtime_sensor.c @@ -106,7 +106,8 @@ wasm_sensor_config(wasm_module_inst_t module_inst, if (s == NULL) return false; - unsigned int mod_id = app_manager_get_module_id(Module_WASM_App); + unsigned int mod_id = app_manager_get_module_id(Module_WASM_App, + module_inst); vm_mutex_lock(&s->lock); @@ -144,7 +145,7 @@ wasm_sensor_open(wasm_module_inst_t module_inst, { char *name = NULL; - if (!validate_app_addr(name_offset, 1)) + if (!validate_app_str_addr(name_offset)) return -1; name = addr_app_to_native(name_offset); @@ -155,7 +156,8 @@ wasm_sensor_open(wasm_module_inst_t module_inst, if (s == NULL) return -1; - unsigned int mod_id = app_manager_get_module_id(Module_WASM_App); + unsigned int mod_id = app_manager_get_module_id(Module_WASM_App, + module_inst); vm_mutex_lock(&s->lock); @@ -222,7 +224,8 @@ wasm_sensor_config_with_attr_container(wasm_module_inst_t module_inst, bool wasm_sensor_close(wasm_module_inst_t module_inst, uint32 sensor) { - unsigned int mod_id = app_manager_get_module_id(Module_WASM_App); + unsigned int mod_id = app_manager_get_module_id(Module_WASM_App, + module_inst); unsigned int client_id = mod_id; sensor_obj_t s = find_sys_sensor_id(sensor); sensor_client_t *c; diff --git a/core/iwasm/lib/native/libc/libc_wrapper.c b/core/iwasm/lib/native/libc/libc_wrapper.c index bfd2c53d..4127f4f4 100644 --- a/core/iwasm/lib/native/libc/libc_wrapper.c +++ b/core/iwasm/lib/native/libc/libc_wrapper.c @@ -37,6 +37,9 @@ wasm_runtime_set_llvm_stack(wasm_module_inst_t module, uint32 llvm_stack); #define validate_app_addr(offset, size) \ wasm_runtime_validate_app_addr(module_inst, offset, size) +#define validate_app_str_addr(offset) \ + wasm_runtime_validate_app_str_addr(module_inst, offset) + #define addr_app_to_native(offset) \ wasm_runtime_addr_app_to_native(module_inst, offset) @@ -49,29 +52,6 @@ wasm_runtime_set_llvm_stack(wasm_module_inst_t module, uint32 llvm_stack); #define module_free(offset) \ wasm_runtime_module_free(module_inst, offset) -static bool -validate_str_addr(wasm_module_inst_t module_inst, int32 str_offset) -{ - int32 app_end_offset; - char *str, *str_end; - - if (!wasm_runtime_get_app_addr_range(module_inst, str_offset, - NULL, &app_end_offset)) - goto fail; - - str = addr_app_to_native(str_offset); - str_end = str + (app_end_offset - str_offset); - while (str < str_end && *str != '\0') - str++; - if (str == str_end) - goto fail; - return true; - -fail: - wasm_runtime_set_exception(module_inst, "out of bounds memory access"); - return false; -} - typedef int (*out_func_t)(int c, void *ctx); enum pad_type { @@ -335,7 +315,7 @@ _vprintf_wa(out_func_t out, void *ctx, const char *fmt, _va_list ap, CHECK_VA_ARG(ap, uint32); s_offset = _va_arg(ap, uint32); - if (!validate_str_addr(module_inst, s_offset)) { + if (!validate_app_str_addr(s_offset)) { return false; } @@ -438,7 +418,7 @@ parse_printf_args(wasm_module_inst_t module_inst, int32 fmt_offset, _va_list v; } u; - if (!validate_str_addr(module_inst, fmt_offset) + if (!validate_app_str_addr(fmt_offset) || !validate_app_addr(va_list_offset, sizeof(int32))) return false; @@ -539,7 +519,7 @@ _puts_wrapper(wasm_module_inst_t module_inst, { const char *str; - if (!validate_str_addr(module_inst, str_offset)) + if (!validate_app_str_addr(str_offset)) return 0; str = addr_app_to_native(str_offset); @@ -561,7 +541,7 @@ _strdup_wrapper(wasm_module_inst_t module_inst, uint32 len; int32 str_ret_offset = 0; - if (!validate_str_addr(module_inst, str_offset)) + if (!validate_app_str_addr(str_offset)) return 0; str = addr_app_to_native(str_offset); @@ -650,7 +630,7 @@ _strchr_wrapper(wasm_module_inst_t module_inst, const char *s; char *ret; - if (!validate_str_addr(module_inst, s_offset)) + if (!validate_app_str_addr(s_offset)) return s_offset; s = addr_app_to_native(s_offset); @@ -664,8 +644,8 @@ _strcmp_wrapper(wasm_module_inst_t module_inst, { void *s1, *s2; - if (!validate_str_addr(module_inst, s1_offset) - || !validate_str_addr(module_inst, s2_offset)) + if (!validate_app_str_addr(s1_offset) + || !validate_app_str_addr(s2_offset)) return 0; s1 = addr_app_to_native(s1_offset); @@ -695,7 +675,7 @@ _strcpy_wrapper(wasm_module_inst_t module_inst, char *dst, *src; uint32 len; - if (!validate_str_addr(module_inst, src_offset)) + if (!validate_app_str_addr(src_offset)) return 0; src = addr_app_to_native(src_offset); @@ -731,7 +711,7 @@ _strlen_wrapper(wasm_module_inst_t module_inst, { char *s; - if (!validate_str_addr(module_inst, s_offset)) + if (!validate_app_str_addr(s_offset)) return 0; s = addr_app_to_native(s_offset); diff --git a/core/iwasm/runtime/include/wasm_export.h b/core/iwasm/runtime/include/wasm_export.h index 11b99753..2322cc57 100644 --- a/core/iwasm/runtime/include/wasm_export.h +++ b/core/iwasm/runtime/include/wasm_export.h @@ -255,37 +255,23 @@ void wasm_runtime_clear_exception(wasm_module_inst_t module_inst); /** - * Attach the current native thread to a WASM module instance. - * A native thread cannot be attached simultaneously to two WASM module - * instances. The WASM module instance will be attached to the native - * thread which it is instantiated in by default. + * Set custom data to WASM module instance. * - * @param module_inst the WASM module instance to attach - * @param thread_data the thread data that current native thread requires - * the WASM module instance to store - * - * @return true if SUCCESS, false otherwise - */ -bool -wasm_runtime_attach_current_thread(wasm_module_inst_t module_inst, - void *thread_data); - -/** - * Detach the current native thread from a WASM module instance. - * - * @param module_inst the WASM module instance to detach + * @param module_inst the WASM module instance + * @param custom_data the custom data to be set */ void -wasm_runtime_detach_current_thread(wasm_module_inst_t module_inst); - +wasm_runtime_set_custom_data(wasm_module_inst_t module_inst, + void *custom_data); /** - * Get the thread data that the current native thread requires the WASM - * module instance to store when attaching. + * Get the custom data within a WASM module instance. * - * @return the thread data stored when attaching + * @param module_inst the WASM module instance + * + * @return the custom data (NULL if not set yet) */ void* -wasm_runtime_get_current_thread_data(); +wasm_runtime_get_custom_data(wasm_module_inst_t module_inst); /** * Allocate memory from the heap of WASM module instance @@ -342,6 +328,23 @@ bool wasm_runtime_validate_app_addr(wasm_module_inst_t module_inst, int32_t app_offset, uint32_t size); +/** + * Similar to wasm_runtime_validate_app_addr(), except that the size parameter + * is not provided. This function validates the app string address, check whether it + * belongs to WASM module instance's address space, or in its heap space or + * memory space. Moreover, it checks whether it is the offset of a string that + * is end with '\0'. + * @param module_inst the WASM module instance + * @param app_str_offset the app address of the string to validate, which is a + * relative address + * + * @return true if success, false otherwise. If failed, an exception will + * be thrown. + */ +bool +wasm_runtime_validate_app_str_addr(wasm_module_inst_t module_inst, + int32_t app_str_offset); + /** * Validate the native address, check whether it belongs to WASM module * instance's address space, or in its heap space or memory space. diff --git a/core/iwasm/runtime/vmcore-wasm/invokeNative_general.c b/core/iwasm/runtime/vmcore-wasm/invokeNative_general.c index 99c0473a..09e1b622 100644 --- a/core/iwasm/runtime/vmcore-wasm/invokeNative_general.c +++ b/core/iwasm/runtime/vmcore-wasm/invokeNative_general.c @@ -18,7 +18,8 @@ void invokeNative(void (*native_code)(), uint32 argv[], uint32 argc) { - WASMThread *self; + wasm_assert(argc >= sizeof(WASMModuleInstance *)/sizeof(uint32)); + switch(argc) { case 0: native_code(); @@ -84,9 +85,11 @@ void invokeNative(void (*native_code)(), uint32 argv[], uint32 argc) native_code(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16], argv[17], argv[18], argv[19]); break; default: + { /* FIXME: If this happen, add more cases. */ - self = wasm_runtime_get_self(); - wasm_runtime_set_exception(self->module_inst, "the argument number of native function exceeds maximum"); + WASMModuleInstance *module_inst = *(WASMModuleInstance**)argv; + wasm_runtime_set_exception(module_inst, "the argument number of native function exceeds maximum"); return; + } } } diff --git a/core/iwasm/runtime/vmcore-wasm/wasm_interp.c b/core/iwasm/runtime/vmcore-wasm/wasm_interp.c index 0bd29026..0b219863 100644 --- a/core/iwasm/runtime/vmcore-wasm/wasm_interp.c +++ b/core/iwasm/runtime/vmcore-wasm/wasm_interp.c @@ -2178,10 +2178,11 @@ wasm_interp_call_func_bytecode(WASMThread *self, } void -wasm_interp_call_wasm(WASMFunctionInstance *function, +wasm_interp_call_wasm(WASMModuleInstance *module_inst, + WASMFunctionInstance *function, uint32 argc, uint32 argv[]) { - WASMThread *self = wasm_runtime_get_self(); + WASMThread *self = &module_inst->main_tlr; WASMRuntimeFrame *prev_frame = wasm_thread_get_cur_frame(self); WASMInterpFrame *frame, *outs_area; diff --git a/core/iwasm/runtime/vmcore-wasm/wasm_interp.h b/core/iwasm/runtime/vmcore-wasm/wasm_interp.h index 84f40980..50bb3d71 100644 --- a/core/iwasm/runtime/vmcore-wasm/wasm_interp.h +++ b/core/iwasm/runtime/vmcore-wasm/wasm_interp.h @@ -23,6 +23,7 @@ extern "C" { #endif +struct WASMModuleInstance; struct WASMFunctionInstance; typedef struct WASMInterpFrame { @@ -69,7 +70,8 @@ wasm_interp_interp_frame_size(unsigned all_cell_num) } void -wasm_interp_call_wasm(struct WASMFunctionInstance *function, +wasm_interp_call_wasm(struct WASMModuleInstance *module_inst, + struct WASMFunctionInstance *function, uint32 argc, uint32 argv[]); #ifdef __cplusplus diff --git a/core/iwasm/runtime/vmcore-wasm/wasm_loader.c b/core/iwasm/runtime/vmcore-wasm/wasm_loader.c index 8057f380..0b2760be 100644 --- a/core/iwasm/runtime/vmcore-wasm/wasm_loader.c +++ b/core/iwasm/runtime/vmcore-wasm/wasm_loader.c @@ -60,14 +60,14 @@ read_leb(const uint8 *buf, const uint8 *buf_end, *p_offset += 1; result |= ((byte & 0x7f) << shift); shift += 7; + bcnt += 1; if ((byte & 0x80) == 0) { break; } - bcnt += 1; } if (bcnt > (maxbits + 7 - 1) / 7) { set_error_buf(error_buf, error_buf_size, - "WASM module load failed: unsigned LEB overflow."); + "integer representation too long"); return false; } if (sign && (shift < maxbits) && (byte & 0x40)) { @@ -625,17 +625,19 @@ load_function_section(const uint8 *buf, const uint8 *buf_end, const uint8 *p = buf, *p_end = buf_end; const uint8 *p_code = buf_code, *p_code_end, *p_code_save; uint32 func_count, total_size; - uint32 code_count, code_size, type_index, i, j, k, local_type_index; + uint32 code_count = 0, code_size, type_index, i, j, k, local_type_index; uint32 local_count, local_set_count, sub_local_count; uint8 type; WASMFunction *func; read_leb_uint32(p, p_end, func_count); - read_leb_uint32(p_code, buf_code_end, code_count); + if (buf_code) + read_leb_uint32(p_code, buf_code_end, code_count); + if (func_count != code_count) { set_error_buf(error_buf, error_buf_size, - "Load function section failed: invalid function count."); + "function and code section have inconsistent lengths"); return false; } @@ -677,6 +679,11 @@ load_function_section(const uint8 *buf, const uint8 *buf_end, /* Calculate total local count */ for (j = 0; j < local_set_count; j++) { read_leb_uint32(p_code, buf_code_end, sub_local_count); + if (sub_local_count > UINT32_MAX - local_count) { + set_error_buf(error_buf, error_buf_size, + "too many locals"); + return false; + } read_leb_uint8(p_code, buf_code_end, type); local_count += sub_local_count; } @@ -1084,11 +1091,29 @@ load_data_segment_section(const uint8 *buf, const uint8 *buf_end, } static bool -load_code_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, +load_code_section(const uint8 *buf, const uint8 *buf_end, + const uint8 *buf_func, + const uint8 *buf_func_end, + WASMModule *module, char *error_buf, uint32 error_buf_size) { - /* code has been loaded in function section, so pass it here */ - /* TODO: should check if there really have section_size code bytes */ + const uint8 *p = buf, *p_end = buf_end; + const uint8 *p_func = buf_func; + uint32 func_count = 0, code_count; + + /* code has been loaded in function section, so pass it here, just check + * whether function and code section have inconsistent lengths */ + read_leb_uint32(p, p_end, code_count); + + if (buf_func) + read_leb_uint32(p_func, buf_func_end, func_count); + + if (func_count != code_count) { + set_error_buf(error_buf, error_buf_size, + "function and code section have inconsistent lengths"); + return false; + } + LOG_VERBOSE("Load code segment section success.\n"); return true; } @@ -1132,14 +1157,19 @@ load_from_sections(WASMModule *module, WASMSection *sections, char *error_buf, uint32 error_buf_size) { WASMSection *section = sections; - const uint8 *buf, *buf_end, *buf_code = NULL, *buf_code_end = NULL; + const uint8 *buf, *buf_end, *buf_code = NULL, *buf_code_end = NULL, + *buf_func = NULL, *buf_func_end = NULL; uint32 i; + /* Find code and function sections if have */ while (section) { if (section->section_type == SECTION_TYPE_CODE) { buf_code = section->section_body; buf_code_end = buf_code + section->section_body_size; - break; + } + else if (section->section_type == SECTION_TYPE_FUNC) { + buf_func = section->section_body; + buf_func_end = buf_func + section->section_body_size; } section = section->next; } @@ -1151,6 +1181,8 @@ load_from_sections(WASMModule *module, WASMSection *sections, switch (section->section_type) { case SECTION_TYPE_USER: /* unsupported user section, ignore it. */ + /* add a check to pass spec test case */ + CHECK_BUF(buf, buf_end, 1); break; case SECTION_TYPE_TYPE: if (!load_type_section(buf, buf_end, module, error_buf, error_buf_size)) @@ -1161,11 +1193,6 @@ load_from_sections(WASMModule *module, WASMSection *sections, return false; break; case SECTION_TYPE_FUNC: - if (!buf_code) { - set_error_buf(error_buf, error_buf_size, - "WASM module load failed: find code section failed."); - return false; - } if (!load_function_section(buf, buf_end, buf_code, buf_code_end, module, error_buf, error_buf_size)) return false; @@ -1195,7 +1222,8 @@ load_from_sections(WASMModule *module, WASMSection *sections, return false; break; case SECTION_TYPE_CODE: - if (!load_code_section(buf, buf_end, module, error_buf, error_buf_size)) + if (!load_code_section(buf, buf_end, buf_func, buf_func_end, + module, error_buf, error_buf_size)) return false; break; case SECTION_TYPE_DATA: @@ -1356,7 +1384,7 @@ create_sections(const uint8 *buf, uint32 size, p += section_size; } else { - set_error_buf(error_buf, error_buf_size, "invalid section type"); + set_error_buf(error_buf, error_buf_size, "invalid section id"); return false; } } @@ -2540,7 +2568,14 @@ handle_op_br: } read_leb_uint32(p, p_end, type_idx); - read_leb_uint8(p, p_end, u8); /* 0x00 */ + + /* reserved byte 0x00 */ + if (*p++ != 0x00) { + set_error_buf(error_buf, error_buf_size, + "zero flag expected"); + goto fail; + } + POP_I32(); if (type_idx >= module->type_count) { @@ -2752,13 +2787,23 @@ handle_op_br: case WASM_OP_MEMORY_SIZE: CHECK_MEMORY(); - read_leb_uint32(p, p_end, u32); /* 0x00 */ + /* reserved byte 0x00 */ + if (*p++ != 0x00) { + set_error_buf(error_buf, error_buf_size, + "zero flag expected"); + goto fail; + } PUSH_I32(); break; case WASM_OP_MEMORY_GROW: CHECK_MEMORY(); - read_leb_uint32(p, p_end, u32); /* 0x00 */ + /* reserved byte 0x00 */ + if (*p++ != 0x00) { + set_error_buf(error_buf, error_buf_size, + "zero flag expected"); + goto fail; + } POP_I32(); PUSH_I32(); break; diff --git a/core/iwasm/runtime/vmcore-wasm/wasm_runtime.c b/core/iwasm/runtime/vmcore-wasm/wasm_runtime.c index 28024998..77c7bb9e 100644 --- a/core/iwasm/runtime/vmcore-wasm/wasm_runtime.c +++ b/core/iwasm/runtime/vmcore-wasm/wasm_runtime.c @@ -44,8 +44,6 @@ wasm_runtime_init() if (ws_thread_sys_init() != 0) return false; - wasm_runtime_set_tlr(NULL); - wasm_native_init(); return true; } @@ -53,7 +51,6 @@ wasm_runtime_init() void wasm_runtime_destroy() { - wasm_runtime_set_tlr(NULL); ws_thread_sys_destroy(); } @@ -71,7 +68,7 @@ wasm_runtime_call_wasm(WASMModuleInstance *module_inst, unsigned argc, uint32 argv[]) { /* Only init stack when no application is running. */ - if (!wasm_runtime_get_self()->cur_frame) { + if (!module_inst->main_tlr.cur_frame) { if (!exec_env) { if (!module_inst->wasm_stack) { if (!(module_inst->wasm_stack = @@ -107,7 +104,7 @@ wasm_runtime_call_wasm(WASMModuleInstance *module_inst, } } - wasm_interp_call_wasm(function, argc, argv); + wasm_interp_call_wasm(module_inst, function, argc, argv); return !wasm_runtime_get_exception(module_inst) ? true : false; } @@ -959,9 +956,7 @@ wasm_runtime_instantiate(WASMModule *module, module_inst->wasm_stack_size = stack_size; module_inst->main_tlr.module_inst = module_inst; - /* Bind thread data with current native thread: - set thread local root to current thread. */ - wasm_runtime_set_tlr(&module_inst->main_tlr); + /* The native thread handle may be used in future, e.g multiple threads. */ module_inst->main_tlr.handle = ws_self_thread(); /* Execute __post_instantiate and start function */ @@ -1133,34 +1128,17 @@ wasm_runtime_destroy_exec_env(WASMExecEnv *env) } } -bool -wasm_runtime_attach_current_thread(WASMModuleInstance *module_inst, - void *thread_data) -{ - wasm_runtime_set_tlr(&module_inst->main_tlr); - module_inst->main_tlr.handle = ws_self_thread(); - module_inst->thread_data = thread_data; - return true; -} - void -wasm_runtime_detach_current_thread(WASMModuleInstance *module_inst) +wasm_runtime_set_custom_data(WASMModuleInstance *module_inst, + void *custom_data) { - module_inst->thread_data = NULL; + module_inst->custom_data = custom_data; } void* -wasm_runtime_get_current_thread_data() +wasm_runtime_get_custom_data(WASMModuleInstance *module_inst) { - WASMThread *tlr = wasm_runtime_get_self(); - return (tlr && tlr->module_inst) ? tlr->module_inst->thread_data : NULL; -} - -WASMModuleInstance * -wasm_runtime_get_current_module_inst() -{ - WASMThread *tlr = wasm_runtime_get_self(); - return tlr ? tlr->module_inst : NULL; + return module_inst->custom_data; } int32 @@ -1247,6 +1225,30 @@ fail: return false; } +bool +wasm_runtime_validate_app_str_addr(WASMModuleInstance *module_inst, + int32 app_str_offset) +{ + int32 app_end_offset; + char *str, *str_end; + + if (!wasm_runtime_get_app_addr_range(module_inst, app_str_offset, + NULL, &app_end_offset)) + goto fail; + + str = wasm_runtime_addr_app_to_native(module_inst, app_str_offset); + str_end = str + (app_end_offset - app_str_offset); + while (str < str_end && *str != '\0') + str++; + if (str == str_end) + goto fail; + return true; + +fail: + wasm_runtime_set_exception(module_inst, "out of bounds memory access"); + return false; +} + bool wasm_runtime_validate_native_addr(WASMModuleInstance *module_inst, void *native_ptr, uint32 size) diff --git a/core/iwasm/runtime/vmcore-wasm/wasm_runtime.h b/core/iwasm/runtime/vmcore-wasm/wasm_runtime.h index 85c0bcf3..2eb12b75 100644 --- a/core/iwasm/runtime/vmcore-wasm/wasm_runtime.h +++ b/core/iwasm/runtime/vmcore-wasm/wasm_runtime.h @@ -164,8 +164,9 @@ typedef struct WASMModuleInstance { /* The exception buffer of wasm interpreter for current thread. */ char cur_exception[128]; - /* The thread data of the attaching thread */ - void *thread_data; + /* The custom data that can be set/get by + * wasm_runtime_set_custom_data/wasm_runtime_get_custom_data */ + void *custom_data; /* Main Thread */ WASMThread main_tlr; @@ -283,38 +284,57 @@ wasm_runtime_get_exception(WASMModuleInstance *module); bool wasm_runtime_enlarge_memory(WASMModuleInstance *module, int inc_page_count); -/* See wasm-export.h for description */ +/* See wasm_export.h for description */ WASMModuleInstance * wasm_runtime_get_current_module_inst(); -/* See wasm-export.h for description */ +/* See wasm_export.h for description */ int32 wasm_runtime_module_malloc(WASMModuleInstance *module_inst, uint32 size); -/* See wasm-export.h for description */ +/* See wasm_export.h for description */ void wasm_runtime_module_free(WASMModuleInstance *module_inst, int32 ptr); -/* See wasm-export.h for description */ +/* See wasm_export.h for description */ bool wasm_runtime_validate_app_addr(WASMModuleInstance *module_inst, int32 app_offset, uint32 size); -/* See wasm-export.h for description */ +/* See wasm_export.h for description */ +bool +wasm_runtime_validate_app_str_addr(WASMModuleInstance *module_inst, + int32 app_offset); + +/* See wasm_export.h for description */ bool wasm_runtime_validate_native_addr(WASMModuleInstance *module_inst, void *native_ptr, uint32 size); -/* See wasm-export.h for description */ +/* See wasm_export.h for description */ void * wasm_runtime_addr_app_to_native(WASMModuleInstance *module_inst, int32 app_offset); -/* See wasm-export.h for description */ +/* See wasm_export.h for description */ int32 wasm_runtime_addr_native_to_app(WASMModuleInstance *module_inst, void *native_ptr); +/* See wasm_export.h for description */ +bool +wasm_runtime_get_app_addr_range(WASMModuleInstance *module_inst, + int32_t app_offset, + int32_t *p_app_start_offset, + int32_t *p_app_end_offset); + +/* See wasm_export.h for description */ +bool +wasm_runtime_get_native_addr_range(WASMModuleInstance *module_inst, + uint8_t *native_ptr, + uint8_t **p_native_start_addr, + uint8_t **p_native_end_addr); + bool wasm_runtime_invoke_native(void *func_ptr, WASMType *func_type, WASMModuleInstance *module_inst, diff --git a/core/shared-lib/include/bh_queue.h b/core/shared-lib/include/bh_queue.h index a30c1126..f45b9014 100644 --- a/core/shared-lib/include/bh_queue.h +++ b/core/shared-lib/include/bh_queue.h @@ -29,7 +29,7 @@ typedef struct _bh_queue_node * bh_message_t; struct bh_queue; typedef struct bh_queue bh_queue; -typedef void (*bh_queue_handle_msg_callback)(void *message); +typedef void (*bh_queue_handle_msg_callback)(void *message, void *arg); #define bh_queue_malloc bh_malloc #define bh_queue_free bh_free @@ -82,12 +82,8 @@ bh_queue_get_message_count(bh_queue *queue); void bh_queue_enter_loop_run(bh_queue *queue, - bh_queue_handle_msg_callback handle_cb); - -void -bh_queue_enter_loop_run1(bh_queue *queue, - bh_queue_handle_msg_callback handle_cb); - + bh_queue_handle_msg_callback handle_cb, + void *arg); void bh_queue_exit_loop_run(bh_queue *queue); diff --git a/core/shared-lib/utils/bh_queue.c b/core/shared-lib/utils/bh_queue.c index 2fef7ace..980fb2ed 100644 --- a/core/shared-lib/utils/bh_queue.c +++ b/core/shared-lib/utils/bh_queue.c @@ -234,7 +234,8 @@ unsigned bh_queue_get_message_count(bh_queue *queue) } void bh_queue_enter_loop_run(bh_queue *queue, - bh_queue_handle_msg_callback handle_cb) + bh_queue_handle_msg_callback handle_cb, + void *arg) { if (!queue) return; @@ -243,7 +244,7 @@ void bh_queue_enter_loop_run(bh_queue *queue, bh_queue_node * message = bh_get_msg(queue, BH_WAIT_FOREVER); if (message) { - handle_cb(message); + handle_cb(message, arg); bh_free_msg(message); } } diff --git a/samples/littlevgl/README.md b/samples/littlevgl/README.md index 4f37d84f..a4a5bbb5 100644 --- a/samples/littlevgl/README.md +++ b/samples/littlevgl/README.md @@ -97,12 +97,12 @@ https://docs.zephyrproject.org/latest/getting_started/index.html
` ln -s /core core`
d. build source code
Since ui_app incorporated LittlevGL source code, so it needs more RAM on the device to install the application. - It is recommended that RAM SIZE greater than 512KB. + It is recommended that RAM SIZE not less than 320KB. In our test use nucleo_f767zi, which is not supported by Zephyr. However, nucleo_f767zi is almost the same as nucleo_f746zg, except FLASH and SRAM size. So we changed the DTS setting of nucleo_f746zg boards for a workaround.
- `Modify zephyr/dts/arm/st/f7/stm32f746Xg.dtsi, change DT_SIZE_K(320) to DT_SIZE_K(512)`
+ `Modify zephyr/dts/arm/st/f7/stm32f746.dtsi, change DT_SIZE_K(256) to DT_SIZE_K(320) in 'sram0' definition.`
`mkdir build && cd build`
`source ../../../../zephyr-env.sh`
`cmake -GNinja -DBOARD=nucleo_f746zg ..`