Usermode - Misc header changes
[tpg/acess2.git] / Usermode / Libraries / ld-acess.so_src / arch / x86_64.asm.h
index cffe74c..350585a 100644 (file)
@@ -2,11 +2,26 @@
 ; AcssMicro - System Calls
 ; ========================
 
-%include "../../../Kernel/include/syscalls.inc.asm"
-
 [bits 64]
 
 [section .text]
+[global _start]
+[extern SoMain]
+_start:
+       mov rdi, [rsp   ]       ; Base
+       mov rsi, [rsp+ 8]       ; ArgC
+       mov rdx, [rsp+16]       ; ArgV
+       mov rcx, [rsp+24]       ; EnvP
+       call SoMain
+       
+       mov rdi, [rsp+8]
+       mov rsi, [rsp+16]
+       mov rdx, [rsp+24]
+       call rax
+       
+       mov rdi, rax
+       call _exit
+
 ; DEST
 ; SRC
 _memcpy:
@@ -66,7 +81,7 @@ _errno:       dw      0       ; Placed in .text, to allow use of relative addressing
 ; 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
@@ -74,8 +89,8 @@ _SYSCALL_TAIL
 ; 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
@@ -83,9 +98,9 @@ _SYSCALL_TAIL
 ; 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
@@ -128,14 +143,19 @@ _SYSCALL_TAIL
 
 ; // 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
@@ -148,11 +168,26 @@ 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
+
+       ; 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

UCC git Repository :: git.ucc.asn.au