Skip to content

Commit 2b12e2c

Browse files
authored
Add thumb target, implement xtensa invokeNative asm code and update makefiles (#151)
1 parent 5875a37 commit 2b12e2c

File tree

21 files changed

+372
-131
lines changed

21 files changed

+372
-131
lines changed

core/iwasm/lib/native/libc/wasmtime-wasi-c/sandboxed-system-primitives/src/posix.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,11 @@ static int fd_number(
557557
return number;
558558
}
559559

560+
#define CLOSE_NON_STD_FD(fd) do { \
561+
if (fd > 2) \
562+
close(fd); \
563+
} while (0)
564+
560565
// Lowers the reference count on a file descriptor object. When the
561566
// reference count reaches zero, its resources are cleaned up.
562567
static void fd_object_release(
@@ -569,13 +574,13 @@ static void fd_object_release(
569574
// closedir() on it also closes the underlying file descriptor.
570575
mutex_destroy(&fo->directory.lock);
571576
if (fo->directory.handle == NULL) {
572-
close(fd_number(fo));
577+
CLOSE_NON_STD_FD(fd_number(fo));
573578
} else {
574579
closedir(fo->directory.handle);
575580
}
576581
break;
577582
default:
578-
close(fd_number(fo));
583+
CLOSE_NON_STD_FD(fd_number(fo));
579584
break;
580585
}
581586
bh_free(fo);
Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,33 @@ NAME := iwasm
55
IWASM_ROOT := iwasm
66
SHARED_LIB_ROOT := shared-lib
77

8+
# Change it to THUMBV7M if you want to build for developerkit
9+
BUILD_TARGET := X86_32
10+
11+
ifeq (${BUILD_TARGET}, X86_32)
12+
GLOBAL_DEFINES += BUILD_TARGET_X86_32
13+
INVOKE_NATIVE := invokeNative_ia32.s
14+
else ifeq (${BUILD_TARGET}, X86_64)
15+
GLOBAL_DEFINES += BUILD_TARGET_X86_64
16+
INVOKE_NATIVE := invokeNative_em64.s
17+
else ifeq ($(findstring ARM,$(BUILD_TARGET)), ARM)
18+
GLOBAL_DEFINES += BUILD_TARGET_ARM
19+
GLOBAL_DEFINES += BUILD_TARGET=${BUILD_TARGET}
20+
INVOKE_NATIVE := invokeNative_arm.s
21+
else ifeq ($(findstring THUMB,$(BUILD_TARGET)), THUMB)
22+
GLOBAL_DEFINES += BUILD_TARGET_THUMB
23+
GLOBAL_DEFINES += BUILD_TARGET=${BUILD_TARGET}
24+
INVOKE_NATIVE := invokeNative_thumb.s
25+
else ifeq (${BUILD_TARGET}, MIPS)
26+
GLOBAL_DEFINES += BUILD_TARGET_MIPS
27+
INVOKE_NATIVE := invokeNative_mips.s
28+
else ifeq (${BUILD_TARGET}, XTENSA)
29+
GLOBAL_DEFINES += BUILD_TARGET_XTENSA
30+
INVOKE_NATIVE := invokeNative_xtensa.s
31+
else
32+
$(error Build target isn't set)
33+
endif
34+
835
GLOBAL_DEFINES += NVALGRIND
936
GLOBAL_INCLUDES += ${IWASM_ROOT}/runtime/include \
1037
${IWASM_ROOT}/runtime/platform/include \
@@ -21,7 +48,7 @@ $(NAME)_SOURCES := ${IWASM_ROOT}/runtime/utils/wasm_hashmap.c \
2148
${IWASM_ROOT}/runtime/vmcore-wasm/wasm_interp.c \
2249
${IWASM_ROOT}/runtime/vmcore-wasm/wasm_loader.c \
2350
${IWASM_ROOT}/runtime/vmcore-wasm/wasm_runtime.c \
24-
${IWASM_ROOT}/runtime/vmcore-wasm/invokeNative_general.c \
51+
${IWASM_ROOT}/runtime/vmcore-wasm/${INVOKE_NATIVE} \
2552
${IWASM_ROOT}/lib/native/libc/libc_builtin_wrapper.c \
2653
${IWASM_ROOT}/lib/native/base/base_lib_export.c \
2754
${SHARED_LIB_ROOT}/platform/alios/bh_platform.c \

core/iwasm/products/darwin/CMakeLists.txt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ if (NOT ("$ENV{VALGRIND}" STREQUAL "YES"))
1616
endif ()
1717

1818
# Set BUILD_TARGET, currently values supported:
19-
# "X86_64", "AMD_64", "X86_32", "ARM_32", "MIPS_32", "XTENSA_32"
19+
# "X86_64", "AMD_64", "X86_32", "ARM[sub]", "THUMB[sub]", "MIPS", "XTENSA"
2020
if (NOT DEFINED BUILD_TARGET)
2121
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
2222
# Build as X86_64 by default in 64-bit platform
@@ -36,12 +36,16 @@ elseif (BUILD_TARGET STREQUAL "AMD_64")
3636
add_definitions(-DBUILD_TARGET_AMD_64)
3737
elseif (BUILD_TARGET STREQUAL "X86_32")
3838
add_definitions(-DBUILD_TARGET_X86_32)
39-
elseif (BUILD_TARGET STREQUAL "ARM_32")
40-
add_definitions(-DBUILD_TARGET_ARM_32)
41-
elseif (BUILD_TARGET STREQUAL "MIPS_32")
42-
add_definitions(-DBUILD_TARGET_MIPS_32)
43-
elseif (BUILD_TARGET STREQUAL "XTENSA_32")
44-
add_definitions(-DBUILD_TARGET_XTENSA_32)
39+
elseif (BUILD_TARGET MATCHES "ARM.*")
40+
add_definitions(-DBUILD_TARGET_ARM)
41+
add_definitions(-DBUILD_TARGET="${BUILD_TARGET}")
42+
elseif (BUILD_TARGET MATCHES "THUMB.*")
43+
add_definitions(-DBUILD_TARGET_THUMB)
44+
add_definitions(-DBUILD_TARGET="${BUILD_TARGET}")
45+
elseif (BUILD_TARGET STREQUAL "MIPS")
46+
add_definitions(-DBUILD_TARGET_MIPS)
47+
elseif (BUILD_TARGET STREQUAL "XTENSA")
48+
add_definitions(-DBUILD_TARGET_XTENSA)
4549
else ()
4650
message (FATAL_ERROR "-- Build target isn't set")
4751
endif ()

core/iwasm/products/linux/CMakeLists.txt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ if (NOT ("$ENV{VALGRIND}" STREQUAL "YES"))
1616
endif ()
1717

1818
# Set BUILD_TARGET, currently values supported:
19-
# "X86_64", "AMD_64", "X86_32", "ARM_32", "MIPS_32", "XTENSA_32"
19+
# "X86_64", "AMD_64", "X86_32", "ARM[sub]", "THUMB[sub]", "MIPS", "XTENSA"
2020
if (NOT DEFINED BUILD_TARGET)
2121
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
2222
# Build as X86_64 by default in 64-bit platform
@@ -36,12 +36,16 @@ elseif (BUILD_TARGET STREQUAL "AMD_64")
3636
add_definitions(-DBUILD_TARGET_AMD_64)
3737
elseif (BUILD_TARGET STREQUAL "X86_32")
3838
add_definitions(-DBUILD_TARGET_X86_32)
39-
elseif (BUILD_TARGET STREQUAL "ARM_32")
40-
add_definitions(-DBUILD_TARGET_ARM_32)
41-
elseif (BUILD_TARGET STREQUAL "MIPS_32")
42-
add_definitions(-DBUILD_TARGET_MIPS_32)
43-
elseif (BUILD_TARGET STREQUAL "XTENSA_32")
44-
add_definitions(-DBUILD_TARGET_XTENSA_32)
39+
elseif (BUILD_TARGET MATCHES "ARM.*")
40+
add_definitions(-DBUILD_TARGET_ARM)
41+
add_definitions(-DBUILD_TARGET="${BUILD_TARGET}")
42+
elseif (BUILD_TARGET MATCHES "THUMB.*")
43+
add_definitions(-DBUILD_TARGET_THUMB)
44+
add_definitions(-DBUILD_TARGET="${BUILD_TARGET}")
45+
elseif (BUILD_TARGET STREQUAL "MIPS")
46+
add_definitions(-DBUILD_TARGET_MIPS)
47+
elseif (BUILD_TARGET STREQUAL "XTENSA")
48+
add_definitions(-DBUILD_TARGET_XTENSA)
4549
else ()
4650
message (FATAL_ERROR "-- Build target isn't set")
4751
endif ()

core/iwasm/products/vxworks/CMakeLists.txt

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ if (NOT ("$ENV{VALGRIND}" STREQUAL "YES"))
2121
endif ()
2222

2323
# Set BUILD_TARGET, currently values supported:
24-
# "X86_64", "AMD_64", "X86_32", "ARM_32", "MIPS_32", "XTENSA_32", "GENERAL"
24+
# "X86_64", "AMD_64", "X86_32", "ARM[sub]", "THUMB[sub]", "MIPS", "XTENSA"
2525
#set (BUILD_TARGET "X86_64")
2626

2727
if (NOT DEFINED BUILD_TARGET)
@@ -45,20 +45,16 @@ elseif (BUILD_TARGET STREQUAL "AMD_64")
4545
add_definitions(-DBUILD_TARGET_AMD_64)
4646
elseif (BUILD_TARGET STREQUAL "X86_32")
4747
add_definitions(-DBUILD_TARGET_X86_32)
48-
elseif (BUILD_TARGET STREQUAL "ARM_32")
49-
add_definitions(-DBUILD_TARGET_ARM_32)
50-
elseif (BUILD_TARGET STREQUAL "MIPS_32")
51-
add_definitions(-DBUILD_TARGET_MIPS_32)
52-
elseif (BUILD_TARGET STREQUAL "XTENSA_32")
53-
add_definitions(-DBUILD_TARGET_XTENSA_32)
54-
elseif (BUILD_TARGET STREQUAL "GENERAL")
55-
# Will use invokeNative_general.c instead of assembly code,
56-
# but the maximum number of native arguments is limited to 20,
57-
# and there are possible issues when passing arguments to
58-
# native function for some cpus, e.g. int64 and double arguments
59-
# in arm and mips need to be 8-bytes aligned, and some arguments
60-
# of x86_64 are passed by registers but not stack
61-
add_definitions(-DBUILD_TARGET_GENERAL)
48+
elseif (BUILD_TARGET MATCHES "ARM.*")
49+
add_definitions(-DBUILD_TARGET_ARM)
50+
add_definitions(-DBUILD_TARGET="${BUILD_TARGET}")
51+
elseif (BUILD_TARGET MATCHES "THUMB.*")
52+
add_definitions(-DBUILD_TARGET_THUMB)
53+
add_definitions(-DBUILD_TARGET="${BUILD_TARGET}")
54+
elseif (BUILD_TARGET STREQUAL "MIPS")
55+
add_definitions(-DBUILD_TARGET_MIPS)
56+
elseif (BUILD_TARGET STREQUAL "XTENSA")
57+
add_definitions(-DBUILD_TARGET_XTENSA)
6258
else ()
6359
message (FATAL_ERROR "-- Build target isn't set")
6460
endif ()

core/iwasm/products/zephyr/simple/CMakeLists.txt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ set (PLATFORM "zephyr")
1212

1313
add_definitions (-DNVALGRIND)
1414

15-
# Build as X86_32 by default, change to "ARM_32", "MIPS_32" or "XTENSA_32"
16-
# if we want to support arm, mips or xtensa
15+
# Build as X86_32 by default, change to "ARM[sub]", "THUMB[sub]", "MIPS" or "XTENSA"
16+
# if we want to support arm, thumb, mips or xtensa
1717
if (NOT DEFINED BUILD_TARGET)
1818
set (BUILD_TARGET "X86_32")
1919
endif ()
@@ -22,12 +22,16 @@ string(TOUPPER ${BUILD_TARGET} BUILD_TARGET)
2222

2323
if (BUILD_TARGET STREQUAL "X86_32")
2424
add_definitions(-DBUILD_TARGET_X86_32)
25-
elseif (BUILD_TARGET STREQUAL "ARM_32")
26-
add_definitions(-DBUILD_TARGET_ARM_32)
27-
elseif (BUILD_TARGET STREQUAL "MIPS_32")
28-
add_definitions(-DBUILD_TARGET_MIPS_32)
29-
elseif (BUILD_TARGET STREQUAL "XTENSA_32")
30-
add_definitions(-DBUILD_TARGET_XTENSA_32)
25+
elseif (BUILD_TARGET MATCHES "ARM.*")
26+
add_definitions(-DBUILD_TARGET_ARM)
27+
add_definitions(-DBUILD_TARGET="${BUILD_TARGET}")
28+
elseif (BUILD_TARGET MATCHES "THUMB.*")
29+
add_definitions(-DBUILD_TARGET_THUMB)
30+
add_definitions(-DBUILD_TARGET="${BUILD_TARGET}")
31+
elseif (BUILD_TARGET STREQUAL "MIPS")
32+
add_definitions(-DBUILD_TARGET_MIPS)
33+
elseif (BUILD_TARGET STREQUAL "XTENSA")
34+
add_definitions(-DBUILD_TARGET_XTENSA)
3135
else ()
3236
message (FATAL_ERROR "-- Build target isn't set")
3337
endif ()

core/iwasm/runtime/include/wasm_export.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,9 @@ wasm_runtime_unload(wasm_module_t module);
113113
#if WASM_ENABLE_WASI != 0
114114
void
115115
wasm_runtime_set_wasi_args(wasm_module_t module,
116-
const char *dir_list[], uint32 dir_count,
117-
const char *map_dir_list[], uint32 map_dir_count,
118-
const char *env[], uint32 env_count,
116+
const char *dir_list[], uint32_t dir_count,
117+
const char *map_dir_list[], uint32_t map_dir_count,
118+
const char *env[], uint32_t env_count,
119119
char *argv[], int argc);
120120
#endif
121121

core/iwasm/runtime/vmcore-wasm/invokeNative_arm.s

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,54 +10,59 @@
1010
/*
1111
* Arguments passed in:
1212
*
13-
* r0 function pntr
13+
* r0 function ptr
1414
* r1 argv
1515
* r2 argc
1616
*/
1717

1818
invokeNative:
1919
stmfd sp!, {r4, r5, r6, r7, lr}
20-
mov ip, r0 /* get function ptr */
21-
mov r4, r1 /* get argv */
22-
mov r5, r2 /* get argc */
20+
mov ip, r0 /* ip = function ptr */
21+
mov r4, r1 /* r4 = argv */
22+
mov r5, r2 /* r5 = argc */
2323

24-
cmp r5, #2 /* is argc < 2 ? */
24+
cmp r5, #1 /* at least one argument required: module_inst */
2525
blt return
2626

27-
ldr r0, [r4], #4 /* argv[0] */
28-
ldr r1, [r4], #4 /* argv[1] */
27+
mov r6, #0 /* increased stack size */
2928

30-
mov r6, #0
29+
ldr r0, [r4], #4 /* r0 = argv[0] = module_inst */
30+
cmp r5, #1
31+
beq call_func
3132

33+
ldr r1, [r4], #4 /* r1 = argv[1] */
3234
cmp r5, #2
3335
beq call_func
34-
ldr r2, [r4], #4
36+
37+
ldr r2, [r4], #4 /* r2 = argv[2] */
3538
cmp r5, #3
3639
beq call_func
37-
ldr r3, [r4], #4
3840

39-
subs r5, r5, #4 /* now we have r0 ~ r3 */
41+
ldr r3, [r4], #4 /* r3 = argv[3] */
42+
cmp r5, #4
43+
beq call_func
44+
45+
sub r5, r5, #4 /* argc -= 4, now we have r0 ~ r3 */
4046

4147
/* Ensure address is 8 byte aligned */
42-
mov r6, r5, lsl#2
43-
add r6, r6, #7
48+
mov r6, r5, lsl#2 /* r6 = argc * 4 */
49+
add r6, r6, #7 /* r6 = (r6 + 7) & ~7 */
4450
bic r6, r6, #7
45-
add r6, r6, #4 /* +4 because only odd(5) registers are in stack */
46-
subs sp, sp, r6 /* for stacked args */
51+
add r6, r6, #4 /* +4 because odd(5) registers are in stack */
52+
sub sp, sp, r6 /* reserved stack space for left arguments */
4753
mov r7, sp
4854

49-
loop_args:
55+
loop_args: /* copy left arguments to stack */
5056
cmp r5, #0
5157
beq call_func
5258
ldr lr, [r4], #4
5359
str lr, [r7], #4
54-
subs r5, r5, #1
60+
sub r5, r5, #1
5561
b loop_args
5662

5763
call_func:
5864
blx ip
59-
60-
add sp, sp, r6 /* recover sp */
65+
add sp, sp, r6 /* restore sp */
6166

6267
return:
6368
ldmfd sp!, {r4, r5, r6, r7, lr}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*
2+
* Copyright (C) 2019 Intel Corporation. All rights reserved.
3+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4+
*/
5+
.text
6+
.align 2
7+
.global invokeNative
8+
.type invokeNative,function
9+
10+
/*
11+
* Arguments passed in:
12+
*
13+
* r0 function ptr
14+
* r1 argv
15+
* r2 argc
16+
*/
17+
18+
invokeNative:
19+
push {r4, r5, r6, r7}
20+
push {lr}
21+
mov ip, r0 /* ip = function ptr */
22+
mov r4, r1 /* r4 = argv */
23+
mov r5, r2 /* r5 = argc */
24+
25+
cmp r5, #1 /* at least one argument required: module_inst */
26+
blt return
27+
28+
mov r6, #0 /* increased stack size */
29+
30+
ldr r0, [r4] /* r0 = argv[0] = module_inst */
31+
add r4, r4, #4 /* r4 += 4 */
32+
cmp r5, #1
33+
beq call_func
34+
35+
ldr r1, [r4] /* r1 = argv[1] */
36+
add r4, r4, #4
37+
cmp r5, #2
38+
beq call_func
39+
40+
ldr r2, [r4] /* r2 = argv[2] */
41+
add r4, r4, #4
42+
cmp r5, #3
43+
beq call_func
44+
45+
ldr r3, [r4] /* r3 = argv[3] */
46+
add r4, r4, #4
47+
cmp r5, #4
48+
beq call_func
49+
50+
sub r5, r5, #4 /* argc -= 4, now we have r0 ~ r3 */
51+
52+
/* Ensure address is 8 byte aligned */
53+
lsl r6, r5, #2 /* r6 = argc * 4 */
54+
mov r7, #7
55+
add r6, r6, r7 /* r6 = (r6 + 7) & ~7 */
56+
bic r6, r6, r7
57+
add r6, r6, #4 /* +4 because odd(5) registers are in stack */
58+
mov r7, sp
59+
sub r7, r7, r6 /* reserved stack space for left arguments */
60+
mov sp, r7
61+
62+
mov lr, r2 /* save r2 */
63+
loop_args: /* copy left arguments to stack */
64+
cmp r5, #0
65+
beq call_func1
66+
ldr r2, [r4]
67+
add r4, r4, #4
68+
str r2, [r7]
69+
add r7, r7, #4
70+
sub r5, r5, #1
71+
b loop_args
72+
73+
call_func1:
74+
mov r2, lr /* restore r2 */
75+
76+
call_func:
77+
blx ip
78+
add sp, sp, r6 /* restore sp */
79+
80+
return:
81+
pop {r3}
82+
pop {r4, r5, r6, r7}
83+
mov lr, r3
84+
bx lr

0 commit comments

Comments
 (0)