Re-org platform APIs: move most platform APIs of iwasm to shared-lib (#45)

This commit is contained in:
wenyongh 2019-07-22 11:32:51 +08:00 committed by GitHub
parent 08ebc6c773
commit 1db5a2f697
39 changed files with 387 additions and 899 deletions

View File

@ -28,9 +28,7 @@ GLOBAL_INCLUDES += ${IWASM_ROOT}/runtime/include \
$(NAME)_SOURCES := ${IWASM_ROOT}/runtime/utils/wasm_hashmap.c \ $(NAME)_SOURCES := ${IWASM_ROOT}/runtime/utils/wasm_hashmap.c \
${IWASM_ROOT}/runtime/utils/wasm_log.c \ ${IWASM_ROOT}/runtime/utils/wasm_log.c \
${IWASM_ROOT}/runtime/utils/wasm_dlfcn.c \ ${IWASM_ROOT}/runtime/utils/wasm_dlfcn.c \
${IWASM_ROOT}/runtime/platform/alios/wasm_math.c \ ${IWASM_ROOT}/runtime/platform/alios/wasm_native.c \
${IWASM_ROOT}/runtime/platform/alios/wasm_platform.c \
${IWASM_ROOT}/runtime/platform/alios/wasm-native.c \
${IWASM_ROOT}/runtime/vmcore-wasm/wasm_application.c \ ${IWASM_ROOT}/runtime/vmcore-wasm/wasm_application.c \
${IWASM_ROOT}/runtime/vmcore-wasm/wasm_interp.c \ ${IWASM_ROOT}/runtime/vmcore-wasm/wasm_interp.c \
${IWASM_ROOT}/runtime/vmcore-wasm/wasm_loader.c \ ${IWASM_ROOT}/runtime/vmcore-wasm/wasm_loader.c \
@ -41,6 +39,7 @@ $(NAME)_SOURCES := ${IWASM_ROOT}/runtime/utils/wasm_hashmap.c \
${SHARED_LIB_ROOT}/platform/alios/bh_platform.c \ ${SHARED_LIB_ROOT}/platform/alios/bh_platform.c \
${SHARED_LIB_ROOT}/platform/alios/bh_assert.c \ ${SHARED_LIB_ROOT}/platform/alios/bh_assert.c \
${SHARED_LIB_ROOT}/platform/alios/bh_thread.c \ ${SHARED_LIB_ROOT}/platform/alios/bh_thread.c \
${SHARED_LIB_ROOT}/platform/alios/bh_math.c \
${SHARED_LIB_ROOT}/mem-alloc/bh_memory.c \ ${SHARED_LIB_ROOT}/mem-alloc/bh_memory.c \
${SHARED_LIB_ROOT}/mem-alloc/mem_alloc.c \ ${SHARED_LIB_ROOT}/mem-alloc/mem_alloc.c \
${SHARED_LIB_ROOT}/mem-alloc/ems/ems_kfc.c \ ${SHARED_LIB_ROOT}/mem-alloc/ems/ems_kfc.c \

View File

@ -16,9 +16,9 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "bh_platform.h"
#include "wasm_assert.h" #include "wasm_assert.h"
#include "wasm_log.h" #include "wasm_log.h"
#include "wasm_platform.h"
#include "wasm_platform_log.h" #include "wasm_platform_log.h"
#include "wasm_thread.h" #include "wasm_thread.h"
#include "wasm_export.h" #include "wasm_export.h"

View File

@ -19,9 +19,9 @@
#endif #endif
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "bh_platform.h"
#include "wasm_assert.h" #include "wasm_assert.h"
#include "wasm_log.h" #include "wasm_log.h"
#include "wasm_platform.h"
#include "wasm_platform_log.h" #include "wasm_platform_log.h"
#include "wasm_thread.h" #include "wasm_thread.h"
#include "wasm_export.h" #include "wasm_export.h"
@ -188,8 +188,8 @@ int main(int argc, char *argv[])
wasm_log_set_verbose_level(log_verbose_level); wasm_log_set_verbose_level(log_verbose_level);
/* load WASM byte buffer from WASM bin file */ /* load WASM byte buffer from WASM bin file */
if (!(wasm_file_buf = (uint8*) wasm_read_file_to_buffer(wasm_file, if (!(wasm_file_buf = (uint8*) bh_read_file_to_buffer(wasm_file,
&wasm_file_size))) &wasm_file_size)))
goto fail2; goto fail2;
/* load WASM module */ /* load WASM module */

View File

@ -188,8 +188,8 @@ int main(int argc, char *argv[])
wasm_log_set_verbose_level(log_verbose_level); wasm_log_set_verbose_level(log_verbose_level);
/* load WASM byte buffer from WASM bin file */ /* load WASM byte buffer from WASM bin file */
if (!(wasm_file_buf = (uint8*) wasm_read_file_to_buffer(wasm_file, if (!(wasm_file_buf = (uint8*) bh_read_file_to_buffer(wasm_file,
&wasm_file_size))) &wasm_file_size)))
goto fail2; goto fail2;
/* load WASM module */ /* load WASM module */

View File

@ -35,8 +35,6 @@ include_directories (${IWASM_ROOT}/runtime/include
set (IWASM_SRCS ${IWASM_ROOT}/runtime/utils/wasm_hashmap.c set (IWASM_SRCS ${IWASM_ROOT}/runtime/utils/wasm_hashmap.c
${IWASM_ROOT}/runtime/utils/wasm_log.c ${IWASM_ROOT}/runtime/utils/wasm_log.c
${IWASM_ROOT}/runtime/utils/wasm_dlfcn.c ${IWASM_ROOT}/runtime/utils/wasm_dlfcn.c
${IWASM_ROOT}/runtime/platform/zephyr/wasm_math.c
${IWASM_ROOT}/runtime/platform/zephyr/wasm_platform.c
${IWASM_ROOT}/runtime/platform/zephyr/wasm_native.c ${IWASM_ROOT}/runtime/platform/zephyr/wasm_native.c
${IWASM_ROOT}/runtime/vmcore-wasm/wasm_application.c ${IWASM_ROOT}/runtime/vmcore-wasm/wasm_application.c
${IWASM_ROOT}/runtime/vmcore-wasm/wasm_interp.c ${IWASM_ROOT}/runtime/vmcore-wasm/wasm_interp.c
@ -48,6 +46,7 @@ set (IWASM_SRCS ${IWASM_ROOT}/runtime/utils/wasm_hashmap.c
${SHARED_LIB_ROOT}/platform/zephyr/bh_platform.c ${SHARED_LIB_ROOT}/platform/zephyr/bh_platform.c
${SHARED_LIB_ROOT}/platform/zephyr/bh_assert.c ${SHARED_LIB_ROOT}/platform/zephyr/bh_assert.c
${SHARED_LIB_ROOT}/platform/zephyr/bh_thread.c ${SHARED_LIB_ROOT}/platform/zephyr/bh_thread.c
${SHARED_LIB_ROOT}/platform/zephyr/bh_math.c
${SHARED_LIB_ROOT}/mem-alloc/bh_memory.c ${SHARED_LIB_ROOT}/mem-alloc/bh_memory.c
${SHARED_LIB_ROOT}/mem-alloc/mem_alloc.c ${SHARED_LIB_ROOT}/mem-alloc/mem_alloc.c
${SHARED_LIB_ROOT}/mem-alloc/ems/ems_kfc.c ${SHARED_LIB_ROOT}/mem-alloc/ems/ems_kfc.c

View File

@ -16,9 +16,9 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "bh_platform.h"
#include "wasm_assert.h" #include "wasm_assert.h"
#include "wasm_log.h" #include "wasm_log.h"
#include "wasm_platform.h"
#include "wasm_platform_log.h" #include "wasm_platform_log.h"
#include "wasm_thread.h" #include "wasm_thread.h"
#include "wasm_export.h" #include "wasm_export.h"

View File

@ -14,27 +14,19 @@
* limitations under the License. * limitations under the License.
*/ */
#include "wasm_platform.h" #ifndef _WASM_DLFCN_H
#define _WASM_DLFCN_H
bool is_little_endian = false; #ifdef __cplusplus
extern "C" {
#endif
bool __is_little_endian() void *
{ wasm_dlsym(void *handle, const char *symbol);
union w
{
int a;
char b;
}c;
c.a = 1; #ifdef __cplusplus
return (c.b == 1);
} }
#endif
int wasm_platform_init() #endif /* end of _WASM_DLFCN_H */
{
if (__is_little_endian())
is_little_endian = true;
return 0;
}

View File

@ -17,7 +17,7 @@
#ifndef WASM_HASHMAP_H #ifndef WASM_HASHMAP_H
#define WASM_HASHMAP_H #define WASM_HASHMAP_H
#include "wasm_platform.h" #include "bh_platform.h"
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -30,7 +30,7 @@
#ifndef _WASM_LOG_H #ifndef _WASM_LOG_H
#define _WASM_LOG_H #define _WASM_LOG_H
#include "wasm_platform.h" #include "bh_platform.h"
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -17,7 +17,7 @@
#ifndef _WASM_VECTOR_H #ifndef _WASM_VECTOR_H
#define _WASM_VECTOR_H #define _WASM_VECTOR_H
#include "wasm_platform.h" #include "bh_platform.h"
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -1,104 +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_PLATFORM_H
#define _WASM_PLATFORM_H
#include "wasm_config.h"
#include "wasm_types.h"
#include <aos/kernel.h>
#include <inttypes.h>
#include <stdbool.h>
typedef uint64_t uint64;
typedef int64_t int64;
typedef float float32;
typedef double float64;
#ifndef NULL
# define NULL ((void*) 0)
#endif
#define WASM_PLATFORM "AliOS"
#define __ALIOS__ 1
#include <stdarg.h>
#include <ctype.h>
#include <limits.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
/**
* Return the offset of the given field in the given type.
*
* @param Type the type containing the filed
* @param field the field in the type
*
* @return the offset of field in Type
*/
#ifndef offsetof
#define offsetof(Type, field) ((size_t)(&((Type *)0)->field))
#endif
typedef aos_task_t korp_thread;
typedef korp_thread *korp_tid;
typedef aos_mutex_t korp_mutex;
int wasm_platform_init();
extern bool is_little_endian;
#include <string.h>
/* The following operations declared in string.h may be defined as
macros on Linux, so don't declare them as functions here. */
/* memset */
/* memcpy */
/* memmove */
/* #include <stdio.h> */
/* Unit test framework is based on C++, where the declaration of
snprintf is different. */
#ifndef __cplusplus
int snprintf(char *buffer, size_t count, const char *format, ...);
#endif
#ifdef __cplusplus
extern "C" {
#endif
/* math functions */
double sqrt(double x);
double floor(double x);
double ceil(double x);
double fmin(double x, double y);
double fmax(double x, double y);
double rint(double x);
double fabs(double x);
double trunc(double x);
int signbit(double x);
int isnan(double x);
void*
wasm_dlsym(void *handle, const char *symbol);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,38 +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_TYPES_H
#define _WASM_TYPES_H
#include "wasm_config.h"
typedef unsigned char uint8;
typedef char int8;
typedef unsigned short uint16;
typedef short int16;
typedef unsigned int uint32;
typedef int int32;
#include "wasm_platform.h"
#ifndef __cplusplus
#define true 1
#define false 0
#define inline __inline
#endif
#endif /* end of _WASM_TYPES_H */

View File

@ -1,96 +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.
*/
#include "wasm_log.h"
#include "wasm_platform.h"
#include "wasm_memory.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dlfcn.h>
bool is_little_endian = false;
bool __is_little_endian()
{
union w
{
int a;
char b;
}c;
c.a = 1;
return (c.b == 1);
}
int
wasm_platform_init()
{
if (__is_little_endian())
is_little_endian = true;
return 0;
}
char*
wasm_read_file_to_buffer(const char *filename, int *ret_size)
{
char *buffer;
int file;
int file_size, read_size;
struct stat stat_buf;
if (!filename || !ret_size) {
LOG_ERROR("Read file to buffer failed: invalid filename or ret size.\n");
return NULL;
}
if ((file = open(filename, O_RDONLY, 0)) == -1) {
LOG_ERROR("Read file to buffer failed: open file %s failed.\n",
filename);
return NULL;
}
if (fstat(file, &stat_buf) != 0) {
LOG_ERROR("Read file to buffer failed: fstat file %s failed.\n",
filename);
close(file);
return NULL;
}
file_size = stat_buf.st_size;
if (!(buffer = wasm_malloc(file_size))) {
LOG_ERROR("Read file to buffer failed: alloc memory failed.\n");
close(file);
return NULL;
}
read_size = read(file, buffer, file_size);
close(file);
if (read_size < file_size) {
LOG_ERROR("Read file to buffer failed: read file content failed.\n");
wasm_free(buffer);
return NULL;
}
*ret_size = file_size;
return buffer;
}

View File

@ -1,104 +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_PLATFORM_H
#define _WASM_PLATFORM_H
#include "wasm_config.h"
#include "wasm_types.h"
#include <inttypes.h>
#include <stdbool.h>
typedef uint64_t uint64;
typedef int64_t int64;
typedef float float32;
typedef double float64;
#ifndef NULL
# define NULL ((void*) 0)
#endif
#define WASM_PLATFORM "Linux"
#include <stdarg.h>
#include <ctype.h>
#include <pthread.h>
#include <limits.h>
#include <semaphore.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
/**
* Return the offset of the given field in the given type.
*
* @param Type the type containing the filed
* @param field the field in the type
*
* @return the offset of field in Type
*/
#ifndef offsetof
#define offsetof(Type, field) ((size_t)(&((Type *)0)->field))
#endif
typedef pthread_t korp_tid;
typedef pthread_mutex_t korp_mutex;
int wasm_platform_init();
extern bool is_little_endian;
#include <string.h>
/* The following operations declared in string.h may be defined as
macros on Linux, so don't declare them as functions here. */
/* memset */
/* memcpy */
/* memmove */
/* #include <stdio.h> */
/* Unit test framework is based on C++, where the declaration of
snprintf is different. */
#ifndef __cplusplus
int snprintf(char *buffer, size_t count, const char *format, ...);
#endif
#ifdef __cplusplus
extern "C" {
#endif
/* #include <math.h> */
#ifndef __cplusplus
double sqrt(double x);
#endif
#include <stdio.h>
extern int fopen_s(FILE ** pFile, const char *filename, const char *mode);
char*
wasm_read_file_to_buffer(const char *filename, int *ret_size);
void*
wasm_dlsym(void *handle, const char *symbol);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,96 +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.
*/
#include "wasm_log.h"
#include "wasm_platform.h"
#include "wasm_memory.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dlfcn.h>
bool is_little_endian = false;
bool __is_little_endian()
{
union w
{
int a;
char b;
}c;
c.a = 1;
return (c.b == 1);
}
int
wasm_platform_init()
{
if (__is_little_endian())
is_little_endian = true;
return 0;
}
char*
wasm_read_file_to_buffer(const char *filename, int *ret_size)
{
char *buffer;
int file;
int file_size, read_size;
struct stat stat_buf;
if (!filename || !ret_size) {
LOG_ERROR("Read file to buffer failed: invalid filename or ret size.\n");
return NULL;
}
if ((file = open(filename, O_RDONLY, 0)) == -1) {
LOG_ERROR("Read file to buffer failed: open file %s failed.\n",
filename);
return NULL;
}
if (fstat(file, &stat_buf) != 0) {
LOG_ERROR("Read file to buffer failed: fstat file %s failed.\n",
filename);
close(file);
return NULL;
}
file_size = stat_buf.st_size;
if (!(buffer = wasm_malloc(file_size))) {
LOG_ERROR("Read file to buffer failed: alloc memory failed.\n");
close(file);
return NULL;
}
read_size = read(file, buffer, file_size);
close(file);
if (read_size < file_size) {
LOG_ERROR("Read file to buffer failed: read file content failed.\n");
wasm_free(buffer);
return NULL;
}
*ret_size = file_size;
return buffer;
}

View File

@ -1,104 +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_PLATFORM_H
#define _WASM_PLATFORM_H
#include <inttypes.h>
#include <stdbool.h>
#include "wasm_config.h"
#include "wasm_types.h"
typedef uint64_t uint64;
typedef int64_t int64;
typedef float float32;
typedef double float64;
#ifndef NULL
# define NULL ((void*) 0)
#endif
#define WASM_PLATFORM "VxWorks"
#include <stdarg.h>
#include <ctype.h>
#include <pthread.h>
#include <limits.h>
#include <semaphore.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
/**
* Return the offset of the given field in the given type.
*
* @param Type the type containing the filed
* @param field the field in the type
*
* @return the offset of field in Type
*/
#ifndef offsetof
#define offsetof(Type, field) ((size_t)(&((Type *)0)->field))
#endif
typedef pthread_t korp_tid;
typedef pthread_mutex_t korp_mutex;
int wasm_platform_init();
extern bool is_little_endian;
#include <string.h>
/* The following operations declared in string.h may be defined as
macros on Linux, so don't declare them as functions here. */
/* memset */
/* memcpy */
/* memmove */
/* #include <stdio.h> */
/* Unit test framework is based on C++, where the declaration of
snprintf is different. */
#ifndef __cplusplus
int snprintf(char *buffer, size_t count, const char *format, ...);
#endif
#ifdef __cplusplus
extern "C" {
#endif
/* #include <math.h> */
#ifndef __cplusplus
double sqrt(double x);
#endif
#include <stdio.h>
char*
wasm_read_file_to_buffer(const char *filename, int *ret_size);
void*
wasm_dlsym(void *handle, const char *symbol);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,56 +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.
*/
#include "wasm_platform.h"
#ifndef CONFIG_AEE_ENABLE
static int
_stdout_hook_iwasm(int c)
{
printk("%c", (char)c);
return 1;
}
extern void __stdout_hook_install(int (*hook)(int));
#endif
bool is_little_endian = false;
bool __is_little_endian()
{
union w
{
int a;
char b;
}c;
c.a = 1;
return (c.b == 1);
}
int wasm_platform_init()
{
if (__is_little_endian())
is_little_endian = true;
#ifndef CONFIG_AEE_ENABLE
/* Enable printf() in Zephyr */
__stdout_hook_install(_stdout_hook_iwasm);
#endif
return 0;
}

View File

@ -1,105 +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_PLATFORM_H
#define _WASM_PLATFORM_H
#include "wasm_config.h"
#include "wasm_types.h"
#include <autoconf.h>
#include <zephyr.h>
#include <kernel.h>
#include <inttypes.h>
#include <stdbool.h>
typedef uint64_t uint64;
typedef int64_t int64;
typedef float float32;
typedef double float64;
#ifndef NULL
# define NULL ((void*) 0)
#endif
#define WASM_PLATFORM "Zephyr"
#include <stdarg.h>
#include <ctype.h>
#include <limits.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
/**
* Return the offset of the given field in the given type.
*
* @param Type the type containing the filed
* @param field the field in the type
*
* @return the offset of field in Type
*/
#ifndef offsetof
#define offsetof(Type, field) ((size_t)(&((Type *)0)->field))
#endif
typedef struct k_thread korp_thread;
typedef korp_thread *korp_tid;
typedef struct k_mutex korp_mutex;
int wasm_platform_init();
extern bool is_little_endian;
#include <string.h>
/* The following operations declared in string.h may be defined as
macros on Linux, so don't declare them as functions here. */
/* memset */
/* memcpy */
/* memmove */
/* #include <stdio.h> */
/* Unit test framework is based on C++, where the declaration of
snprintf is different. */
#ifndef __cplusplus
int snprintf(char *buffer, size_t count, const char *format, ...);
#endif
#ifdef __cplusplus
extern "C" {
#endif
/* math functions */
double sqrt(double x);
double floor(double x);
double ceil(double x);
double fmin(double x, double y);
double fmax(double x, double y);
double rint(double x);
double fabs(double x);
double trunc(double x);
int signbit(double x);
int isnan(double x);
void*
wasm_dlsym(void *handle, const char *symbol);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
#include "wasm_platform.h" #include "bh_platform.h"
static bool sort_flag = false; static bool sort_flag = false;

View File

@ -17,7 +17,7 @@
#ifndef _WASM_H_ #ifndef _WASM_H_
#define _WASM_H_ #define _WASM_H_
#include "wasm_platform.h" #include "bh_platform.h"
#include "wasm_hashmap.h" #include "wasm_hashmap.h"
#include "wasm_assert.h" #include "wasm_assert.h"

View File

@ -160,6 +160,13 @@ union ieee754_double {
} ieee; } ieee;
}; };
static union {
int a;
char b;
} __ue = { .a = 1 };
#define is_little_endian() (__ue.b == 1)
bool bool
wasm_application_execute_func(WASMModuleInstance *module_inst, wasm_application_execute_func(WASMModuleInstance *module_inst,
char *name, int argc, char *argv[]) char *name, int argc, char *argv[])
@ -222,7 +229,7 @@ wasm_application_execute_func(WASMModuleInstance *module_inst,
union ieee754_float u; union ieee754_float u;
sig = strtoul(endptr + 1, &endptr, 0); sig = strtoul(endptr + 1, &endptr, 0);
u.f = f32; u.f = f32;
if (is_little_endian) if (is_little_endian())
u.ieee.ieee_little_endian.mantissa = sig; u.ieee.ieee_little_endian.mantissa = sig;
else else
u.ieee.ieee_big_endian.mantissa = sig; u.ieee.ieee_big_endian.mantissa = sig;
@ -245,7 +252,7 @@ wasm_application_execute_func(WASMModuleInstance *module_inst,
union ieee754_double ud; union ieee754_double ud;
sig = strtoull(endptr + 1, &endptr, 0); sig = strtoull(endptr + 1, &endptr, 0);
ud.d = u.val; ud.d = u.val;
if (is_little_endian) { if (is_little_endian()) {
ud.ieee.ieee_little_endian.mantissa0 = sig >> 32; ud.ieee.ieee_little_endian.mantissa0 = sig >> 32;
ud.ieee.ieee_little_endian.mantissa1 = sig; ud.ieee.ieee_little_endian.mantissa1 = sig;
} }

View File

@ -21,6 +21,7 @@
#include "wasm_runtime.h" #include "wasm_runtime.h"
#include "wasm_log.h" #include "wasm_log.h"
#include "wasm_memory.h" #include "wasm_memory.h"
#include "wasm_dlfcn.h"
/* Read a value of given type from the address pointed to by the given /* Read a value of given type from the address pointed to by the given
pointer and increase the pointer to the position just after the pointer and increase the pointer to the position just after the
@ -1347,6 +1348,13 @@ exchange32(uint8* p_data)
*(p_data + 2) = value; *(p_data + 2) = value;
} }
static union {
int a;
char b;
} __ue = { .a = 1 };
#define is_little_endian() (__ue.b == 1)
static bool static bool
load(const uint8 *buf, uint32 size, WASMModule *module, load(const uint8 *buf, uint32 size, WASMModule *module,
char *error_buf, uint32 error_buf_size) char *error_buf, uint32 error_buf_size)
@ -1358,7 +1366,7 @@ load(const uint8 *buf, uint32 size, WASMModule *module,
CHECK_BUF(p, p_end, sizeof(uint32)); CHECK_BUF(p, p_end, sizeof(uint32));
magic_number = read_uint32(p); magic_number = read_uint32(p);
if (!is_little_endian) if (!is_little_endian())
exchange32((uint8*)&magic_number); exchange32((uint8*)&magic_number);
if (magic_number != WASM_MAGIC_NUMBER) { if (magic_number != WASM_MAGIC_NUMBER) {
@ -1368,7 +1376,7 @@ load(const uint8 *buf, uint32 size, WASMModule *module,
CHECK_BUF(p, p_end, sizeof(uint32)); CHECK_BUF(p, p_end, sizeof(uint32));
version = read_uint32(p); version = read_uint32(p);
if (!is_little_endian) if (!is_little_endian())
exchange32((uint8*)&version); exchange32((uint8*)&version);
if (version != WASM_CURRENT_VERSION) { if (version != WASM_CURRENT_VERSION) {

View File

@ -35,7 +35,7 @@ set_error_buf(char *error_buf, uint32 error_buf_size, const char *string)
bool bool
wasm_runtime_init() wasm_runtime_init()
{ {
if (wasm_platform_init() != 0) if (bh_platform_init() != 0)
return false; return false;
if (wasm_log_init() != 0) if (wasm_log_init() != 0)

View File

@ -28,10 +28,7 @@
* $FreeBSD$ * $FreeBSD$
*/ */
#include "wasm_log.h" #include "bh_platform.h"
#include "wasm_platform.h"
#include "wasm_platform_log.h"
#include "wasm_memory.h"
#define __FDLIBM_STDC__ #define __FDLIBM_STDC__
@ -99,6 +96,13 @@ typedef union {
} bits; } bits;
} IEEEd2bits_B; } IEEEd2bits_B;
static union {
int a;
char b;
} __ue = { .a = 1 };
#define is_little_endian() (__ue.b == 1)
#define __HIL(x) *(1+pdouble2pint(&x)) #define __HIL(x) *(1+pdouble2pint(&x))
#define __LOL(x) *(pdouble2pint(&x)) #define __LOL(x) *(pdouble2pint(&x))
#define __HIB(x) *(int*)&x #define __HIB(x) *(int*)&x
@ -179,39 +183,39 @@ do { \
} while (0) } while (0)
/* Macro wrappers. */ /* Macro wrappers. */
#define EXTRACT_WORDS(ix0,ix1,d) do { \ #define EXTRACT_WORDS(ix0,ix1,d) do { \
if (is_little_endian) \ if (is_little_endian()) \
EXTRACT_WORDS_L(ix0,ix1,d); \ EXTRACT_WORDS_L(ix0,ix1,d); \
else \ else \
EXTRACT_WORDS_B(ix0,ix1,d); \ EXTRACT_WORDS_B(ix0,ix1,d); \
} while (0) } while (0)
#define INSERT_WORDS(d,ix0,ix1) do { \ #define INSERT_WORDS(d,ix0,ix1) do { \
if (is_little_endian) \ if (is_little_endian()) \
INSERT_WORDS_L(d,ix0,ix1); \ INSERT_WORDS_L(d,ix0,ix1); \
else \ else \
INSERT_WORDS_B(d,ix0,ix1); \ INSERT_WORDS_B(d,ix0,ix1); \
} while (0) } while (0)
#define GET_HIGH_WORD(i,d) \ #define GET_HIGH_WORD(i,d) \
do { \ do { \
if (is_little_endian) \ if (is_little_endian()) \
GET_HIGH_WORD_L(i,d); \ GET_HIGH_WORD_L(i,d); \
else \ else \
GET_HIGH_WORD_B(i,d); \ GET_HIGH_WORD_B(i,d); \
} while (0) } while (0)
#define SET_HIGH_WORD(d,v) \ #define SET_HIGH_WORD(d,v) \
do { \ do { \
if (is_little_endian) \ if (is_little_endian()) \
SET_HIGH_WORD_L(d,v); \ SET_HIGH_WORD_L(d,v); \
else \ else \
SET_HIGH_WORD_B(d,v); \ SET_HIGH_WORD_B(d,v); \
} while (0) } while (0)
#define __HI(x) (is_little_endian ? __HIL(x) : __HIB(x)) #define __HI(x) (is_little_endian() ? __HIL(x) : __HIB(x))
#define __LO(x) (is_little_endian ? __LOL(x) : __LOB(x)) #define __LO(x) (is_little_endian() ? __LOL(x) : __LOB(x))
/* /*
* Attempt to get strict C99 semantics for assignment with non-C99 compilers. * Attempt to get strict C99 semantics for assignment with non-C99 compilers.
@ -509,7 +513,7 @@ static double freebsd_rint(double x)
static int freebsd_isnan(double d) static int freebsd_isnan(double d)
{ {
if (is_little_endian) { if (is_little_endian()) {
IEEEd2bits_L u; IEEEd2bits_L u;
u.d = d; u.d = d;
return (u.bits.exp == 2047 && (u.bits.manl != 0 || u.bits.manh != 0)); return (u.bits.exp == 2047 && (u.bits.manl != 0 || u.bits.manh != 0));

View File

@ -25,3 +25,9 @@ char *bh_strdup(const char *s)
memcpy(s1, s, strlen(s) + 1); memcpy(s1, s, strlen(s) + 1);
return s1; return s1;
} }
int bh_platform_init()
{
return 0;
}

View File

@ -43,8 +43,6 @@
/* Invalid thread tid */ /* Invalid thread tid */
#define INVALID_THREAD_ID NULL #define INVALID_THREAD_ID NULL
#define INVALID_SEM_ID NULL
#define BH_WAIT_FOREVER AOS_WAIT_FOREVER #define BH_WAIT_FOREVER AOS_WAIT_FOREVER
typedef uint64_t uint64; typedef uint64_t uint64;
@ -79,6 +77,18 @@ int snprintf(char *buffer, size_t count, const char *format, ...);
#define NULL ((void*)0) #define NULL ((void*)0)
#endif #endif
/**
* Return the offset of the given field in the given type.
*
* @param Type the type containing the filed
* @param field the field in the type
*
* @return the offset of field in Type
*/
#ifndef offsetof
#define offsetof(Type, field) ((size_t)(&((Type *)0)->field))
#endif
extern void bh_assert_internal(int v, const char *file_name, int line_number, const char *expr_string); extern void bh_assert_internal(int v, const char *file_name, int line_number, const char *expr_string);
#define bh_assert(expr) bh_assert_internal((int)(expr), __FILE__, __LINE__, # expr) #define bh_assert(expr) bh_assert_internal((int)(expr), __FILE__, __LINE__, # expr)
@ -86,5 +96,19 @@ extern int b_memcpy_s(void * s1, unsigned int s1max, const void * s2, unsigned i
extern int b_strcat_s(char * s1, size_t s1max, const char * s2); extern int b_strcat_s(char * s1, size_t s1max, const char * s2);
extern int b_strcpy_s(char * s1, size_t s1max, const char * s2); extern int b_strcpy_s(char * s1, size_t s1max, const char * s2);
/* math functions */
double sqrt(double x);
double floor(double x);
double ceil(double x);
double fmin(double x, double y);
double fmax(double x, double y);
double rint(double x);
double fabs(double x);
double trunc(double x);
int signbit(double x);
int isnan(double x);
int bh_platform_init();
#endif /* end of _BH_PLATFORM_H */ #endif /* end of _BH_PLATFORM_H */

View File

@ -25,6 +25,8 @@ typedef unsigned short uint16;
typedef short int16; typedef short int16;
typedef unsigned int uint32; typedef unsigned int uint32;
typedef int int32; typedef int int32;
typedef float float32;
typedef double float64;
#define BYTES_OF_UINT8 1 #define BYTES_OF_UINT8 1
#define BYTES_OF_UINT16 2 #define BYTES_OF_UINT16 2

View File

@ -15,8 +15,10 @@
*/ */
#include "bh_platform.h" #include "bh_platform.h"
#include <stdlib.h>
#include <string.h> #include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
char *bh_strdup(const char *s) char *bh_strdup(const char *s)
{ {
@ -25,3 +27,56 @@ char *bh_strdup(const char *s)
memcpy(s1, s, strlen(s) + 1); memcpy(s1, s, strlen(s) + 1);
return s1; return s1;
} }
int bh_platform_init()
{
return 0;
}
char*
bh_read_file_to_buffer(const char *filename, int *ret_size)
{
char *buffer;
int file;
int file_size, read_size;
struct stat stat_buf;
if (!filename || !ret_size) {
printf("Read file to buffer failed: invalid filename or ret size.\n");
return NULL;
}
if ((file = open(filename, O_RDONLY, 0)) == -1) {
printf("Read file to buffer failed: open file %s failed.\n",
filename);
return NULL;
}
if (fstat(file, &stat_buf) != 0) {
printf("Read file to buffer failed: fstat file %s failed.\n",
filename);
close(file);
return NULL;
}
file_size = stat_buf.st_size;
if (!(buffer = bh_malloc(file_size))) {
printf("Read file to buffer failed: alloc memory failed.\n");
close(file);
return NULL;
}
read_size = read(file, buffer, file_size);
close(file);
if (read_size < file_size) {
printf("Read file to buffer failed: read file content failed.\n");
bh_free(buffer);
return NULL;
}
*ret_size = file_size;
return buffer;
}

View File

@ -26,11 +26,16 @@
#include <time.h> #include <time.h>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <assert.h> #include <stdlib.h>
#include <math.h>
#ifndef __cplusplus #include <stdarg.h>
int snprintf(char *buffer, size_t count, const char *format, ...); #include <ctype.h>
#endif #include <pthread.h>
#include <limits.h>
#include <semaphore.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -47,46 +52,19 @@ extern void DEBUGME(void);
/* NEED qsort */ /* NEED qsort */
#include <stdarg.h>
#include <ctype.h>
#include <pthread.h>
#include <limits.h>
#include <semaphore.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define _STACK_SIZE_ADJUSTMENT (32 * 1024) #define _STACK_SIZE_ADJUSTMENT (32 * 1024)
/* Stack size of applet manager thread. */
#define BH_APPLET_MANAGER_THREAD_STACK_SIZE (8 * 1024 + _STACK_SIZE_ADJUSTMENT)
/* Stack size of HMC thread. */
#define BH_HMC_THREAD_STACK_SIZE (4 * 1024 + _STACK_SIZE_ADJUSTMENT)
/* Stack size of watchdog thread. */
#define BH_WATCHDOG_THREAD_SIZE (4 * 1024 + _STACK_SIZE_ADJUSTMENT)
/* Stack size of applet threads's native part. */ /* Stack size of applet threads's native part. */
#define BH_APPLET_PRESERVED_STACK_SIZE (8 * 1024 + _STACK_SIZE_ADJUSTMENT) #define BH_APPLET_PRESERVED_STACK_SIZE (8 * 1024 + _STACK_SIZE_ADJUSTMENT)
/* Stack size of remote invoke listen thread. */
#define BH_REMOTE_INVOKE_THREAD_STACK_SIZE (4 * 1024 + _STACK_SIZE_ADJUSTMENT)
/* Stack size of remote post listen thread. */
#define BH_REMOTE_POST_THREAD_STACK_SIZE (4 * 1024 + _STACK_SIZE_ADJUSTMENT)
/* Maximal recursion depth of interpreter. */
#define BH_MAX_INTERP_RECURSION_DEPTH 8
/* Default thread priority */ /* Default thread priority */
#define BH_THREAD_DEFAULT_PRIORITY 0 #define BH_THREAD_DEFAULT_PRIORITY 0
#define BH_ROUTINE_MODIFIER #define BH_ROUTINE_MODIFIER
#define BHT_TIMEDOUT ETIMEDOUT #define BHT_TIMEDOUT ETIMEDOUT
#define INVALID_THREAD_ID 0xFFffFFff #define INVALID_THREAD_ID 0xFFffFFff
#define INVALID_SEM_ID SEM_FAILED
typedef pthread_t korp_tid; typedef pthread_t korp_tid;
typedef pthread_mutex_t korp_mutex; typedef pthread_mutex_t korp_mutex;
@ -99,28 +77,43 @@ typedef void* (*thread_start_routine_t)(void*);
#define wa_free bh_free #define wa_free bh_free
#define wa_strdup bh_strdup #define wa_strdup bh_strdup
int snprintf(char *buffer, size_t count, const char *format, ...);
double fmod(double x, double y); double fmod(double x, double y);
float fmodf(float x, float y); float fmodf(float x, float y);
double sqrt(double x);
/* Definitions for applet debugging */
#define APPLET_DEBUG_LISTEN_PORT 8000
#define BH_SOCKET_INVALID_SOCK -1
#define BH_WAIT_FOREVER 0xFFFFFFFF #define BH_WAIT_FOREVER 0xFFFFFFFF
typedef int bh_socket_t;
#ifndef NULL #ifndef NULL
# define NULL ((void*) 0) # define NULL ((void*) 0)
#endif #endif
/**
* Return the offset of the given field in the given type.
*
* @param Type the type containing the filed
* @param field the field in the type
*
* @return the offset of field in Type
*/
#ifndef offsetof
#define offsetof(Type, field) ((size_t)(&((Type *)0)->field))
#endif
#define bh_assert assert #define bh_assert assert
extern int b_memcpy_s(void * s1, unsigned int s1max, const void * s2, int b_memcpy_s(void * s1, unsigned int s1max, const void * s2,
unsigned int n); unsigned int n);
extern int b_strcat_s(char * s1, size_t s1max, const char * s2); int b_strcat_s(char * s1, size_t s1max, const char * s2);
extern int b_strcpy_s(char * s1, size_t s1max, const char * s2); int b_strcpy_s(char * s1, size_t s1max, const char * s2);
extern int fopen_s(FILE ** pFile, const char *filename, const char *mode);
extern char *bh_strdup(const char *s); int fopen_s(FILE ** pFile, const char *filename, const char *mode);
char *bh_read_file_to_buffer(const char *filename, int *ret_size);
char *bh_strdup(const char *s);
int bh_platform_init();
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -17,6 +17,12 @@
#include "bh_platform.h" #include "bh_platform.h"
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dlfcn.h>
char *bh_strdup(const char *s) char *bh_strdup(const char *s)
{ {
@ -25,3 +31,56 @@ char *bh_strdup(const char *s)
memcpy(s1, s, strlen(s) + 1); memcpy(s1, s, strlen(s) + 1);
return s1; return s1;
} }
int bh_platform_init()
{
return 0;
}
char*
bh_read_file_to_buffer(const char *filename, int *ret_size)
{
char *buffer;
int file;
int file_size, read_size;
struct stat stat_buf;
if (!filename || !ret_size) {
printf("Read file to buffer failed: invalid filename or ret size.\n");
return NULL;
}
if ((file = open(filename, O_RDONLY, 0)) == -1) {
printf("Read file to buffer failed: open file %s failed.\n",
filename);
return NULL;
}
if (fstat(file, &stat_buf) != 0) {
printf("Read file to buffer failed: fstat file %s failed.\n",
filename);
close(file);
return NULL;
}
file_size = stat_buf.st_size;
if (!(buffer = wasm_malloc(file_size))) {
printf("Read file to buffer failed: alloc memory failed.\n");
close(file);
return NULL;
}
read_size = read(file, buffer, file_size);
close(file);
if (read_size < file_size) {
printf("Read file to buffer failed: read file content failed.\n");
wasm_free(buffer);
return NULL;
}
*ret_size = file_size;
return buffer;
}

View File

@ -27,10 +27,13 @@
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <assert.h> #include <assert.h>
#include <stdarg.h>
#include <ctype.h>
#include <pthread.h>
#include <limits.h>
#include <semaphore.h>
#include <errno.h>
#ifndef __cplusplus
int snprintf(char *buffer, size_t count, const char *format, ...);
#endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -43,48 +46,23 @@ extern void DEBUGME(void);
#define DIE do{bh_debug("Die here\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); DEBUGME(void); while(1);}while(0) #define DIE do{bh_debug("Die here\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); DEBUGME(void); while(1);}while(0)
#define BH_PLATFORM "Linux" #define BH_PLATFORM "VxWorks"
/* NEED qsort */ /* NEED qsort */
#include <stdarg.h>
#include <ctype.h>
#include <pthread.h>
#include <limits.h>
#include <semaphore.h>
#include <errno.h>
#define _STACK_SIZE_ADJUSTMENT (32 * 1024) #define _STACK_SIZE_ADJUSTMENT (32 * 1024)
/* Stack size of applet manager thread. */
#define BH_APPLET_MANAGER_THREAD_STACK_SIZE (8 * 1024 + _STACK_SIZE_ADJUSTMENT)
/* Stack size of HMC thread. */
#define BH_HMC_THREAD_STACK_SIZE (4 * 1024 + _STACK_SIZE_ADJUSTMENT)
/* Stack size of watchdog thread. */
#define BH_WATCHDOG_THREAD_SIZE (4 * 1024 + _STACK_SIZE_ADJUSTMENT)
/* Stack size of applet threads's native part. */ /* Stack size of applet threads's native part. */
#define BH_APPLET_PRESERVED_STACK_SIZE (8 * 1024 + _STACK_SIZE_ADJUSTMENT) #define BH_APPLET_PRESERVED_STACK_SIZE (8 * 1024 + _STACK_SIZE_ADJUSTMENT)
/* Stack size of remote invoke listen thread. */
#define BH_REMOTE_INVOKE_THREAD_STACK_SIZE (4 * 1024 + _STACK_SIZE_ADJUSTMENT)
/* Stack size of remote post listen thread. */
#define BH_REMOTE_POST_THREAD_STACK_SIZE (4 * 1024 + _STACK_SIZE_ADJUSTMENT)
/* Maximal recursion depth of interpreter. */
#define BH_MAX_INTERP_RECURSION_DEPTH 8
/* Default thread priority */ /* Default thread priority */
#define BH_THREAD_DEFAULT_PRIORITY 0 #define BH_THREAD_DEFAULT_PRIORITY 0
#define BH_ROUTINE_MODIFIER #define BH_ROUTINE_MODIFIER
#define BHT_TIMEDOUT ETIMEDOUT #define BHT_TIMEDOUT ETIMEDOUT
#define INVALID_THREAD_ID 0xFFffFFff #define INVALID_THREAD_ID 0xFFffFFff
#define INVALID_SEM_ID SEM_FAILED
typedef pthread_t korp_tid; typedef pthread_t korp_tid;
typedef pthread_mutex_t korp_mutex; typedef pthread_mutex_t korp_mutex;
@ -97,27 +75,41 @@ typedef void* (*thread_start_routine_t)(void*);
#define wa_free bh_free #define wa_free bh_free
#define wa_strdup bh_strdup #define wa_strdup bh_strdup
int snprintf(char *buffer, size_t count, const char *format, ...);
double fmod(double x, double y); double fmod(double x, double y);
float fmodf(float x, float y); float fmodf(float x, float y);
double sqrt(double x);
/* Definitions for applet debugging */
#define APPLET_DEBUG_LISTEN_PORT 8000
#define BH_SOCKET_INVALID_SOCK -1
#define BH_WAIT_FOREVER 0xFFFFFFFF #define BH_WAIT_FOREVER 0xFFFFFFFF
typedef int bh_socket_t;
#ifndef NULL #ifndef NULL
# define NULL ((void*) 0) # define NULL ((void*) 0)
#endif #endif
/**
* Return the offset of the given field in the given type.
*
* @param Type the type containing the filed
* @param field the field in the type
*
* @return the offset of field in Type
*/
#ifndef offsetof
#define offsetof(Type, field) ((size_t)(&((Type *)0)->field))
#endif
#define bh_assert assert #define bh_assert assert
extern int b_memcpy_s(void * s1, unsigned int s1max, const void * s2, int b_memcpy_s(void * s1, unsigned int s1max, const void * s2,
unsigned int n); unsigned int n);
extern int b_strcat_s(char * s1, size_t s1max, const char * s2); int b_strcat_s(char * s1, size_t s1max, const char * s2);
extern int b_strcpy_s(char * s1, size_t s1max, const char * s2); int b_strcpy_s(char * s1, size_t s1max, const char * s2);
extern char *bh_strdup(const char *s); char *bh_read_file_to_buffer(const char *filename, int *ret_size);
char *bh_strdup(const char *s);
int bh_platform_init();
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -28,10 +28,7 @@
* $FreeBSD$ * $FreeBSD$
*/ */
#include "wasm_log.h" #include "bh_platform.h"
#include "wasm_platform.h"
#include "wasm_platform_log.h"
#include "wasm_memory.h"
#define __FDLIBM_STDC__ #define __FDLIBM_STDC__
@ -99,6 +96,13 @@ typedef union {
} bits; } bits;
} IEEEd2bits_B; } IEEEd2bits_B;
static union {
int a;
char b;
} __ue = { .a = 1 };
#define is_little_endian() (__ue.b == 1)
#define __HIL(x) *(1+pdouble2pint(&x)) #define __HIL(x) *(1+pdouble2pint(&x))
#define __LOL(x) *(pdouble2pint(&x)) #define __LOL(x) *(pdouble2pint(&x))
#define __HIB(x) *(int*)&x #define __HIB(x) *(int*)&x
@ -179,39 +183,39 @@ typedef union {
} while (0) } while (0)
/* Macro wrappers. */ /* Macro wrappers. */
#define EXTRACT_WORDS(ix0,ix1,d) do { \ #define EXTRACT_WORDS(ix0,ix1,d) do { \
if (is_little_endian) \ if (is_little_endian()) \
EXTRACT_WORDS_L(ix0,ix1,d); \ EXTRACT_WORDS_L(ix0,ix1,d); \
else \ else \
EXTRACT_WORDS_B(ix0,ix1,d); \ EXTRACT_WORDS_B(ix0,ix1,d); \
} while (0) } while (0)
#define INSERT_WORDS(d,ix0,ix1) do { \ #define INSERT_WORDS(d,ix0,ix1) do { \
if (is_little_endian) \ if (is_little_endian()) \
INSERT_WORDS_L(d,ix0,ix1); \ INSERT_WORDS_L(d,ix0,ix1); \
else \ else \
INSERT_WORDS_B(d,ix0,ix1); \ INSERT_WORDS_B(d,ix0,ix1); \
} while (0) } while (0)
#define GET_HIGH_WORD(i,d) \ #define GET_HIGH_WORD(i,d) \
do { \ do { \
if (is_little_endian) \ if (is_little_endian()) \
GET_HIGH_WORD_L(i,d); \ GET_HIGH_WORD_L(i,d); \
else \ else \
GET_HIGH_WORD_B(i,d); \ GET_HIGH_WORD_B(i,d); \
} while (0) } while (0)
#define SET_HIGH_WORD(d,v) \ #define SET_HIGH_WORD(d,v) \
do { \ do { \
if (is_little_endian) \ if (is_little_endian()) \
SET_HIGH_WORD_L(d,v); \ SET_HIGH_WORD_L(d,v); \
else \ else \
SET_HIGH_WORD_B(d,v); \ SET_HIGH_WORD_B(d,v); \
} while (0) } while (0)
#define __HI(x) (is_little_endian ? __HIL(x) : __HIB(x)) #define __HI(x) (is_little_endian() ? __HIL(x) : __HIB(x))
#define __LO(x) (is_little_endian ? __LOL(x) : __LOB(x)) #define __LO(x) (is_little_endian() ? __LOL(x) : __LOB(x))
/* /*
* Attempt to get strict C99 semantics for assignment with non-C99 compilers. * Attempt to get strict C99 semantics for assignment with non-C99 compilers.
@ -509,7 +513,7 @@ static double freebsd_rint(double x)
static int freebsd_isnan(double d) static int freebsd_isnan(double d)
{ {
if (is_little_endian) { if (is_little_endian()) {
IEEEd2bits_L u; IEEEd2bits_L u;
u.d = d; u.d = d;
return (u.bits.exp == 2047 && (u.bits.manl != 0 || u.bits.manh != 0)); return (u.bits.exp == 2047 && (u.bits.manl != 0 || u.bits.manh != 0));

View File

@ -25,3 +25,25 @@ char *bh_strdup(const char *s)
memcpy(s1, s, strlen(s) + 1); memcpy(s1, s, strlen(s) + 1);
return s1; return s1;
} }
#ifndef CONFIG_AEE_ENABLE
static int
_stdout_hook_iwasm(int c)
{
printk("%c", (char)c);
return 1;
}
int bh_platform_init()
{
extern void __stdout_hook_install(int (*hook)(int));
/* Enable printf() in Zephyr */
__stdout_hook_install(_stdout_hook_iwasm);
return 0;
}
#else
int bh_platform_init()
{
return 0;
}
#endif

