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
+2 -2
View File
@@ -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
+42 -42
View File
@@ -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]; \
+27 -27
View File
@@ -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; \
@@ -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
+7 -9
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_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);