Implementing system call sequences in plain assembler routines; removing -fomit-frame-pointer for non-optimized builds.

This commit is contained in:
Ruben Ayrapetyan 2014-12-02 15:42:09 +03:00
parent ef012d9cd4
commit 668eef73c8
5 changed files with 99 additions and 81 deletions

View File

@ -212,7 +212,7 @@ CFLAGS_WERROR ?= -Werror
CFLAGS_WFATAL_ERRORS ?= -Wfatal-errors
# Optimizations
CFLAGS_OPTIMIZE ?= -Os -flto
CFLAGS_OPTIMIZE ?= -Os -fomit-frame-pointer -flto
CFLAGS_NO_OPTIMIZE ?= -O0
LDFLAGS_OPTIMIZE ?=
LDFLAGS_NO_OPTIMIZE ?=
@ -366,7 +366,7 @@ ifeq ($(OPTION_MCU),disable)
endif
endif
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
CFLAGS_COMMON += -ffunction-sections -fdata-sections -nostdlib
DEFINES_JERRY += -D__TARGET_MCU

View File

@ -17,55 +17,55 @@
#define ASM_ARM_H
/*
* mov syscall_no -> %r7
* mov arg1 -> %r0
* svc
* mov %r0 -> ret
* mov syscall_no (%r0) -> %r7
* mov arg1 (%r1) -> %r0
* svc #0
*/
#define SYSCALL_1(syscall_no, arg1, ret) \
__asm volatile ("mov r0, %[arg1]\n" \
"mov r7, %[syscall_no]\n" \
"svc #0\n" \
"mov %[ret], r0\n" \
: [ret] "=r" (ret) \
: [syscall_no] "r" (syscall_no), [arg1] "r" (arg1) \
: "r0", "r1", "r2", "r3", "r7", "r9", "memory");
#define SYSCALL_1 \
push {r4-r12, lr}; \
\
mov r7, r0; \
mov r0, r1; \
\
svc #0; \
\
pop {r4-r12, pc};
/*
* mov syscall_no -> %r7
* mov arg1 -> %r0
* mov arg2 -> %r1
* syscall
* mov %r0 -> ret
* mov syscall_no (%r0) -> %r7
* mov arg1 (%r1) -> %r0
* mov arg2 (%r2) -> %r1
* svc #0
*/
#define SYSCALL_2(syscall_no, arg1, arg2, ret) \
__asm volatile ("mov r0, %[arg1]\n" \
"mov r1, %[arg2]\n" \
"mov r7, %[syscall_no]\n" \
"svc #0\n" \
"mov %[ret], r0\n" \
: [ret] "=r" (ret) \
: [syscall_no] "r" (syscall_no), [arg1] "r" (arg1), [arg2] "r" (arg2) \
: "r0", "r1", "r2", "r3", "r7", "r9", "memory");
#define SYSCALL_2 \
push {r4-r12, lr}; \
\
mov r7, r0; \
mov r0, r1; \
mov r1, r2; \
\
svc #0; \
\
pop {r4-r12, pc};
/*
* mov syscall_no -> %r7
* mov arg1 -> %r0
* mov arg2 -> %r1
* mov arg3 -> %r2
* syscall
* mov %r0 -> ret
* mov syscall_no (%r0) -> %r7
* mov arg1 (%r1) -> %r0
* mov arg2 (%r2) -> %r1
* mov arg3 (%r3) -> %r2
* svc #0
*/
#define SYSCALL_3(syscall_no, arg1, arg2, arg3, ret) \
__asm volatile ("mov r0, %[arg1]\n" \
"mov r1, %[arg2]\n" \
"mov r2, %[arg3]\n" \
"mov r7, %[syscall_no]\n" \
"svc #0\n" \
"mov %[ret], r0\n" \
: [ret] "=r" (ret) \
: [syscall_no] "r" (syscall_no), [arg1] "r" (arg1), [arg2] "r" (arg2), [arg3] "r" (arg3) \
: "r0", "r1", "r2", "r3", "r7", "r9", "memory");
#define SYSCALL_3 \
push {r4-r12, lr}; \
\
mov r7, r0; \
mov r0, r1; \
mov r1, r2; \
mov r2, r3; \
\
svc #0; \
\
pop {r4-r12, pc};
#define _START \
ldr r0, [sp, #0]; \

View File

@ -17,43 +17,43 @@
#define ASM_X64_H
/*
* mov syscall_no -> %rax
* mov arg1 -> %rdi
* mov syscall_no (%rdi) -> %rax
* mov arg1 (%rsi) -> %rdi
* syscall
* mov %rax -> ret
*/
#define SYSCALL_1(syscall_no, arg1, ret) \
__asm volatile ("syscall" \
: "=a" (ret) \
: "a" (syscall_no), "D" (arg1) \
: "rcx", "r11");
#define SYSCALL_1 \
mov %rdi, %rax; \
mov %rsi, %rdi; \
syscall; \
ret;
/*
* mov syscall_no -> %rax
* mov arg1 -> %rdi
* mov arg2 -> %rsi
* mov syscall_no (%rdi) -> %rax
* mov arg1 (%rsi) -> %rdi
* mov arg2 (%rdx) -> %rsi
* syscall
* mov %rax -> ret
*/
#define SYSCALL_2(syscall_no, arg1, arg2, ret) \
__asm volatile ("syscall" \
: "=a" (ret) \
: "a" (syscall_no), "D" (arg1), "S" (arg2) \
: "rcx", "r11");
#define SYSCALL_2 \
mov %rdi, %rax; \
mov %rsi, %rdi; \
mov %rdx, %rsi; \
syscall; \
ret;
/*
* mov syscall_no -> %rax
* mov arg1 -> %rdi
* mov arg2 -> %rsi
* mov arg3 -> %rdx
* mov syscall_no (%rdi) -> %rax
* mov arg1 (%rsi) -> %rdi
* mov arg2 (%rdx) -> %rsi
* mov arg3 (%rcx) -> %rdx
* syscall
* mov %rax -> ret
*/
#define SYSCALL_3(syscall_no, arg1, arg2, arg3, ret) \
__asm volatile ("syscall" \
: "=a" (ret) \
: "a" (syscall_no), "D" (arg1), "S" (arg2), "d" (arg3) \
: "rcx", "r11");
#define SYSCALL_3 \
mov %rdi, %rax; \
mov %rsi, %rdi; \
mov %rdx, %rsi; \
mov %rcx, %rdx; \
syscall; \
ret;
#define _START \
mov (%rsp), %rdi; \

View File

@ -9,6 +9,26 @@
#endif /* !__TARGET_HOST_x64 && !__TARGET_HOST_x86 && !__TARGET_HOST_ARMv7 */
.global _start
.type _start, %function
_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

View File

@ -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_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.
*
@ -69,9 +73,7 @@ static __noinline long int
syscall_1 (long int syscall_no, /**< syscall number */
long int arg1) /**< argument */
{
long int ret;
SYSCALL_1 (syscall_no, arg1, ret);
long int ret = syscall_1_asm (syscall_no, arg1);
LIBC_EXIT_ON_ERROR(ret);
@ -88,9 +90,7 @@ syscall_2 (long int syscall_no, /**< syscall number */
long int arg1, /**< first argument */
long int arg2) /**< second argument */
{
long int ret;
SYSCALL_2 (syscall_no, arg1, arg2, ret);
long int ret = syscall_2_asm (syscall_no, arg1, arg2);
LIBC_EXIT_ON_ERROR(ret);
@ -108,9 +108,7 @@ syscall_3 (long int syscall_no, /**< syscall number */
long int arg2, /**< second argument */
long int arg3) /**< third argument */
{
long int ret;
SYSCALL_3 (syscall_no, arg1, arg2, arg3, ret);
long int ret = syscall_3_asm (syscall_no, arg1, arg2, arg3);
LIBC_EXIT_ON_ERROR(ret);