; System Call - 1 Argument
%macro SYSCALL1 2
_SYSCALL_HEAD %1, %2
- mov rdi, [rbp+2*8]
+; mov rdi, [rbp+3*8]
SYSCALL_OP
_SYSCALL_TAIL
%endmacro
; System Call - 2 Arguments
%macro SYSCALL2 2
_SYSCALL_HEAD %1, %2
- mov rdi, [rbp+2*8]
- mov rsi, [rbp+3*8]
+; mov rdi, [rbp+3*8]
+; mov rsi, [rbp+4*8]
SYSCALL_OP
_SYSCALL_TAIL
%endmacro
; System Call - 3 Arguments
%macro SYSCALL3 2
_SYSCALL_HEAD %1, %2
-; mov rdi, [rbp+2*8]
-; mov rsi, [rbp+3*8]
-; mov rdx, [rbp+4*8]
+; mov rdi, [rbp+3*8]
+; mov rsi, [rbp+4*8]
+; mov rdx, [rbp+5*8]
SYSCALL_OP
_SYSCALL_TAIL
%endmacro
; // Override the clone syscall
#define clone _clone_raw
+#define _exit _exit_raw
#include "syscalls.s.h"
#undef clone
+#undef _exit
[global clone:func]
clone:
push rbp
mov rbp, rsp
push rbx
+ push r12
+
+ mov r12, rsi ; Save in a reg for after the clone
; Check if the new stack is being used
test rsi, rsi
sub rsi, 3*8
.doCall:
mov eax, SYS_CLONE
- mov rdi, rsi ; Stack
- mov rsi, [rbp+2*8] ; Flags
SYSCALL_OP
mov [rel _errno], ebx
+
+ ; Change stack pointer
+ test eax, eax
+ jnz .ret
+ test r12, r12
+ jz .ret
+ mov rsp, rsi
+.ret:
+ pop r12
pop rbx
pop rbp
ret
+
+[global _exit:func]
+_exit:
+ xor eax, eax
+ SYSCALL_OP
+ jmp $
+
+; vim: ft=nasm