View File

@ -52,7 +52,6 @@
/* Invalid thread tid */ /* Invalid thread tid */
#define INVALID_THREAD_ID NULL #define INVALID_THREAD_ID NULL
#define INVALID_SEM_ID SEM_FAILED
#define BH_WAIT_FOREVER K_FOREVER #define BH_WAIT_FOREVER K_FOREVER
typedef uint64_t uint64; typedef uint64_t uint64;
@ -89,6 +88,18 @@ int snprintf(char *buffer, size_t count, const char *format, ...);
#define NULL ((void*)0) #define NULL ((void*)0)
#endif #endif
/**
* Return the offset of the given field in the given type.
*
* @param Type the type containing the filed
* @param field the field in the type
*
* @return the offset of field in Type
*/
#ifndef offsetof
#define offsetof(Type, field) ((size_t)(&((Type *)0)->field))
#endif
#define bh_assert(x) \ #define bh_assert(x) \
do { \ do { \
if (!(x)) { \ if (!(x)) { \
@ -96,9 +107,23 @@ int snprintf(char *buffer, size_t count, const char *format, ...);
} \ } \
} while (0) } while (0)
extern int b_memcpy_s(void * s1, unsigned int s1max, const void * s2, int b_memcpy_s(void * s1, unsigned int s1max, const void * s2,
unsigned int n); unsigned int n);
extern int b_strcat_s(char * s1, size_t s1max, const char * s2); int b_strcat_s(char * s1, size_t s1max, const char * s2);
extern int b_strcpy_s(char * s1, size_t s1max, const char * s2); int b_strcpy_s(char * s1, size_t s1max, const char * s2);
/* math functions */
double sqrt(double x);
double floor(double x);
double ceil(double x);
double fmin(double x, double y);
double fmax(double x, double y);
double rint(double x);
double fabs(double x);
double trunc(double x);
int signbit(double x);
int isnan(double x);
int bh_platform_init();
#endif #endif

