git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Usermode/ld-acess - Syscall stub changes
[tpg/acess2.git]
/
Usermode
/
Libraries
/
ld-acess.so_src
/
arch
/
x86_64.asm.h
diff --git
a/Usermode/Libraries/ld-acess.so_src/arch/x86_64.asm.h
b/Usermode/Libraries/ld-acess.so_src/arch/x86_64.asm.h
index
cffe74c
..
62fc400
100644
(file)
--- a/
Usermode/Libraries/ld-acess.so_src/arch/x86_64.asm.h
+++ b/
Usermode/Libraries/ld-acess.so_src/arch/x86_64.asm.h
@@
-7,6
+7,20
@@
[bits 64]
[section .text]
[bits 64]
[section .text]
+[global _start]
+[extern SoMain]
+_start:
+ pop rdi
+ call SoMain
+
+ mov rdi, [rsp]
+ mov rsi, [rsp+8]
+ mov rdx, [rsp+16]
+ call rax
+
+ mov rdi, rax
+ call _exit
+
; DEST
; SRC
_memcpy:
; DEST
; SRC
_memcpy:
@@
-66,7
+80,7
@@
_errno: dw 0 ; Placed in .text, to allow use of relative addressing
; System Call - 1 Argument
%macro SYSCALL1 2
_SYSCALL_HEAD %1, %2
; 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
SYSCALL_OP
_SYSCALL_TAIL
%endmacro
@@
-74,8
+88,8
@@
_SYSCALL_TAIL
; System Call - 2 Arguments
%macro SYSCALL2 2
_SYSCALL_HEAD %1, %2
; 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
SYSCALL_OP
_SYSCALL_TAIL
%endmacro
@@
-83,9
+97,9
@@
_SYSCALL_TAIL
; System Call - 3 Arguments
%macro SYSCALL3 2
_SYSCALL_HEAD %1, %2
; 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
SYSCALL_OP
_SYSCALL_TAIL
%endmacro
@@
-128,14
+142,19
@@
_SYSCALL_TAIL
; // Override the clone syscall
#define clone _clone_raw
; // Override the clone syscall
#define clone _clone_raw
+#define _exit _exit_raw
#include "syscalls.s.h"
#undef clone
#include "syscalls.s.h"
#undef clone
+#undef _exit
[global clone:func]
clone:
push rbp
mov rbp, rsp
push rbx
[global clone:func]
clone:
push rbp
mov rbp, rsp
push rbx
+ push r11
+
+ mov r12, rsi ; Save in a reg for after the clone
; Check if the new stack is being used
test rsi, rsi
; Check if the new stack is being used
test rsi, rsi
@@
-148,11
+167,25
@@
clone:
sub rsi, 3*8
.doCall:
mov eax, SYS_CLONE
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
SYSCALL_OP
mov [rel _errno], ebx
+
+ ; Change stack pointer
+ test eax, eax
+ jnz .ret
+ test r12, r12
+ jz .ret
+ mov rsp, rsi
+.ret:
pop rbx
pop rbp
ret
pop rbx
pop rbp
ret
+
+[global _exit:func]
+_exit:
+ xor eax, eax
+ SYSCALL_OP
+ jmp $
+
+; vim: ft=nasm
UCC
git Repository :: git.ucc.asn.au