Usermode/ld-acess - Fix x86_64 not saving RBP on no-arg syscalls
[tpg/acess2.git] / Usermode / Libraries / ld-acess.so_src / arch / x86_64.asm.h
index 2c9d87f..b80e092 100644 (file)
@@ -2,20 +2,21 @@
 ; AcssMicro - System Calls
 ; ========================
 
-%include "../../../Kernel/include/syscalls.inc.asm"
-
 [bits 64]
 
 [section .text]
 [global _start]
 [extern SoMain]
 _start:
-       pop rdi
+       mov rdi, [rsp   ]       ; Base
+       mov rsi, [rsp+ 8]       ; ArgC
+       mov rdx, [rsp+16]       ; ArgV
+       mov rcx, [rsp+24]       ; EnvP
        call SoMain
        
-       mov rdi, [rsp]
-       mov rsi, [rsp+8]
-       mov rdx, [rsp+16]
+       mov rdi, [rsp+8]
+       mov rsi, [rsp+16]
+       mov rdx, [rsp+24]
        call rax
        
        mov rdi, rax
@@ -55,9 +56,11 @@ _errno:      dw      0       ; Placed in .text, to allow use of relative addressing
 [global %1:func]
 %1:
        push rbx
+       push rbp
        mov eax, %2
        SYSCALL_OP
        mov [DWORD rel _errno], ebx
+       pop rbp
        pop rbx
        ret
 %endmacro
@@ -142,14 +145,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
@@ -162,11 +170,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