X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Fld-acess.so_src%2Farch%2Fx86_64.asm.h;h=b80e092ba2d2ec2df8d698668d22f91658be1fb5;hb=230612b2efeeb769f1d96193ec01b10bd36d9873;hp=fdfe5e99e30a7f6bf819836be0fcf3c97ce65ad9;hpb=9867382061f9035d65e118d95fa819c0e615f353;p=tpg%2Facess2.git 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 fdfe5e99..b80e092b 100644 --- a/Usermode/Libraries/ld-acess.so_src/arch/x86_64.asm.h +++ b/Usermode/Libraries/ld-acess.so_src/arch/x86_64.asm.h @@ -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 @@ -80,7 +83,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 @@ -88,8 +91,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 @@ -97,9 +100,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 @@ -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