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

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