From 668eef73c8951b357bea50ba025e75c55e07d662 Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Tue, 2 Dec 2014 15:42:09 +0300 Subject: [PATCH] Implementing system call sequences in plain assembler routines; removing -fomit-frame-pointer for non-optimized builds. --- Makefile.mk | 4 +- src/libruntime/target/linux/asm_arm.h | 84 +++++++++---------- src/libruntime/target/linux/asm_x64.h | 54 ++++++------ .../linux/{jerry-start.S => jerry-asm.S} | 22 ++++- src/libruntime/target/linux/jerry-libc.c | 16 ++-- 5 files changed, 99 insertions(+), 81 deletions(-) rename src/libruntime/target/linux/{jerry-start.S => jerry-asm.S} (50%) diff --git a/Makefile.mk b/Makefile.mk index 7fb3500f2..c17a269c0 100644 --- a/Makefile.mk +++ b/Makefile.mk @@ -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 diff --git a/src/libruntime/target/linux/asm_arm.h b/src/libruntime/target/linux/asm_arm.h index cc66878a3..af97d4a6b 100644 --- a/src/libruntime/target/linux/asm_arm.h +++ b/src/libruntime/target/linux/asm_arm.h @@ -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]; \ diff --git a/src/libruntime/target/linux/asm_x64.h b/src/libruntime/target/linux/asm_x64.h index dc9a01e44..498a36850 100644 --- a/src/libruntime/target/linux/asm_x64.h +++ b/src/libruntime/target/linux/asm_x64.h @@ -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; \ diff --git a/src/libruntime/target/linux/jerry-start.S b/src/libruntime/target/linux/jerry-asm.S similarity index 50% rename from src/libruntime/target/linux/jerry-start.S rename to src/libruntime/target/linux/jerry-asm.S index e06471aba..6162650b0 100644 --- a/src/libruntime/target/linux/jerry-start.S +++ b/src/libruntime/target/linux/jerry-asm.S @@ -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 + diff --git a/src/libruntime/target/linux/jerry-libc.c b/src/libruntime/target/linux/jerry-libc.c index 66cf5dab0..aa845229c 100644 --- a/src/libruntime/target/linux/jerry-libc.c +++ b/src/libruntime/target/linux/jerry-libc.c @@ -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);