View File

@ -16,9 +16,9 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "bh_platform.h"
#include "wasm_assert.h" #include "wasm_assert.h"
#include "wasm_log.h" #include "wasm_log.h"
#include "wasm_platform.h"
#include "wasm_platform_log.h" #include "wasm_platform_log.h"
#include "wasm_thread.h" #include "wasm_thread.h"
#include "wasm_export.h" #include "wasm_export.h"

View File

@ -53,9 +53,8 @@ target_include_directories(app PRIVATE ${IWASM_ROOT}/runtime/include
${CMAKE_CURRENT_SOURCE_DIR}/../src/platform/zephyr ${CMAKE_CURRENT_SOURCE_DIR}/../src/platform/zephyr
) )
set (IWASM_SRCS ${IWASM_ROOT}/runtime/platform/zephyr/wasm_math.c set (IWASM_SRCS
${IWASM_ROOT}/runtime/platform/zephyr/wasm_native.c ${IWASM_ROOT}/runtime/platform/zephyr/wasm_native.c
${IWASM_ROOT}/runtime/platform/zephyr/wasm_platform.c
${IWASM_ROOT}/runtime/utils/wasm_dlfcn.c ${IWASM_ROOT}/runtime/utils/wasm_dlfcn.c
${IWASM_ROOT}/runtime/utils/wasm_hashmap.c ${IWASM_ROOT}/runtime/utils/wasm_hashmap.c
${IWASM_ROOT}/runtime/utils/wasm_log.c ${IWASM_ROOT}/runtime/utils/wasm_log.c
@ -92,6 +91,7 @@ set (IWASM_SRCS ${IWASM_ROOT}/runtime/platform/zephyr/wasm_math.c
${SHARED_LIB_ROOT}/platform/zephyr/bh_platform_log.c ${SHARED_LIB_ROOT}/platform/zephyr/bh_platform_log.c
${SHARED_LIB_ROOT}/platform/zephyr/bh_thread.c ${SHARED_LIB_ROOT}/platform/zephyr/bh_thread.c
${SHARED_LIB_ROOT}/platform/zephyr/bh_time.c ${SHARED_LIB_ROOT}/platform/zephyr/bh_time.c
${SHARED_LIB_ROOT}/platform/zephyr/bh_math.c
${SHARED_LIB_ROOT}/mem-alloc/bh_memory.c ${SHARED_LIB_ROOT}/mem-alloc/bh_memory.c
${SHARED_LIB_ROOT}/mem-alloc/mem_alloc.c ${SHARED_LIB_ROOT}/mem-alloc/mem_alloc.c
${SHARED_LIB_ROOT}/mem-alloc/ems/ems_alloc.c ${SHARED_LIB_ROOT}/mem-alloc/ems/ems_alloc.c