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 - Fixed error in x86_64 clone syscall
[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
a21bf18
..
6c3ac0f
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,25
+7,35
@@
[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:
push rbp
mov rbp, rsp
; DEST
; SRC
_memcpy:
push rbp
mov rbp, rsp
- push rdi
- push rsi ; // DI and SI must be maintained, CX doesn't
- mov rcx, [rbp+4*8]
- mov rsi, [rbp+3*8]
- mov r
di, [rbp+2*8]
+ ; RDI - First Param
+ ; RSI - Second Param
+ mov r
cx, rdx ; RDX - Third
rep movsb
rep movsb
- pop rsi
- pop rdi
pop rbp
ret
pop rbp
ret
-[global _errno]
+[global _errno
:data 4
]
_errno: dw 0 ; Placed in .text, to allow use of relative addressing
#define SYSCALL0(_name,_num) SYSCALL0 _name, _num
_errno: dw 0 ; Placed in .text, to allow use of relative addressing
#define SYSCALL0(_name,_num) SYSCALL0 _name, _num
@@
-37,7
+47,8
@@
_errno: dw 0 ; Placed in .text, to allow use of relative addressing
#define SYSCALL6(_name,_num) SYSCALL6 _name, _num
;%define SYSCALL_OP jmp 0xCFFF0000
#define SYSCALL6(_name,_num) SYSCALL6 _name, _num
;%define SYSCALL_OP jmp 0xCFFF0000
-%define SYSCALL_OP int 0xAC
+;%define SYSCALL_OP int 0xAC
+%define SYSCALL_OP syscall
; System Call - No Arguments
%macro SYSCALL0 2
; System Call - No Arguments
%macro SYSCALL0 2
@@
-69,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 rbx, [rbp+2
*8]
+
; mov rdi, [rbp+3
*8]
SYSCALL_OP
_SYSCALL_TAIL
%endmacro
SYSCALL_OP
_SYSCALL_TAIL
%endmacro
@@
-77,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 rbx, [rbp+2
*8]
-
mov rcx, [rbp+3
*8]
+
; mov rdi, [rbp+3
*8]
+
; mov rsi, [rbp+4
*8]
SYSCALL_OP
_SYSCALL_TAIL
%endmacro
SYSCALL_OP
_SYSCALL_TAIL
%endmacro
@@
-86,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 rbx, [rbp+2
*8]
-
mov rcx, [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
@@
-96,78
+107,86
@@
_SYSCALL_TAIL
; System Call - 4 Arguments
%macro SYSCALL4 2
_SYSCALL_HEAD %1, %2
; System Call - 4 Arguments
%macro SYSCALL4 2
_SYSCALL_HEAD %1, %2
- push rdi
- mov rbx, [rbp+2*8]
- mov rcx, [rbp+3*8]
- mov rdx, [rbp+4*8]
- mov rdi, [rbp+5*8]
+; mov rdi, [rbp+2*8]
+; mov rsi, [rbp+3*8]
+; mov rdx, [rbp+4*8]
+ mov r10, rcx ; r10 is used in place of RCX
SYSCALL_OP
SYSCALL_OP
- pop rdi
_SYSCALL_TAIL
%endmacro
; System Call - 5 Arguments
%macro SYSCALL5 2
_SYSCALL_HEAD %1, %2
_SYSCALL_TAIL
%endmacro
; System Call - 5 Arguments
%macro SYSCALL5 2
_SYSCALL_HEAD %1, %2
- push rdi
- push rsi
- mov rbx, [rbp+2*8]
- mov rcx, [rbp+3*8]
- mov rdx, [rbp+4*8]
- mov rdi, [rbp+5*8]
- mov rsi, [rbp+6*8]
+; mov rdi, [rbp+2*8]
+; mov rsi, [rbp+3*8]
+; mov rdx, [rbp+4*8]
+ mov r10, rcx
+; mov r8, [rbp+6*8]
SYSCALL_OP
SYSCALL_OP
- pop rsi
- pop rdi
_SYSCALL_TAIL
%endmacro
; System Call - 6 Arguments
%macro SYSCALL6 2
_SYSCALL_HEAD %1, %2
_SYSCALL_TAIL
%endmacro
; System Call - 6 Arguments
%macro SYSCALL6 2
_SYSCALL_HEAD %1, %2
- push rdi
- push rsi
- mov rbx, [rbp+2*8]
- mov rcx, [rbp+3*8]
- mov rdx, [rbp+4*8]
- mov rdi, [rbp+5*8]
- mov rsi, [rbp+6*8]
- mov rbp, [rbp+7*8]
+; mov rdi, [rbp+2*8]
+; mov rsi, [rbp+3*8]
+; mov rdx, [rbp+4*8]
+ mov r10, rcx
+; mov r8, [rbp+6*8]
+; mov r9, [rbp+7*8]
SYSCALL_OP
SYSCALL_OP
- pop rsi
- pop rdi
_SYSCALL_TAIL
%endmacro
; // Override the clone syscall
#define clone _clone_raw
_SYSCALL_TAIL
%endmacro
; // 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 r12
- mov r
bx, [rbp+3*8] ; Get new stack pointer
+ mov r
12, rsi ; Save in a reg for after the clone
; Check if the new stack is being used
; Check if the new stack is being used
- test r
bx, rbx
+ test r
si, rsi
jz .doCall
; Quick hack, just this stack frame
mov rax, [rbp+1*8]
jz .doCall
; Quick hack, just this stack frame
mov rax, [rbp+1*8]
- mov [r
bx
-1*8], rax ; Return
- mov [r
bx-2*8], rbx
; EBP
- and QWORD [r
bx
-3*8], BYTE 0 ; EBX
- sub r
bx
, 3*8
+ mov [r
si
-1*8], rax ; Return
+ mov [r
si-2*8], rsi
; EBP
+ and QWORD [r
si
-3*8], BYTE 0 ; EBX
+ sub r
si
, 3*8
.doCall:
mov eax, SYS_CLONE
.doCall:
mov eax, SYS_CLONE
- mov rcx, rbx ; Stack
- mov rbx, [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 r12
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