Implementing system call sequences in plain assembler routines; removing -fomit-frame-pointer for non-optimized builds.
This commit is contained in:
+2
-2
@@ -212,7 +212,7 @@ CFLAGS_WERROR ?= -Werror
|
|||||||
CFLAGS_WFATAL_ERRORS ?= -Wfatal-errors
|
CFLAGS_WFATAL_ERRORS ?= -Wfatal-errors
|
||||||
|
|
||||||
# Optimizations
|
# Optimizations
|
||||||
CFLAGS_OPTIMIZE ?= -Os -flto
|
CFLAGS_OPTIMIZE ?= -Os -fomit-frame-pointer -flto
|
||||||
CFLAGS_NO_OPTIMIZE ?= -O0
|
CFLAGS_NO_OPTIMIZE ?= -O0
|
||||||
LDFLAGS_OPTIMIZE ?=
|
LDFLAGS_OPTIMIZE ?=
|
||||||
LDFLAGS_NO_OPTIMIZE ?=
|
LDFLAGS_NO_OPTIMIZE ?=
|
||||||
@@ -366,7 +366,7 @@ ifeq ($(OPTION_MCU),disable)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
DEFINES_JERRY += -D__TARGET_HOST -DJERRY_SOURCE_BUFFER_SIZE=$$((1024*1024))
|
DEFINES_JERRY += -D__TARGET_HOST -DJERRY_SOURCE_BUFFER_SIZE=$$((1024*1024))
|
||||||
CFLAGS_COMMON += -fomit-frame-pointer -fno-stack-protector
|
CFLAGS_COMMON += -fno-stack-protector
|
||||||
else
|
else
|
||||||
CFLAGS_COMMON += -ffunction-sections -fdata-sections -nostdlib
|
CFLAGS_COMMON += -ffunction-sections -fdata-sections -nostdlib
|
||||||
DEFINES_JERRY += -D__TARGET_MCU
|
DEFINES_JERRY += -D__TARGET_MCU
|
||||||
|
|||||||
@@ -17,55 +17,55 @@
|
|||||||
#define ASM_ARM_H
|
#define ASM_ARM_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mov syscall_no -> %r7
|
* mov syscall_no (%r0) -> %r7
|
||||||
* mov arg1 -> %r0
|
* mov arg1 (%r1) -> %r0
|
||||||
* svc
|
* svc #0
|
||||||
* mov %r0 -> ret
|
|
||||||
*/
|
*/
|
||||||
#define SYSCALL_1(syscall_no, arg1, ret) \
|
#define SYSCALL_1 \
|
||||||
__asm volatile ("mov r0, %[arg1]\n" \
|
push {r4-r12, lr}; \
|
||||||
"mov r7, %[syscall_no]\n" \
|
\
|
||||||
"svc #0\n" \
|
mov r7, r0; \
|
||||||
"mov %[ret], r0\n" \
|
mov r0, r1; \
|
||||||
: [ret] "=r" (ret) \
|
\
|
||||||
: [syscall_no] "r" (syscall_no), [arg1] "r" (arg1) \
|
svc #0; \
|
||||||
: "r0", "r1", "r2", "r3", "r7", "r9", "memory");
|
\
|
||||||
|
pop {r4-r12, pc};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mov syscall_no -> %r7
|
* mov syscall_no (%r0) -> %r7
|
||||||
* mov arg1 -> %r0
|
* mov arg1 (%r1) -> %r0
|
||||||
* mov arg2 -> %r1
|
* mov arg2 (%r2) -> %r1
|
||||||
* syscall
|
* svc #0
|
||||||
* mov %r0 -> ret
|
|
||||||
*/
|
*/
|
||||||
#define SYSCALL_2(syscall_no, arg1, arg2, ret) \
|
#define SYSCALL_2 \
|
||||||
__asm volatile ("mov r0, %[arg1]\n" \
|
push {r4-r12, lr}; \
|
||||||
"mov r1, %[arg2]\n" \
|
\
|
||||||
"mov r7, %[syscall_no]\n" \
|
mov r7, r0; \
|
||||||
"svc #0\n" \
|
mov r0, r1; \
|
||||||
"mov %[ret], r0\n" \
|
mov r1, r2; \
|
||||||
: [ret] "=r" (ret) \
|
\
|
||||||
: [syscall_no] "r" (syscall_no), [arg1] "r" (arg1), [arg2] "r" (arg2) \
|
svc #0; \
|
||||||
: "r0", "r1", "r2", "r3", "r7", "r9", "memory");
|
\
|
||||||
|
pop {r4-r12, pc};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mov syscall_no -> %r7
|
* mov syscall_no (%r0) -> %r7
|
||||||
* mov arg1 -> %r0
|
* mov arg1 (%r1) -> %r0
|
||||||
* mov arg2 -> %r1
|
* mov arg2 (%r2) -> %r1
|
||||||
* mov arg3 -> %r2
|
* mov arg3 (%r3) -> %r2
|
||||||
* syscall
|
* svc #0
|
||||||
* mov %r0 -> ret
|
|
||||||
*/
|
*/
|
||||||
#define SYSCALL_3(syscall_no, arg1, arg2, arg3, ret) \
|
#define SYSCALL_3 \
|
||||||
__asm volatile ("mov r0, %[arg1]\n" \
|
push {r4-r12, lr}; \
|
||||||
"mov r1, %[arg2]\n" \
|
\
|
||||||
"mov r2, %[arg3]\n" \
|
mov r7, r0; \
|
||||||
"mov r7, %[syscall_no]\n" \
|
mov r0, r1; \
|
||||||
"svc #0\n" \
|
mov r1, r2; \
|
||||||
"mov %[ret], r0\n" \
|
mov r2, r3; \
|
||||||
: [ret] "=r" (ret) \
|
\
|
||||||
: [syscall_no] "r" (syscall_no), [arg1] "r" (arg1), [arg2] "r" (arg2), [arg3] "r" (arg3) \
|
svc #0; \
|
||||||
: "r0", "r1", "r2", "r3", "r7", "r9", "memory");
|
\
|
||||||
|
pop {r4-r12, pc};
|
||||||
|
|
||||||
#define _START \
|
#define _START \
|
||||||
ldr r0, [sp, #0]; \
|
ldr r0, [sp, #0]; \
|
||||||
|
|||||||
@@ -17,43 +17,43 @@
|
|||||||
#define ASM_X64_H
|
#define ASM_X64_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mov syscall_no -> %rax
|
* mov syscall_no (%rdi) -> %rax
|
||||||
* mov arg1 -> %rdi
|
* mov arg1 (%rsi) -> %rdi
|
||||||
* syscall
|
* syscall
|
||||||
* mov %rax -> ret
|
|
||||||
*/
|
*/
|
||||||
#define SYSCALL_1(syscall_no, arg1, ret) \
|
#define SYSCALL_1 \
|
||||||
__asm volatile ("syscall" \
|
mov %rdi, %rax; \
|
||||||
: "=a" (ret) \
|
mov %rsi, %rdi; \
|
||||||
: "a" (syscall_no), "D" (arg1) \
|
syscall; \
|
||||||
: "rcx", "r11");
|
ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mov syscall_no -> %rax
|
* mov syscall_no (%rdi) -> %rax
|
||||||
* mov arg1 -> %rdi
|
* mov arg1 (%rsi) -> %rdi
|
||||||
* mov arg2 -> %rsi
|
* mov arg2 (%rdx) -> %rsi
|
||||||
* syscall
|
* syscall
|
||||||
* mov %rax -> ret
|
|
||||||
*/
|
*/
|
||||||
#define SYSCALL_2(syscall_no, arg1, arg2, ret) \
|
#define SYSCALL_2 \
|
||||||
__asm volatile ("syscall" \
|
mov %rdi, %rax; \
|
||||||
: "=a" (ret) \
|
mov %rsi, %rdi; \
|
||||||
: "a" (syscall_no), "D" (arg1), "S" (arg2) \
|
mov %rdx, %rsi; \
|
||||||
: "rcx", "r11");
|
syscall; \
|
||||||
|
ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mov syscall_no -> %rax
|
* mov syscall_no (%rdi) -> %rax
|
||||||
* mov arg1 -> %rdi
|
* mov arg1 (%rsi) -> %rdi
|
||||||
* mov arg2 -> %rsi
|
* mov arg2 (%rdx) -> %rsi
|
||||||
* mov arg3 -> %rdx
|
* mov arg3 (%rcx) -> %rdx
|
||||||
* syscall
|
* syscall
|
||||||
* mov %rax -> ret
|
|
||||||
*/
|
*/
|
||||||
#define SYSCALL_3(syscall_no, arg1, arg2, arg3, ret) \
|
#define SYSCALL_3 \
|
||||||
__asm volatile ("syscall" \
|
mov %rdi, %rax; \
|
||||||
: "=a" (ret) \
|
mov %rsi, %rdi; \
|
||||||
: "a" (syscall_no), "D" (arg1), "S" (arg2), "d" (arg3) \
|
mov %rdx, %rsi; \
|
||||||
: "rcx", "r11");
|
mov %rcx, %rdx; \
|
||||||
|
syscall; \
|
||||||
|
ret;
|
||||||
|
|
||||||
#define _START \
|
#define _START \
|
||||||
mov (%rsp), %rdi; \
|
mov (%rsp), %rdi; \
|
||||||
|
|||||||
+21
-1
@@ -9,6 +9,26 @@
|
|||||||
#endif /* !__TARGET_HOST_x64 && !__TARGET_HOST_x86 && !__TARGET_HOST_ARMv7 */
|
#endif /* !__TARGET_HOST_x64 && !__TARGET_HOST_x86 && !__TARGET_HOST_ARMv7 */
|
||||||
|
|
||||||
.global _start
|
.global _start
|
||||||
|
.type _start, %function
|
||||||
_start:
|
_start:
|
||||||
_START
|
_START
|
||||||
.end _start
|
.size _start, . - _start
|
||||||
|
|
||||||
|
.global syscall_1_asm
|
||||||
|
.type syscall_1_asm, %function
|
||||||
|
syscall_1_asm:
|
||||||
|
SYSCALL_1
|
||||||
|
.size syscall_1_asm, . - syscall_1_asm
|
||||||
|
|
||||||
|
.global syscall_2_asm
|
||||||
|
.type syscall_2_asm, %function
|
||||||
|
syscall_2_asm:
|
||||||
|
SYSCALL_2
|
||||||
|
.size syscall_2_asm, . - syscall_2_asm
|
||||||
|
|
||||||
|
.global syscall_3_asm
|
||||||
|
.type syscall_3_asm, %function
|
||||||
|
syscall_3_asm:
|
||||||
|
SYSCALL_3
|
||||||
|
.size syscall_3_asm, . - syscall_3_asm
|
||||||
|
|
||||||
@@ -60,6 +60,10 @@ static long int syscall_1 (long int syscall_no, long int arg1);
|
|||||||
static long int syscall_2 (long int syscall_no, long int arg1, long int arg2);
|
static long int syscall_2 (long int syscall_no, long int arg1, long int arg2);
|
||||||
static long int syscall_3 (long int syscall_no, long int arg1, long int arg2, long int arg3);
|
static long int syscall_3 (long int syscall_no, long int arg1, long int arg2, long int arg3);
|
||||||
|
|
||||||
|
extern long int syscall_1_asm (long int syscall_no, long int arg1);
|
||||||
|
extern long int syscall_2_asm (long int syscall_no, long int arg1, long int arg2);
|
||||||
|
extern long int syscall_3_asm (long int syscall_no, long int arg1, long int arg2, long int arg3);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* System call with one argument.
|
* System call with one argument.
|
||||||
*
|
*
|
||||||
@@ -69,9 +73,7 @@ static __noinline long int
|
|||||||
syscall_1 (long int syscall_no, /**< syscall number */
|
syscall_1 (long int syscall_no, /**< syscall number */
|
||||||
long int arg1) /**< argument */
|
long int arg1) /**< argument */
|
||||||
{
|
{
|
||||||
long int ret;
|
long int ret = syscall_1_asm (syscall_no, arg1);
|
||||||
|
|
||||||
SYSCALL_1 (syscall_no, arg1, ret);
|
|
||||||
|
|
||||||
LIBC_EXIT_ON_ERROR(ret);
|
LIBC_EXIT_ON_ERROR(ret);
|
||||||
|
|
||||||
@@ -88,9 +90,7 @@ syscall_2 (long int syscall_no, /**< syscall number */
|
|||||||
long int arg1, /**< first argument */
|
long int arg1, /**< first argument */
|
||||||
long int arg2) /**< second argument */
|
long int arg2) /**< second argument */
|
||||||
{
|
{
|
||||||
long int ret;
|
long int ret = syscall_2_asm (syscall_no, arg1, arg2);
|
||||||
|
|
||||||
SYSCALL_2 (syscall_no, arg1, arg2, ret);
|
|
||||||
|
|
||||||
LIBC_EXIT_ON_ERROR(ret);
|
LIBC_EXIT_ON_ERROR(ret);
|
||||||
|
|
||||||
@@ -108,9 +108,7 @@ syscall_3 (long int syscall_no, /**< syscall number */
|
|||||||
long int arg2, /**< second argument */
|
long int arg2, /**< second argument */
|
||||||
long int arg3) /**< third argument */
|
long int arg3) /**< third argument */
|
||||||
{
|
{
|
||||||
long int ret;
|
long int ret = syscall_3_asm (syscall_no, arg1, arg2, arg3);
|
||||||
|
|
||||||
SYSCALL_3 (syscall_no, arg1, arg2, arg3, ret);
|
|
||||||
|
|
||||||
LIBC_EXIT_ON_ERROR(ret);
|
LIBC_EXIT_ON_ERROR(ret);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user