Usermode/ld-acess - Fixed for x86_64 syscall interface
[tpg/acess2.git] / Usermode / Libraries / ld-acess.so_src / arch / x86_64.asm.h
1 ; ========================
2 ; AcssMicro - System Calls
3 ; ========================
4
5 %include "../../../Kernel/include/syscalls.inc.asm"
6
7 [bits 64]
8
9 [section .text]
10 ; DEST
11 ; SRC
12 _memcpy:
13         push rbp
14         mov rbp, rsp
15         
16         ; RDI - First Param
17         ; RSI - Second Param
18         mov rcx, rdx    ; RDX - Third
19         rep movsb
20         
21         pop rbp
22         ret
23
24 [global _errno:data 4]
25 _errno: dw      0       ; Placed in .text, to allow use of relative addressing
26
27 #define SYSCALL0(_name,_num)    SYSCALL0 _name, _num
28 #define SYSCALL1(_name,_num)    SYSCALL1 _name, _num
29 #define SYSCALL2(_name,_num)    SYSCALL2 _name, _num
30 #define SYSCALL3(_name,_num)    SYSCALL3 _name, _num
31 #define SYSCALL4(_name,_num)    SYSCALL4 _name, _num
32 #define SYSCALL5(_name,_num)    SYSCALL5 _name, _num
33 #define SYSCALL6(_name,_num)    SYSCALL6 _name, _num
34
35 ;%define SYSCALL_OP     jmp 0xCFFF0000
36 ;%define SYSCALL_OP     int 0xAC
37 %define SYSCALL_OP      syscall
38
39 ; System Call - No Arguments
40 %macro SYSCALL0 2
41 [global %1:func]
42 %1:
43         push rbx
44         mov eax, %2
45         SYSCALL_OP
46         mov [DWORD rel _errno], ebx
47         pop rbx
48         ret
49 %endmacro
50
51 %macro _SYSCALL_HEAD 2
52 [global %1:func]
53 %1:
54         push rbp
55         mov rbp, rsp
56         push rbx
57         mov eax, %2
58 %endmacro
59 %macro _SYSCALL_TAIL 0
60         mov [DWORD rel _errno], ebx
61         pop rbx
62         pop rbp
63         ret
64 %endmacro
65
66 ; System Call - 1 Argument
67 %macro SYSCALL1 2
68 _SYSCALL_HEAD %1, %2
69         mov rdi, [rbp+2*8]
70         SYSCALL_OP
71 _SYSCALL_TAIL
72 %endmacro
73
74 ; System Call - 2 Arguments
75 %macro SYSCALL2 2
76 _SYSCALL_HEAD %1, %2
77         mov rdi, [rbp+2*8]
78         mov rsi, [rbp+3*8]
79         SYSCALL_OP
80 _SYSCALL_TAIL
81 %endmacro
82
83 ; System Call - 3 Arguments
84 %macro SYSCALL3 2
85 _SYSCALL_HEAD %1, %2
86 ;       mov rdi, [rbp+2*8]
87 ;       mov rsi, [rbp+3*8]
88 ;       mov rdx, [rbp+4*8]
89         SYSCALL_OP
90 _SYSCALL_TAIL
91 %endmacro
92
93 ; System Call - 4 Arguments
94 %macro SYSCALL4 2
95 _SYSCALL_HEAD %1, %2
96 ;       mov rdi, [rbp+2*8]
97 ;       mov rsi, [rbp+3*8]
98 ;       mov rdx, [rbp+4*8]
99         mov r10, rcx    ; r10 is used in place of RCX
100         SYSCALL_OP
101 _SYSCALL_TAIL
102 %endmacro
103
104 ; System Call - 5 Arguments
105 %macro SYSCALL5 2
106 _SYSCALL_HEAD %1, %2
107 ;       mov rdi, [rbp+2*8]
108 ;       mov rsi, [rbp+3*8]
109 ;       mov rdx, [rbp+4*8]
110         mov r10, rcx
111 ;       mov r8, [rbp+6*8]
112         SYSCALL_OP
113 _SYSCALL_TAIL
114 %endmacro
115
116 ; System Call - 6 Arguments
117 %macro SYSCALL6 2
118 _SYSCALL_HEAD %1, %2
119 ;       mov rdi, [rbp+2*8]
120 ;       mov rsi, [rbp+3*8]
121 ;       mov rdx, [rbp+4*8]
122         mov r10, rcx
123 ;       mov r8, [rbp+6*8]
124 ;       mov r9, [rbp+7*8]
125         SYSCALL_OP
126 _SYSCALL_TAIL
127 %endmacro
128
129 ; // Override the clone syscall
130 #define clone   _clone_raw
131 #include "syscalls.s.h"
132 #undef clone
133
134 [global clone:func]
135 clone:
136         push rbp
137         mov rbp, rsp
138         push rbx
139         
140         ; Check if the new stack is being used
141         test rsi, rsi
142         jz .doCall
143         ; Quick hack, just this stack frame
144         mov rax, [rbp+1*8]
145         mov [rsi-1*8], rax      ; Return
146         mov [rsi-2*8], rsi      ; EBP
147         and QWORD [rsi-3*8], BYTE 0     ; EBX
148         sub rsi, 3*8
149 .doCall:
150         mov eax, SYS_CLONE
151         mov rdi, rsi    ; Stack
152         mov rsi, [rbp+2*8]      ; Flags
153         SYSCALL_OP
154         mov [rel _errno], ebx
155         pop rbx
156         pop rbp
157         ret
158

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