mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
Implementing system call sequences in plain assembler routines; removing -fomit-frame-pointer for non-optimized builds.
This commit is contained in:
parent
ef012d9cd4
commit
668eef73c8
@ -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
|
||||
|
||||
@ -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]; \
|
||||
|
||||
@ -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; \
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user