mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-02-06 15:05:19 +00:00
Remove iwasm/runtime/platform src files, refine interpreter and fix issue of --repl option (#150)
This commit is contained in:
parent
631b7a2403
commit
5875a37f34
|
@ -1245,7 +1245,9 @@ wasm_native_func_lookup(const char *module_name, const char *func_name)
|
|||
uint32 size = sizeof(native_func_defs) / sizeof(WASMNativeFuncDef);
|
||||
WASMNativeFuncDef *func_def = native_func_defs;
|
||||
WASMNativeFuncDef *func_def_end = func_def + size;
|
||||
#if WASM_ENABLE_WASI != 0
|
||||
void *ret;
|
||||
#endif
|
||||
|
||||
if (!module_name || !func_name)
|
||||
return NULL;
|
||||
|
@ -1259,9 +1261,6 @@ wasm_native_func_lookup(const char *module_name, const char *func_name)
|
|||
func_def++;
|
||||
}
|
||||
|
||||
if ((ret = wasm_platform_native_func_lookup(module_name, func_name)))
|
||||
return ret;
|
||||
|
||||
#if WASM_ENABLE_WASI != 0
|
||||
if ((ret = wasi_native_func_lookup(module_name, func_name)))
|
||||
return ret;
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#ifndef LOCKING_H
|
||||
#define LOCKING_H
|
||||
|
||||
#include "config.h"
|
||||
#include "ssp_config.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
//
|
||||
// Copyright (c) 2016-2018 Nuxi, https://nuxi.nl/
|
||||
|
||||
#include "config.h"
|
||||
#include "ssp_config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
//
|
||||
// Copyright (c) 2016 Nuxi, https://nuxi.nl/
|
||||
|
||||
#include "config.h"
|
||||
#include "ssp_config.h"
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <pthread.h>
|
||||
|
|
|
@ -9,8 +9,8 @@
|
|||
//
|
||||
// Copyright (c) 2016 Nuxi, https://nuxi.nl/
|
||||
|
||||
#ifndef CONFIG_H
|
||||
#define CONFIG_H
|
||||
#ifndef SSP_CONFIG_H
|
||||
#define SSP_CONFIG_H
|
||||
|
||||
#include <stdlib.h>
|
||||
|
|
@ -9,7 +9,7 @@
|
|||
//
|
||||
// Copyright (c) 2016 Nuxi, https://nuxi.nl/
|
||||
|
||||
#include "config.h"
|
||||
#include "ssp_config.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#ifndef STR_H
|
||||
#define STR_H
|
||||
|
||||
#include "config.h"
|
||||
#include "ssp_config.h"
|
||||
|
||||
char *str_nullterminate(const char *, size_t);
|
||||
|
||||
|
|
|
@ -17,7 +17,6 @@ GLOBAL_INCLUDES += ${IWASM_ROOT}/runtime/include \
|
|||
$(NAME)_SOURCES := ${IWASM_ROOT}/runtime/utils/wasm_hashmap.c \
|
||||
${IWASM_ROOT}/runtime/utils/wasm_log.c \
|
||||
${IWASM_ROOT}/runtime/utils/wasm_dlfcn.c \
|
||||
${IWASM_ROOT}/runtime/platform/alios/wasm_native.c \
|
||||
${IWASM_ROOT}/runtime/vmcore-wasm/wasm_application.c \
|
||||
${IWASM_ROOT}/runtime/vmcore-wasm/wasm_interp.c \
|
||||
${IWASM_ROOT}/runtime/vmcore-wasm/wasm_loader.c \
|
||||
|
|
|
@ -92,7 +92,6 @@ include_directories (.
|
|||
|
||||
enable_language (ASM)
|
||||
|
||||
include (../../runtime/platform/${PLATFORM}/platform.cmake)
|
||||
include (../../runtime/utils/utils.cmake)
|
||||
include (../../runtime/vmcore-wasm/vmcore.cmake)
|
||||
include (../../lib/native/libc/wasmtime-wasi-c/wasi.cmake)
|
||||
|
|
|
@ -60,12 +60,10 @@ app_instance_main(wasm_module_inst_t module_inst)
|
|||
static void*
|
||||
app_instance_func(wasm_module_inst_t module_inst, char *func_name)
|
||||
{
|
||||
const char *exception;
|
||||
|
||||
wasm_application_execute_func(module_inst, func_name, app_argc - 1,
|
||||
app_argv + 1);
|
||||
if ((exception = wasm_runtime_get_exception(module_inst)))
|
||||
wasm_printf("%s\n", exception);
|
||||
/* The result of wasm function or exception info was output inside
|
||||
wasm_application_execute_func(), here we don't output them again. */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -93,7 +93,6 @@ include_directories (.
|
|||
|
||||
enable_language (ASM)
|
||||
|
||||
include (../../runtime/platform/${PLATFORM}/platform.cmake)
|
||||
include (../../runtime/utils/utils.cmake)
|
||||
include (../../runtime/vmcore-wasm/vmcore.cmake)
|
||||
include (../../lib/native/libc/wasmtime-wasi-c/wasi.cmake)
|
||||
|
|
|
@ -89,7 +89,6 @@ include_directories (.
|
|||
|
||||
enable_language (ASM)
|
||||
|
||||
include (../../runtime/platform/${PLATFORM}/platform.cmake)
|
||||
include (../../runtime/utils/utils.cmake)
|
||||
include (../../runtime/vmcore-wasm/vmcore.cmake)
|
||||
include (../../lib/native/libc/wasmtime-wasi-c/wasi.cmake)
|
||||
|
|
|
@ -87,12 +87,10 @@ app_instance_main(wasm_module_inst_t module_inst)
|
|||
static void*
|
||||
app_instance_func(wasm_module_inst_t module_inst, const char *func_name)
|
||||
{
|
||||
const char *exception;
|
||||
|
||||
wasm_application_execute_func(module_inst, func_name, app_argc - 1,
|
||||
app_argv + 1);
|
||||
if ((exception = wasm_runtime_get_exception(module_inst)))
|
||||
wasm_printf("%s\n", exception);
|
||||
/* The result of wasm function or exception info was output inside
|
||||
wasm_application_execute_func(), here we don't output them again. */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -107,7 +107,6 @@ include_directories (.
|
|||
|
||||
enable_language (ASM)
|
||||
|
||||
include (../../runtime/platform/${PLATFORM}/platform.cmake)
|
||||
include (../../runtime/utils/utils.cmake)
|
||||
include (../../runtime/vmcore-wasm/vmcore.cmake)
|
||||
include (../../lib/native/libc/wasmtime-wasi-c/wasi.cmake)
|
||||
|
|
|
@ -87,12 +87,10 @@ app_instance_main(wasm_module_inst_t module_inst)
|
|||
static void*
|
||||
app_instance_func(wasm_module_inst_t module_inst, const char *func_name)
|
||||
{
|
||||
const char *exception;
|
||||
|
||||
wasm_application_execute_func(module_inst, func_name, app_argc - 1,
|
||||
app_argv + 1);
|
||||
if ((exception = wasm_runtime_get_exception(module_inst)))
|
||||
wasm_printf("%s\n", exception);
|
||||
/* The result of wasm function or exception info was output inside
|
||||
wasm_application_execute_func(), here we don't output them again. */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,6 @@ message ("-- Build as target ${BUILD_TARGET}")
|
|||
set (IWASM_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/iwasm)
|
||||
set (SHARED_LIB_ROOT ${IWASM_ROOT}/../shared-lib)
|
||||
|
||||
include (${IWASM_ROOT}/runtime/platform/${PLATFORM}/platform.cmake)
|
||||
include (${IWASM_ROOT}/runtime/utils/utils.cmake)
|
||||
include (${IWASM_ROOT}/runtime/vmcore-wasm/vmcore.cmake)
|
||||
include (${IWASM_ROOT}/lib/native/libc/wasmtime-wasi-c/wasi.cmake)
|
||||
|
@ -47,6 +46,8 @@ include (${SHARED_LIB_ROOT}/platform/${PLATFORM}/shared_platform.cmake)
|
|||
include (${SHARED_LIB_ROOT}/mem-alloc/mem_alloc.cmake)
|
||||
include (${SHARED_LIB_ROOT}/utils/shared_utils.cmake)
|
||||
|
||||
include_directories (${IWASM_ROOT}/runtime/platform/include)
|
||||
|
||||
set (VM_LIB_SRCS
|
||||
${WASM_PLATFORM_LIB_SOURCE}
|
||||
${WASM_UTILS_LIB_SOURCE}
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
*/
|
||||
|
||||
#include "wasm_native.h"
|
||||
|
||||
|
||||
void*
|
||||
wasm_platform_native_func_lookup(const char *module_name,
|
||||
const char *func_name)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
# Copyright (C) 2019 Intel Corporation. All rights reserved.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
add_definitions (-D__POSIX__ -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200809L)
|
||||
|
||||
set (PLATFORM_LIB_DIR ${CMAKE_CURRENT_LIST_DIR})
|
||||
|
||||
include_directories(${PLATFORM_LIB_DIR})
|
||||
include_directories(${PLATFORM_LIB_DIR}/../include)
|
||||
|
||||
file (GLOB_RECURSE source_all ${PLATFORM_LIB_DIR}/*.c)
|
||||
|
||||
set (WASM_PLATFORM_LIB_SOURCE ${source_all})
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
*/
|
||||
|
||||
#include "wasm_native.h"
|
||||
|
||||
void*
|
||||
wasm_platform_native_func_lookup(const char *module_name,
|
||||
const char *func_name)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
# Copyright (C) 2019 Intel Corporation. All rights reserved.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
add_definitions (-D__POSIX__ -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199309L)
|
||||
|
||||
set (PLATFORM_LIB_DIR ${CMAKE_CURRENT_LIST_DIR})
|
||||
|
||||
include_directories(${PLATFORM_LIB_DIR})
|
||||
include_directories(${PLATFORM_LIB_DIR}/../include)
|
||||
|
||||
file (GLOB_RECURSE source_all ${PLATFORM_LIB_DIR}/*.c)
|
||||
|
||||
set (WASM_PLATFORM_LIB_SOURCE ${source_all})
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
*/
|
||||
|
||||
#include "wasm_native.h"
|
||||
|
||||
|
||||
void*
|
||||
wasm_platform_native_func_lookup(const char *module_name,
|
||||
const char *func_name)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
# Copyright (C) 2019 Intel Corporation. All rights reserved.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
add_definitions (-D__POSIX__ -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200809L -D_BSD_SOURCE)
|
||||
|
||||
set (PLATFORM_LIB_DIR ${CMAKE_CURRENT_LIST_DIR})
|
||||
|
||||
include_directories(${PLATFORM_LIB_DIR})
|
||||
include_directories(${PLATFORM_LIB_DIR}/../include)
|
||||
|
||||
file (GLOB_RECURSE source_all ${PLATFORM_LIB_DIR}/*.c)
|
||||
|
||||
set (WASM_PLATFORM_LIB_SOURCE ${source_all})
|
||||
|
|
@ -1,365 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
*/
|
||||
|
||||
/**
|
||||
* Currently WAMR supports libc for WASM applications in two modes:
|
||||
* (1) the built-in libc subset for embedded environment and
|
||||
* (2) WASI for standard libc
|
||||
* so here the libc syscall mode is disabled by default, if developer
|
||||
* wants to enable the libc syscall mode, please set the following
|
||||
* macro to 1, and implements the related syscall wrappers. Here some
|
||||
* syscall wrapper examples are given.
|
||||
*/
|
||||
#define WASM_TEST_SYSCALL_WRAPPER 0
|
||||
|
||||
#if WASM_TEST_SYSCALL_WRAPPER == 0
|
||||
|
||||
#include "wasm_native.h"
|
||||
|
||||
void*
|
||||
wasm_platform_native_func_lookup(const char *module_name,
|
||||
const char *func_name)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#ifndef _GNU_SOURCE
|
||||
#define _GNU_SOURCE /* for O_DIRECT */
|
||||
#endif
|
||||
|
||||
#include "wasm_native.h"
|
||||
#include "wasm_runtime.h"
|
||||
#include "wasm_log.h"
|
||||
#include "wasm_memory.h"
|
||||
#include "wasm_platform_log.h"
|
||||
#include "bh_common.h"
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <pwd.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
#define validate_app_addr(offset, size) \
|
||||
wasm_runtime_validate_app_addr(module_inst, offset, size)
|
||||
|
||||
#define addr_app_to_native(offset) \
|
||||
wasm_runtime_addr_app_to_native(module_inst, offset)
|
||||
|
||||
#define addr_native_to_app(ptr) \
|
||||
wasm_runtime_addr_native_to_app(module_inst, ptr)
|
||||
|
||||
#define module_malloc(size) \
|
||||
wasm_runtime_module_malloc(module_inst, size)
|
||||
|
||||
#define module_free(offset) \
|
||||
wasm_runtime_module_free(module_inst, offset)
|
||||
|
||||
|
||||
static int32
|
||||
__syscall0_wrapper(WASMModuleInstance *module_inst, int32 arg0)
|
||||
{
|
||||
switch (arg0) {
|
||||
case 199: /* getuid */
|
||||
/* TODO */
|
||||
default:
|
||||
bh_printf("##_syscall0 called, syscall id: %d\n", arg0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int32
|
||||
__syscall1_wrapper(WASMModuleInstance *module_inst, int32 arg0, int32 arg1)
|
||||
{
|
||||
switch (arg0) {
|
||||
case 6: /* close */
|
||||
/* TODO */
|
||||
default:
|
||||
bh_printf("##_syscall1 called, syscall id: %d\n", arg0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int32
|
||||
__syscall2_wrapper(WASMModuleInstance *module_inst,
|
||||
int32 arg0, int32 arg1, int32 arg2)
|
||||
{
|
||||
switch (arg0) {
|
||||
case 183: /* getcwd */
|
||||
/* TODO */
|
||||
default:
|
||||
bh_printf("##_syscall2 called, syscall id: %d\n", arg0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int32
|
||||
__syscall3_wrapper(WASMModuleInstance *module_inst,
|
||||
int32 arg0, int32 arg1, int32 arg2, int32 arg3)
|
||||
{
|
||||
switch (arg0) {
|
||||
case 54: /* ioctl */
|
||||
{
|
||||
/* Implement syscall 54 and syscall 146 to support printf()
|
||||
for non SIDE_MODULE=1 mode */
|
||||
struct winsize *wsz;
|
||||
|
||||
if (!validate_app_addr(arg3, sizeof(struct winsize)))
|
||||
return 0;
|
||||
|
||||
wsz = (struct winsize*)addr_app_to_native(arg3);
|
||||
return (int32)syscall(54, arg1, arg2, wsz);
|
||||
}
|
||||
|
||||
case 146: /* writev */
|
||||
{
|
||||
/* Implement syscall 54 and syscall 146 to support printf()
|
||||
for non SIDE_MODULE=1 mode */
|
||||
struct iovec_app {
|
||||
int32 iov_base_offset;
|
||||
uint32 iov_len;
|
||||
} *vec;
|
||||
int32 vec_offset = arg2, str_offset;
|
||||
uint32 iov_count = (uint32)arg3, i;
|
||||
int32 count = 0;
|
||||
char *iov_base, *str;
|
||||
|
||||
if (!validate_app_addr(vec_offset, sizeof(struct iovec_app)))
|
||||
return 0;
|
||||
|
||||
vec = (struct iovec_app *)addr_app_to_native(vec_offset);
|
||||
for (i = 0; i < iov_count; i++, vec++) {
|
||||
if (vec->iov_len > 0) {
|
||||
if (!validate_app_addr(vec->iov_base_offset, 1))
|
||||
return 0;
|
||||
iov_base = (char*)addr_app_to_native(vec->iov_base_offset);
|
||||
|
||||
if (!(str_offset = module_malloc(vec->iov_len + 1)))
|
||||
return 0;
|
||||
|
||||
str = addr_app_to_native(str_offset);
|
||||
|
||||
bh_memcpy_s(str, vec->iov_len + 1, iov_base, vec->iov_len);
|
||||
str[vec->iov_len] = '\0';
|
||||
count += wasm_printf("%s", str);
|
||||
|
||||
module_free(str_offset);
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
case 145: /* readv */
|
||||
case 3: /* read*/
|
||||
case 5: /* open */
|
||||
case 221: /* fcntl */
|
||||
/* TODO */
|
||||
default:
|
||||
bh_printf("##_syscall3 called, syscall id: %d\n", arg0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int32
|
||||
__syscall4_wrapper(WASMModuleInstance *module_inst,
|
||||
int32 arg0, int32 arg1, int32 arg2,
|
||||
int32 arg3, int32 arg4)
|
||||
{
|
||||
bh_printf("##_syscall4 called, syscall id: %d\n", arg0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int32
|
||||
__syscall5_wrapper(WASMModuleInstance *module_inst,
|
||||
int32 arg0, int32 arg1, int32 arg2,
|
||||
int32 arg3, int32 arg4, int32 arg5)
|
||||
{
|
||||
switch (arg0) {
|
||||
case 140: /* llseek */
|
||||
/* TODO */
|
||||
default:
|
||||
bh_printf("##_syscall5 called, args[0]: %d\n", arg0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define GET_EMCC_SYSCALL_ARGS() \
|
||||
int32 *args; \
|
||||
if (!validate_app_addr(args_off, 1)) \
|
||||
return 0; \
|
||||
args = addr_app_to_native(args_off) \
|
||||
|
||||
#define EMCC_SYSCALL_WRAPPER0(id) \
|
||||
static int32 ___syscall##id##_wrapper(WASMModuleInstance *module_inst,\
|
||||
int32 _id) { \
|
||||
return __syscall0_wrapper(module_inst, id); \
|
||||
}
|
||||
|
||||
#define EMCC_SYSCALL_WRAPPER1(id) \
|
||||
static int32 ___syscall##id##_wrapper(WASMModuleInstance *module_inst,\
|
||||
int32 _id, int32 args_off) { \
|
||||
GET_EMCC_SYSCALL_ARGS(); \
|
||||
return __syscall1_wrapper(module_inst, id, args[0]); \
|
||||
}
|
||||
|
||||
#define EMCC_SYSCALL_WRAPPER2(id) \
|
||||
static int32 ___syscall##id##_wrapper(WASMModuleInstance *module_inst,\
|
||||
int32 _id, int32 args_off){ \
|
||||
GET_EMCC_SYSCALL_ARGS(); \
|
||||
return __syscall2_wrapper(module_inst, id, args[0], args[1]); \
|
||||
}
|
||||
|
||||
#define EMCC_SYSCALL_WRAPPER3(id) \
|
||||
static int32 ___syscall##id##_wrapper(WASMModuleInstance *module_inst,\
|
||||
int32 _id, int32 args_off) { \
|
||||
GET_EMCC_SYSCALL_ARGS(); \
|
||||
return __syscall3_wrapper(module_inst, id, \
|
||||
args[0], args[1], args[2]); \
|
||||
}
|
||||
|
||||
#define EMCC_SYSCALL_WRAPPER4(id) \
|
||||
static int32 ___syscall##id##_wrapper(WASMModuleInstance *module_inst,\
|
||||
int32 _id, int32 args_off) { \
|
||||
GET_EMCC_SYSCALL_ARGS(); \
|
||||
return __syscall4_wrapper(module_inst, id, \
|
||||
args[0], args[1], args[2], args[3]); \
|
||||
}
|
||||
|
||||
#define EMCC_SYSCALL_WRAPPER5(id) \
|
||||
static int32 ___syscall##id##_wrapper(WASMModuleInstance *module_inst,\
|
||||
int32 _id, int32 args_off) { \
|
||||
GET_EMCC_SYSCALL_ARGS(); \
|
||||
return __syscall5_wrapper(module_inst, id, \
|
||||
args[0], args[1], args[2], \
|
||||
args[3], args[4]); \
|
||||
}
|
||||
|
||||
EMCC_SYSCALL_WRAPPER0(199)
|
||||
|
||||
EMCC_SYSCALL_WRAPPER1(6)
|
||||
|
||||
EMCC_SYSCALL_WRAPPER2(183)
|
||||
|
||||
EMCC_SYSCALL_WRAPPER3(3)
|
||||
EMCC_SYSCALL_WRAPPER3(5)
|
||||
EMCC_SYSCALL_WRAPPER3(54)
|
||||
EMCC_SYSCALL_WRAPPER3(145)
|
||||
EMCC_SYSCALL_WRAPPER3(146)
|
||||
EMCC_SYSCALL_WRAPPER3(221)
|
||||
|
||||
EMCC_SYSCALL_WRAPPER5(140)
|
||||
|
||||
static uint32
|
||||
getTotalMemory_wrapper(WASMModuleInstance *module_inst)
|
||||
{
|
||||
WASMMemoryInstance *memory = module_inst->default_memory;
|
||||
return NumBytesPerPage * memory->cur_page_count;
|
||||
}
|
||||
|
||||
static int32
|
||||
enlargeMemory_wrapper(WASMModuleInstance *module_inst)
|
||||
{
|
||||
bool ret;
|
||||
WASMMemoryInstance *memory = module_inst->default_memory;
|
||||
uint32 DYNAMICTOP_PTR_offset = module_inst->DYNAMICTOP_PTR_offset;
|
||||
uint32 addr_data_offset = *(uint32*)(memory->global_data + DYNAMICTOP_PTR_offset);
|
||||
uint32 *DYNAMICTOP_PTR = (uint32*)(memory->memory_data + addr_data_offset);
|
||||
uint32 memory_size_expected = *DYNAMICTOP_PTR;
|
||||
uint32 total_page_count = (memory_size_expected + NumBytesPerPage - 1) / NumBytesPerPage;
|
||||
|
||||
if (total_page_count < memory->cur_page_count) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
ret = wasm_runtime_enlarge_memory(module_inst, total_page_count -
|
||||
memory->cur_page_count);
|
||||
return ret ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_abort_wrapper(WASMModuleInstance *module_inst, int32 code)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
snprintf(buf, sizeof(buf), "env.abort(%i)", code);
|
||||
wasm_runtime_set_exception(module_inst, buf);
|
||||
}
|
||||
|
||||
static void
|
||||
abortOnCannotGrowMemory_wrapper(WASMModuleInstance *module_inst)
|
||||
{
|
||||
wasm_runtime_set_exception(module_inst, "abort on cannot grow memory");
|
||||
}
|
||||
|
||||
static void
|
||||
___setErrNo_wrapper(WASMModuleInstance *module_inst, int32 error_no)
|
||||
{
|
||||
errno = error_no;
|
||||
}
|
||||
|
||||
/* TODO: add function parameter/result types check */
|
||||
#define REG_NATIVE_FUNC(module_name, func_name) \
|
||||
{#module_name, #func_name, func_name##_wrapper}
|
||||
|
||||
typedef struct WASMNativeFuncDef {
|
||||
const char *module_name;
|
||||
const char *func_name;
|
||||
void *func_ptr;
|
||||
} WASMNativeFuncDef;
|
||||
|
||||
static WASMNativeFuncDef native_func_defs[] = {
|
||||
REG_NATIVE_FUNC(env, __syscall0),
|
||||
REG_NATIVE_FUNC(env, __syscall1),
|
||||
REG_NATIVE_FUNC(env, __syscall2),
|
||||
REG_NATIVE_FUNC(env, __syscall3),
|
||||
REG_NATIVE_FUNC(env, __syscall4),
|
||||
REG_NATIVE_FUNC(env, __syscall5),
|
||||
REG_NATIVE_FUNC(env, ___syscall3),
|
||||
REG_NATIVE_FUNC(env, ___syscall5),
|
||||
REG_NATIVE_FUNC(env, ___syscall6),
|
||||
REG_NATIVE_FUNC(env, ___syscall54),
|
||||
REG_NATIVE_FUNC(env, ___syscall140),
|
||||
REG_NATIVE_FUNC(env, ___syscall145),
|
||||
REG_NATIVE_FUNC(env, ___syscall146),
|
||||
REG_NATIVE_FUNC(env, ___syscall183),
|
||||
REG_NATIVE_FUNC(env, ___syscall199),
|
||||
REG_NATIVE_FUNC(env, ___syscall221),
|
||||
REG_NATIVE_FUNC(env, _abort),
|
||||
REG_NATIVE_FUNC(env, abortOnCannotGrowMemory),
|
||||
REG_NATIVE_FUNC(env, enlargeMemory),
|
||||
REG_NATIVE_FUNC(env, getTotalMemory),
|
||||
REG_NATIVE_FUNC(env, ___setErrNo),
|
||||
};
|
||||
|
||||
void*
|
||||
wasm_platform_native_func_lookup(const char *module_name,
|
||||
const char *func_name)
|
||||
{
|
||||
uint32 size = sizeof(native_func_defs) / sizeof(WASMNativeFuncDef);
|
||||
WASMNativeFuncDef *func_def = native_func_defs;
|
||||
WASMNativeFuncDef *func_def_end = func_def + size;
|
||||
|
||||
if (!module_name || !func_name)
|
||||
return NULL;
|
||||
|
||||
while (func_def < func_def_end) {
|
||||
if (!strcmp(func_def->module_name, module_name)
|
||||
&& !strcmp(func_def->func_name, func_name))
|
||||
return (void*)(uintptr_t)func_def->func_ptr;
|
||||
func_def++;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif /* end of WASM_TEST_SYSCALL_WRAPPER */
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
# Copyright (C) 2019 Intel Corporation. All rights reserved.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
add_definitions (-D__POSIX__ -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200809L -D_BSD_SOURCE)
|
||||
|
||||
set (PLATFORM_LIB_DIR ${CMAKE_CURRENT_LIST_DIR})
|
||||
|
||||
include_directories(${PLATFORM_LIB_DIR})
|
||||
include_directories(${PLATFORM_LIB_DIR}/../include)
|
||||
|
||||
file (GLOB_RECURSE source_all ${PLATFORM_LIB_DIR}/*.c)
|
||||
|
||||
set (WASM_PLATFORM_LIB_SOURCE ${source_all})
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
*/
|
||||
|
||||
#include "wasm_native.h"
|
||||
|
||||
|
||||
void*
|
||||
wasm_platform_native_func_lookup(const char *module_name,
|
||||
const char *func_name)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
# Copyright (C) 2019 Intel Corporation. All rights reserved.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
add_definitions (-D__POSIX__ -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200809L -D_BSD_SOURCE)
|
||||
|
||||
set (PLATFORM_LIB_DIR ${CMAKE_CURRENT_LIST_DIR})
|
||||
|
||||
include_directories(${PLATFORM_LIB_DIR})
|
||||
include_directories(${PLATFORM_LIB_DIR}/../include)
|
||||
|
||||
file (GLOB_RECURSE source_all ${PLATFORM_LIB_DIR}/*.c)
|
||||
|
||||
set (WASM_PLATFORM_LIB_SOURCE ${source_all})
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
*/
|
||||
|
||||
#include "wasm_native.h"
|
||||
|
||||
|
||||
void*
|
||||
wasm_platform_native_func_lookup(const char *module_name,
|
||||
const char *func_name)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -146,7 +146,6 @@ typedef struct WASMGlobalImport {
|
|||
char *field_name;
|
||||
uint8 type;
|
||||
bool is_mutable;
|
||||
bool is_addr;
|
||||
/* global data after linked */
|
||||
WASMValue global_data_linked;
|
||||
} WASMGlobalImport;
|
||||
|
@ -179,7 +178,6 @@ typedef struct WASMFunction {
|
|||
typedef struct WASMGlobal {
|
||||
uint8 type;
|
||||
bool is_mutable;
|
||||
bool is_addr;
|
||||
InitializerExpression init_expr;
|
||||
} WASMGlobal;
|
||||
|
||||
|
|
|
@ -214,7 +214,7 @@ wasm_application_execute_func(WASMModuleInstance *module_inst,
|
|||
{
|
||||
WASMFunctionInstance *func;
|
||||
WASMType *type;
|
||||
uint32 argc1, *argv1;
|
||||
uint32 argc1, *argv1 = NULL;
|
||||
int32 i, p;
|
||||
uint64 total_size;
|
||||
const char *exception;
|
||||
|
@ -225,14 +225,14 @@ wasm_application_execute_func(WASMModuleInstance *module_inst,
|
|||
if (!func || func->is_import_func) {
|
||||
snprintf(buf, sizeof(buf), "lookup function %s failed.", name);
|
||||
wasm_runtime_set_exception(module_inst, buf);
|
||||
return false;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
type = func->u.func->func_type;
|
||||
if (type->param_count != (uint32)argc) {
|
||||
wasm_runtime_set_exception(module_inst,
|
||||
"invalid input argument count.");
|
||||
return false;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
argc1 = func->param_cell_num;
|
||||
|
@ -240,9 +240,12 @@ wasm_application_execute_func(WASMModuleInstance *module_inst,
|
|||
if (total_size >= UINT32_MAX
|
||||
|| (!(argv1 = wasm_malloc((uint32)total_size)))) {
|
||||
wasm_runtime_set_exception(module_inst, "allocate memory failed.");
|
||||
return false;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Clear errno before parsing arguments */
|
||||
errno = 0;
|
||||
|
||||
/* Parse arguments */
|
||||
for (i = 0, p = 0; i < argc; i++) {
|
||||
char *endptr = NULL;
|
||||
|
@ -332,9 +335,6 @@ wasm_application_execute_func(WASMModuleInstance *module_inst,
|
|||
|
||||
wasm_runtime_set_exception(module_inst, NULL);
|
||||
if (!wasm_runtime_call_wasm(module_inst, NULL, func, argc1, argv1)) {
|
||||
exception = wasm_runtime_get_exception(module_inst);
|
||||
wasm_assert(exception);
|
||||
wasm_printf("%s\n", exception);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
@ -374,7 +374,12 @@ wasm_application_execute_func(WASMModuleInstance *module_inst,
|
|||
return true;
|
||||
|
||||
fail:
|
||||
wasm_free(argv1);
|
||||
if (argv1)
|
||||
wasm_free(argv1);
|
||||
|
||||
exception = wasm_runtime_get_exception(module_inst);
|
||||
wasm_assert(exception);
|
||||
wasm_printf("%s\n", exception);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -84,15 +84,15 @@ GET_F64_FROM_ADDR (uint32 *addr)
|
|||
uintptr_t addr1 = (uintptr_t)(addr); \
|
||||
union { int64 val; uint32 u32[2]; \
|
||||
uint16 u16[4]; uint8 u8[8]; } u; \
|
||||
if (addr1 % 8 == 0) \
|
||||
if ((addr1 & (uintptr_t)7) == 0) \
|
||||
*(int64*)(addr) = (int64)(value); \
|
||||
else { \
|
||||
u.val = (int64)(value); \
|
||||
if (addr1 % 4 == 0) { \
|
||||
if ((addr1 & (uintptr_t)3) == 0) { \
|
||||
((uint32*)(addr))[0] = u.u32[0]; \
|
||||
((uint32*)(addr))[1] = u.u32[1]; \
|
||||
} \
|
||||
else if (addr1 % 2 == 0) { \
|
||||
else if ((addr1 & (uintptr_t)1) == 0) { \
|
||||
((uint16*)(addr))[0] = u.u16[0]; \
|
||||
((uint16*)(addr))[1] = u.u16[1]; \
|
||||
((uint16*)(addr))[2] = u.u16[2]; \
|
||||
|
@ -110,11 +110,11 @@ GET_F64_FROM_ADDR (uint32 *addr)
|
|||
uintptr_t addr1 = (uintptr_t)(addr); \
|
||||
union { uint32 val; \
|
||||
uint16 u16[2]; uint8 u8[4]; } u; \
|
||||
if (addr1 % 4 == 0) \
|
||||
if ((addr1 & (uintptr_t)3) == 0) \
|
||||
*(uint32*)(addr) = (uint32)(value); \
|
||||
else { \
|
||||
u.val = (uint32)(value); \
|
||||
if (addr1 % 2 == 0) { \
|
||||
if ((addr1 & (uintptr_t)1) == 0) { \
|
||||
((uint16*)(addr))[0] = u.u16[0]; \
|
||||
((uint16*)(addr))[1] = u.u16[1]; \
|
||||
} \
|
||||
|
@ -141,14 +141,14 @@ LOAD_I64(void *addr)
|
|||
uintptr_t addr1 = (uintptr_t)addr;
|
||||
union { int64 val; uint32 u32[2];
|
||||
uint16 u16[4]; uint8 u8[8]; } u;
|
||||
if (addr1 % 8 == 0)
|
||||
if ((addr1 & (uintptr_t)7) == 0)
|
||||
return *(int64*)addr;
|
||||
|
||||
if (addr1 % 4 == 0) {
|
||||
if ((addr1 & (uintptr_t)3) == 0) {
|
||||
u.u32[0] = ((uint32*)addr)[0];
|
||||
u.u32[1] = ((uint32*)addr)[1];
|
||||
}
|
||||
else if (addr1 % 2 == 0) {
|
||||
else if ((addr1 & (uintptr_t)1) == 0) {
|
||||
u.u16[0] = ((uint16*)addr)[0];
|
||||
u.u16[1] = ((uint16*)addr)[1];
|
||||
u.u16[2] = ((uint16*)addr)[2];
|
||||
|
@ -168,14 +168,14 @@ LOAD_F64(void *addr)
|
|||
uintptr_t addr1 = (uintptr_t)addr;
|
||||
union { float64 val; uint32 u32[2];
|
||||
uint16 u16[4]; uint8 u8[8]; } u;
|
||||
if (addr1 % 8 == 0)
|
||||
if ((addr1 & (uintptr_t)7) == 0)
|
||||
return *(float64*)addr;
|
||||
|
||||
if (addr1 % 4 == 0) {
|
||||
if ((addr1 & (uintptr_t)3) == 0) {
|
||||
u.u32[0] = ((uint32*)addr)[0];
|
||||
u.u32[1] = ((uint32*)addr)[1];
|
||||
}
|
||||
else if (addr1 % 2 == 0) {
|
||||
else if ((addr1 & (uintptr_t)1) == 0) {
|
||||
u.u16[0] = ((uint16*)addr)[0];
|
||||
u.u16[1] = ((uint16*)addr)[1];
|
||||
u.u16[2] = ((uint16*)addr)[2];
|
||||
|
@ -194,10 +194,10 @@ LOAD_I32(void *addr)
|
|||
{
|
||||
uintptr_t addr1 = (uintptr_t)addr;
|
||||
union { int32 val; uint16 u16[2]; uint8 u8[4]; } u;
|
||||
if (addr1 % 4 == 0)
|
||||
if ((addr1 & (uintptr_t)3) == 0)
|
||||
return *(int32*)addr;
|
||||
|
||||
if (addr1 % 2 == 0) {
|
||||
if ((addr1 & (uintptr_t)1) == 0) {
|
||||
u.u16[0] = ((uint16*)addr)[0];
|
||||
u.u16[1] = ((uint16*)addr)[1];
|
||||
}
|
||||
|
|
|
@ -256,25 +256,25 @@ load_init_expr(const uint8 **p_buf, const uint8 *buf_end,
|
|||
case INIT_EXPR_TYPE_I32_CONST:
|
||||
read_leb_int32(p, p_end, init_expr->u.i32);
|
||||
break;
|
||||
/* i64.const */
|
||||
/* i64.const */
|
||||
case INIT_EXPR_TYPE_I64_CONST:
|
||||
read_leb_int64(p, p_end, init_expr->u.i64);
|
||||
break;
|
||||
/* f32.const */
|
||||
/* f32.const */
|
||||
case INIT_EXPR_TYPE_F32_CONST:
|
||||
CHECK_BUF(p, p_end, 4);
|
||||
p_float = (uint8*)&init_expr->u.f32;
|
||||
for (i = 0; i < sizeof(float32); i++)
|
||||
*p_float++ = *p++;
|
||||
break;
|
||||
/* f64.const */
|
||||
/* f64.const */
|
||||
case INIT_EXPR_TYPE_F64_CONST:
|
||||
CHECK_BUF(p, p_end, 8);
|
||||
p_float = (uint8*)&init_expr->u.f64;
|
||||
for (i = 0; i < sizeof(float64); i++)
|
||||
*p_float++ = *p++;
|
||||
break;
|
||||
/* get_global */
|
||||
/* get_global */
|
||||
case INIT_EXPR_TYPE_GET_GLOBAL:
|
||||
read_leb_uint32(p, p_end, init_expr->u.global_index);
|
||||
break;
|
||||
|
|
|
@ -45,9 +45,6 @@ bool
|
|||
wasm_native_global_lookup(const char *module_name, const char *global_name,
|
||||
WASMGlobalImport *global);
|
||||
|
||||
void* wasm_platform_native_func_lookup(const char *module_name,
|
||||
const char *func_name);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -167,14 +167,14 @@ memories_deinstantiate(WASMMemoryInstance **memories, uint32 count)
|
|||
|
||||
static WASMMemoryInstance*
|
||||
memory_instantiate(uint32 init_page_count, uint32 max_page_count,
|
||||
uint32 addr_data_size, uint32 global_data_size,
|
||||
uint32 global_data_size,
|
||||
uint32 heap_size,
|
||||
char *error_buf, uint32 error_buf_size)
|
||||
{
|
||||
WASMMemoryInstance *memory;
|
||||
uint64 total_size = offsetof(WASMMemoryInstance, base_addr) +
|
||||
NumBytesPerPage * (uint64)init_page_count +
|
||||
addr_data_size + global_data_size;
|
||||
global_data_size;
|
||||
|
||||
/* Allocate memory space, addr data and global data */
|
||||
if (total_size >= UINT32_MAX
|
||||
|
@ -188,10 +188,7 @@ memory_instantiate(uint32 init_page_count, uint32 max_page_count,
|
|||
memory->cur_page_count = init_page_count;
|
||||
memory->max_page_count = max_page_count;
|
||||
|
||||
memory->addr_data = memory->base_addr;
|
||||
memory->addr_data_size = addr_data_size;
|
||||
|
||||
memory->memory_data = memory->addr_data + addr_data_size;
|
||||
memory->memory_data = memory->base_addr;
|
||||
|
||||
memory->global_data = memory->memory_data +
|
||||
NumBytesPerPage * memory->cur_page_count;;
|
||||
|
@ -233,7 +230,7 @@ fail1:
|
|||
* Instantiate memories in a module.
|
||||
*/
|
||||
static WASMMemoryInstance**
|
||||
memories_instantiate(const WASMModule *module, uint32 addr_data_size,
|
||||
memories_instantiate(const WASMModule *module,
|
||||
uint32 global_data_size, uint32 heap_size,
|
||||
char *error_buf, uint32 error_buf_size)
|
||||
{
|
||||
|
@ -264,7 +261,7 @@ memories_instantiate(const WASMModule *module, uint32 addr_data_size,
|
|||
if (!(memory = memories[mem_index++] =
|
||||
memory_instantiate(import->u.memory.init_page_count,
|
||||
import->u.memory. max_page_count,
|
||||
addr_data_size, global_data_size,
|
||||
global_data_size,
|
||||
heap_size, error_buf, error_buf_size))) {
|
||||
set_error_buf(error_buf, error_buf_size,
|
||||
"Instantiate memory failed: "
|
||||
|
@ -279,7 +276,7 @@ memories_instantiate(const WASMModule *module, uint32 addr_data_size,
|
|||
if (!(memory = memories[mem_index++] =
|
||||
memory_instantiate(module->memories[i].init_page_count,
|
||||
module->memories[i].max_page_count,
|
||||
addr_data_size, global_data_size,
|
||||
global_data_size,
|
||||
heap_size, error_buf, error_buf_size))) {
|
||||
set_error_buf(error_buf, error_buf_size,
|
||||
"Instantiate memory failed: "
|
||||
|
@ -292,7 +289,7 @@ memories_instantiate(const WASMModule *module, uint32 addr_data_size,
|
|||
if (mem_index == 0) {
|
||||
/* no import memory and define memory, but has global variables */
|
||||
if (!(memory = memories[mem_index++] =
|
||||
memory_instantiate(0, 0, addr_data_size, global_data_size,
|
||||
memory_instantiate(0, 0, global_data_size,
|
||||
heap_size, error_buf, error_buf_size))) {
|
||||
set_error_buf(error_buf, error_buf_size,
|
||||
"Instantiate memory failed: "
|
||||
|
@ -525,12 +522,11 @@ globals_deinstantiate(WASMGlobalInstance *globals)
|
|||
*/
|
||||
static WASMGlobalInstance*
|
||||
globals_instantiate(const WASMModule *module,
|
||||
uint32 *p_addr_data_size,
|
||||
uint32 *p_global_data_size,
|
||||
char *error_buf, uint32 error_buf_size)
|
||||
{
|
||||
WASMImport *import;
|
||||
uint32 addr_data_offset = 0, global_data_offset = 0;
|
||||
uint32 global_data_offset = 0;
|
||||
uint32 i, global_count =
|
||||
module->import_global_count + module->global_count;
|
||||
uint64 total_size = sizeof(WASMGlobalInstance) * (uint64)global_count;
|
||||
|
@ -553,14 +549,10 @@ globals_instantiate(const WASMModule *module,
|
|||
WASMGlobalImport *global_import = &import->u.global;
|
||||
global->type = global_import->type;
|
||||
global->is_mutable = global_import->is_mutable;
|
||||
global->is_addr = global_import->is_addr;
|
||||
global->initial_value = global_import->global_data_linked;
|
||||
global->data_offset = global_data_offset;
|
||||
global_data_offset += wasm_value_type_size(global->type);
|
||||
|
||||
if (global->is_addr)
|
||||
addr_data_offset += (uint32)sizeof(uint32);
|
||||
|
||||
global++;
|
||||
}
|
||||
|
||||
|
@ -568,19 +560,14 @@ globals_instantiate(const WASMModule *module,
|
|||
for (i = 0; i < module->global_count; i++) {
|
||||
global->type = module->globals[i].type;
|
||||
global->is_mutable = module->globals[i].is_mutable;
|
||||
global->is_addr = module->globals[i].is_addr;
|
||||
|
||||
global->data_offset = global_data_offset;
|
||||
global_data_offset += wasm_value_type_size(global->type);
|
||||
|
||||
if (global->is_addr)
|
||||
addr_data_offset += (uint32)sizeof(uint32);
|
||||
|
||||
global++;
|
||||
}
|
||||
|
||||
wasm_assert((uint32)(global - globals) == global_count);
|
||||
*p_addr_data_size = addr_data_offset;
|
||||
*p_global_data_size = global_data_offset;
|
||||
return globals;
|
||||
}
|
||||
|
@ -949,9 +936,9 @@ wasm_runtime_instantiate(WASMModule *module,
|
|||
WASMTableSeg *table_seg;
|
||||
WASMDataSeg *data_seg;
|
||||
WASMGlobalInstance *globals = NULL, *global;
|
||||
uint32 global_count, addr_data_size = 0, global_data_size = 0, i, j;
|
||||
uint32 global_count, global_data_size = 0, i, j;
|
||||
uint32 base_offset, length, memory_size;
|
||||
uint8 *global_data, *global_data_end, *addr_data, *addr_data_end;
|
||||
uint8 *global_data, *global_data_end;
|
||||
uint8 *memory_data;
|
||||
uint32 *table_data;
|
||||
|
||||
|
@ -970,7 +957,7 @@ wasm_runtime_instantiate(WASMModule *module,
|
|||
/* Instantiate global firstly to get the mutable data size */
|
||||
global_count = module->import_global_count + module->global_count;
|
||||
if (global_count &&
|
||||
!(globals = globals_instantiate(module, &addr_data_size,
|
||||
!(globals = globals_instantiate(module,
|
||||
&global_data_size,
|
||||
error_buf, error_buf_size)))
|
||||
return NULL;
|
||||
|
@ -998,7 +985,7 @@ wasm_runtime_instantiate(WASMModule *module,
|
|||
/* Instantiate memories/tables/functions */
|
||||
if (((module_inst->memory_count > 0 || global_count > 0)
|
||||
&& !(module_inst->memories =
|
||||
memories_instantiate(module, addr_data_size, global_data_size,
|
||||
memories_instantiate(module, global_data_size,
|
||||
heap_size, error_buf, error_buf_size)))
|
||||
|| (module_inst->table_count > 0
|
||||
&& !(module_inst->tables = tables_instantiate(module,
|
||||
|
@ -1026,8 +1013,6 @@ wasm_runtime_instantiate(WASMModule *module,
|
|||
globals_instantiate_fix(globals, module, module_inst);
|
||||
|
||||
/* Initialize the global data */
|
||||
addr_data = memory->addr_data;
|
||||
addr_data_end = addr_data + addr_data_size;
|
||||
global_data = memory->global_data;
|
||||
global_data_end = global_data + global_data_size;
|
||||
global = globals;
|
||||
|
@ -1035,19 +1020,11 @@ wasm_runtime_instantiate(WASMModule *module,
|
|||
switch (global->type) {
|
||||
case VALUE_TYPE_I32:
|
||||
case VALUE_TYPE_F32:
|
||||
if (!global->is_addr)
|
||||
*(int32*)global_data = global->initial_value.i32;
|
||||
else {
|
||||
*(int32*)addr_data = global->initial_value.i32;
|
||||
/* Store the offset to memory data for global of addr */
|
||||
*(int32*)global_data = (int32)(addr_data - memory_data);
|
||||
addr_data += sizeof(int32);
|
||||
}
|
||||
*(int32*)global_data = global->initial_value.i32;
|
||||
global_data += sizeof(int32);
|
||||
break;
|
||||
case VALUE_TYPE_I64:
|
||||
case VALUE_TYPE_F64:
|
||||
wasm_assert(!global->is_addr);
|
||||
bh_memcpy_s(global_data, (uint32)(global_data_end - global_data),
|
||||
&global->initial_value.i64, sizeof(int64));
|
||||
global_data += sizeof(int64);
|
||||
|
@ -1056,22 +1033,8 @@ wasm_runtime_instantiate(WASMModule *module,
|
|||
wasm_assert(0);
|
||||
}
|
||||
}
|
||||
wasm_assert(addr_data == addr_data_end);
|
||||
wasm_assert(global_data == global_data_end);
|
||||
|
||||
global = globals + module->import_global_count;
|
||||
for (i = 0; i < module->global_count; i++, global++) {
|
||||
InitializerExpression *init_expr = &module->globals[i].init_expr;
|
||||
|
||||
if (init_expr->init_expr_type == INIT_EXPR_TYPE_GET_GLOBAL
|
||||
&& globals[init_expr->u.global_index].is_addr) {
|
||||
uint8 *global_data_dst = memory->global_data + global->data_offset;
|
||||
uint8 *global_data_src =
|
||||
memory->global_data + globals[init_expr->u.global_index].data_offset;
|
||||
*(uintptr_t*)global_data_dst = *(uintptr_t*)global_data_src;
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialize the memory data with data segment section */
|
||||
if (module_inst->default_memory->cur_page_count > 0) {
|
||||
for (i = 0; i < module->data_seg_count; i++) {
|
||||
|
@ -1200,7 +1163,6 @@ wasm_runtime_instantiate(WASMModule *module,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
(void)addr_data_end;
|
||||
(void)global_data_end;
|
||||
return module_inst;
|
||||
}
|
||||
|
@ -1272,7 +1234,6 @@ wasm_runtime_enlarge_memory(WASMModuleInstance *module, uint32 inc_page_count)
|
|||
WASMMemoryInstance *new_memory;
|
||||
uint32 total_page_count = inc_page_count + memory->cur_page_count;
|
||||
uint64 total_size = offsetof(WASMMemoryInstance, base_addr) +
|
||||
memory->addr_data_size +
|
||||
NumBytesPerPage * (uint64)total_page_count +
|
||||
memory->global_data_size;
|
||||
|
||||
|
@ -1295,10 +1256,7 @@ wasm_runtime_enlarge_memory(WASMModuleInstance *module, uint32 inc_page_count)
|
|||
new_memory->cur_page_count = total_page_count;
|
||||
new_memory->max_page_count = memory->max_page_count;
|
||||
|
||||
new_memory->addr_data = new_memory->base_addr;
|
||||
new_memory->addr_data_size = memory->addr_data_size;
|
||||
|
||||
new_memory->memory_data = new_memory->addr_data + new_memory->addr_data_size;
|
||||
new_memory->memory_data = new_memory->base_addr;
|
||||
|
||||
new_memory->global_data = new_memory->memory_data +
|
||||
NumBytesPerPage * total_page_count;
|
||||
|
@ -1306,11 +1264,11 @@ wasm_runtime_enlarge_memory(WASMModuleInstance *module, uint32 inc_page_count)
|
|||
|
||||
new_memory->end_addr = new_memory->global_data + memory->global_data_size;
|
||||
|
||||
/* Copy addr data and memory data */
|
||||
bh_memcpy_s(new_memory->addr_data,
|
||||
(uint32)(memory->global_data - memory->addr_data),
|
||||
memory->addr_data,
|
||||
(uint32)(memory->global_data - memory->addr_data));
|
||||
/* Copy memory data */
|
||||
bh_memcpy_s(new_memory->memory_data,
|
||||
(uint32)(memory->global_data - memory->memory_data),
|
||||
memory->memory_data,
|
||||
(uint32)(memory->global_data - memory->memory_data));
|
||||
/* Copy global data */
|
||||
bh_memcpy_s(new_memory->global_data, new_memory->global_data_size,
|
||||
memory->global_data, memory->global_data_size);
|
||||
|
|
|
@ -23,12 +23,6 @@ typedef struct WASMMemoryInstance {
|
|||
uint32 cur_page_count;
|
||||
/* Maximum page count */
|
||||
uint32 max_page_count;
|
||||
/* Data of import globals with address info, like _stdin/_stdout/_stderr,
|
||||
stdin/stdout/stderr is stored here, but the actual addr info, or offset
|
||||
to memory_data is stored in global_data section */
|
||||
uint8 *addr_data;
|
||||
/* Size of addr_data */
|
||||
uint32 addr_data_size;
|
||||
|
||||
/* Heap data base address */
|
||||
uint8 *heap_data;
|
||||
|
@ -49,11 +43,11 @@ typedef struct WASMMemoryInstance {
|
|||
uint8 *end_addr;
|
||||
|
||||
/* Base address, the layout is:
|
||||
addr_data + thunk_argv data + thunk arg offsets +
|
||||
thunk_argv data + thunk arg offsets +
|
||||
memory data + global data
|
||||
memory data init size is: NumBytesPerPage * cur_page_count
|
||||
addr data size and global data size is calculated in module instantiating
|
||||
Note: when memory is re-allocated, the addr data, thunk argv data, thunk
|
||||
global data size is calculated in module instantiating
|
||||
Note: when memory is re-allocated, the thunk argv data, thunk
|
||||
argv offsets and memory data must be copied to new memory also.
|
||||
*/
|
||||
uint8 base_addr[1];
|
||||
|
@ -75,7 +69,6 @@ typedef struct WASMGlobalInstance {
|
|||
uint8 type;
|
||||
/* mutable or constant */
|
||||
bool is_mutable;
|
||||
bool is_addr;
|
||||
/* data offset to base_addr of WASMMemoryInstance */
|
||||
uint32 data_offset;
|
||||
/* initial value */
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
|
||||
#ifndef _CONFIG_H_
|
||||
#define _CONFIG_H_
|
||||
|
||||
#if !defined(BUILD_TARGET_X86_64) \
|
||||
&& !defined(BUILD_TARGET_AMD_64) \
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <limits.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* Platform name */
|
||||
|
|
|
@ -115,6 +115,11 @@ double trunc(double x);
|
|||
int signbit(double x);
|
||||
int isnan(double x);
|
||||
|
||||
unsigned long long int strtoull(const char *nptr, char **endptr,
|
||||
int base);
|
||||
double strtod(const char *nptr, char **endptr);
|
||||
float strtof(const char *nptr, char **endptr);
|
||||
|
||||
int bh_platform_init();
|
||||
|
||||
#endif
|
||||
|
|
|
@ -27,7 +27,7 @@ static int char_out(int c, struct out_context *ctx)
|
|||
static int bh_vprintk(const char *fmt, va_list ap)
|
||||
{
|
||||
struct out_context ctx = { 0 };
|
||||
_vprintk((out_func_t) char_out, &ctx, fmt, ap);
|
||||
z_vprintk((out_func_t) char_out, &ctx, fmt, ap);
|
||||
return ctx.count;
|
||||
}
|
||||
|
||||
|
|
|
@ -83,7 +83,6 @@ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections -Wall -
|
|||
|
||||
enable_language (ASM)
|
||||
|
||||
include (${WASM_DIR}/runtime/platform/${TARGET_PLATFORM}/platform.cmake)
|
||||
include (${WASM_DIR}/runtime/utils/utils.cmake)
|
||||
include (${WASM_DIR}/runtime/vmcore-wasm/vmcore.cmake)
|
||||
include (${WASM_DIR}/lib/native/base/wasm_lib_base.cmake)
|
||||
|
@ -103,6 +102,7 @@ include (${SHARED_DIR}/coap/lib_coap.cmake)
|
|||
set (PROJECT_SRC_DIR ${CMAKE_CURRENT_LIST_DIR}/../src/platform/${TARGET_PLATFORM})
|
||||
|
||||
include_directories(${SHARED_DIR}/include)
|
||||
include_directories(${WASM_DIR}/runtime/platform/include)
|
||||
include_directories(${PROJECT_SRC_DIR})
|
||||
|
||||
add_definitions (-DWASM_ENABLE_BASE_LIB)
|
||||
|
|
|
@ -51,7 +51,6 @@ set (SHARED_DIR ${WASM_DIR}/../shared-lib)
|
|||
|
||||
set (TARGET_PLATFORM "zephyr")
|
||||
|
||||
include (${WASM_DIR}/runtime/platform/${TARGET_PLATFORM}/platform.cmake)
|
||||
include (${WASM_DIR}/runtime/utils/utils.cmake)
|
||||
include (${WASM_DIR}/runtime/vmcore-wasm/vmcore.cmake)
|
||||
include (${WASM_DIR}/lib/native/base/wasm_lib_base.cmake)
|
||||
|
@ -68,6 +67,7 @@ include (${SHARED_DIR}/utils/shared_utils.cmake)
|
|||
include (${SHARED_DIR}/mem-alloc/mem_alloc.cmake)
|
||||
include (${SHARED_DIR}/coap/lib_coap.cmake)
|
||||
|
||||
include_directories(${WASM_DIR}/runtime/platform/include)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../src)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../src/platform/zephyr)
|
||||
|
||||
|
|
|
@ -78,7 +78,6 @@ set(SHARED_DIR ${REPO_ROOT_DIR}/core/shared-lib)
|
|||
|
||||
enable_language (ASM)
|
||||
|
||||
include (${WASM_DIR}/runtime/platform/${TARGET_PLATFORM}/platform.cmake)
|
||||
include (${WASM_DIR}/runtime/utils/utils.cmake)
|
||||
include (${WASM_DIR}/runtime/vmcore-wasm/vmcore.cmake)
|
||||
include (${WASM_DIR}/lib/native/base/wasm_lib_base.cmake)
|
||||
|
@ -94,8 +93,9 @@ include (${SHARED_DIR}/utils/shared_utils.cmake)
|
|||
include (${SHARED_DIR}/mem-alloc/mem_alloc.cmake)
|
||||
include (${SHARED_DIR}/coap/lib_coap.cmake)
|
||||
|
||||
|
||||
include_directories(${SHARED_DIR}/include ${CMAKE_CURRENT_LIST_DIR}/src)
|
||||
include_directories(${SHARED_DIR}/include)
|
||||
include_directories(${WASM_DIR}/runtime/platform/include)
|
||||
include_directories(${CMAKE_CURRENT_LIST_DIR}/src)
|
||||
|
||||
add_definitions (-DWASM_ENABLE_BASE_LIB)
|
||||
add_definitions (-Dattr_container_malloc=bh_malloc)
|
||||
|
|
|
@ -49,7 +49,6 @@ set (SHARED_DIR ${WASM_DIR}/../shared-lib)
|
|||
|
||||
set (TARGET_PLATFORM "zephyr")
|
||||
|
||||
include (${WASM_DIR}/runtime/platform/${TARGET_PLATFORM}/platform.cmake)
|
||||
include (${WASM_DIR}/runtime/utils/utils.cmake)
|
||||
include (${WASM_DIR}/runtime/vmcore-wasm/vmcore.cmake)
|
||||
include (${WASM_DIR}/lib/native/base/wasm_lib_base.cmake)
|
||||
|
@ -65,6 +64,7 @@ include (${SHARED_DIR}/utils/shared_utils.cmake)
|
|||
include (${SHARED_DIR}/mem-alloc/mem_alloc.cmake)
|
||||
include (${SHARED_DIR}/coap/lib_coap.cmake)
|
||||
|
||||
include_directories(${WASM_DIR}/runtime/platform/include)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../src)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../src/platform/zephyr)
|
||||
|
||||
|
|
|
@ -89,7 +89,6 @@ endif()
|
|||
|
||||
enable_language (ASM)
|
||||
|
||||
include (${WASM_DIR}/runtime/platform/${TARGET_PLATFORM}/platform.cmake)
|
||||
include (${WASM_DIR}/runtime/utils/utils.cmake)
|
||||
include (${WASM_DIR}/runtime/vmcore-wasm/vmcore.cmake)
|
||||
include (${WASM_DIR}/lib/native/base/wasm_lib_base.cmake)
|
||||
|
@ -110,6 +109,7 @@ include (${SHARED_DIR}/coap/lib_coap.cmake)
|
|||
|
||||
|
||||
include_directories(${SHARED_DIR}/include)
|
||||
include_directories(${WASM_DIR}/runtime/platform/include)
|
||||
include_directories(${CMAKE_CURRENT_LIST_DIR}/src)
|
||||
|
||||
#Note: uncomment below line to use UART mode
|
||||
|
|
Loading…
Reference in New Issue
Block a user