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
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         push rbp
60         mov eax, %2
61         SYSCALL_OP
62         mov [DWORD rel _errno], ebx
63         pop rbp
64         pop rbx
65         ret
66 %endmacro
67
68 %macro _SYSCALL_HEAD 2
69 [global %1:func]
70 %1:
71         push rbp
72         mov rbp, rsp
73         push rbx
74         mov eax, %2
75 %endmacro
76 %macro _SYSCALL_TAIL 0
77         mov [DWORD rel _errno], ebx
78         pop rbx
79         pop rbp
80         ret
81 %endmacro
82
83 ; System Call - 1 Argument
84 %macro SYSCALL1 2
85 _SYSCALL_HEAD %1, %2
86 ;       mov rdi, [rbp+3*8]
87         SYSCALL_OP
88 _SYSCALL_TAIL
89 %endmacro
90
91 ; System Call - 2 Arguments
92 %macro SYSCALL2 2
93 _SYSCALL_HEAD %1, %2
94 ;       mov rdi, [rbp+3*8]
95 ;       mov rsi, [rbp+4*8]
96         SYSCALL_OP
97 _SYSCALL_TAIL
98 %endmacro
99
100 ; System Call - 3 Arguments
101 %macro SYSCALL3 2
102 _SYSCALL_HEAD %1, %2
103 ;       mov rdi, [rbp+3*8]
104 ;       mov rsi, [rbp+4*8]
105 ;       mov rdx, [rbp+5*8]
106         SYSCALL_OP
107 _SYSCALL_TAIL
108 %endmacro
109
110 ; System Call - 4 Arguments
111 %macro SYSCALL4 2
112 _SYSCALL_HEAD %1, %2
113 ;       mov rdi, [rbp+2*8]
114 ;       mov rsi, [rbp+3*8]
115 ;       mov rdx, [rbp+4*8]
116         mov r10, rcx    ; r10 is used in place of RCX
117         SYSCALL_OP
118 _SYSCALL_TAIL
119 %endmacro
120
121 ; System Call - 5 Arguments
122 %macro SYSCALL5 2
123 _SYSCALL_HEAD %1, %2
124 ;       mov rdi, [rbp+2*8]
125 ;       mov rsi, [rbp+3*8]
126 ;       mov rdx, [rbp+4*8]
127         mov r10, rcx
128 ;       mov r8, [rbp+6*8]
129         SYSCALL_OP
130 _SYSCALL_TAIL
131 %endmacro
132
133 ; System Call - 6 Arguments
134 %macro SYSCALL6 2
135 _SYSCALL_HEAD %1, %2
136 ;       mov rdi, [rbp+2*8]
137 ;       mov rsi, [rbp+3*8]
138 ;       mov rdx, [rbp+4*8]
139         mov r10, rcx
140 ;       mov r8, [rbp+6*8]
141 ;       mov r9, [rbp+7*8]
142         SYSCALL_OP
143 _SYSCALL_TAIL
144 %endmacro
145
146 ; // Override the clone syscall
147 #define clone   _clone_raw
148 #define _exit   _exit_raw
149 #include "syscalls.s.h"
150 #undef clone
151 #undef _exit
152
153 [global clone:func]
154 clone:
155         push rbp
156         mov rbp, rsp
157         push rbx
158         push r12
159         
160         mov r12, rsi    ; Save in a reg for after the clone
161         
162         ; Check if the new stack is being used
163         test rsi, rsi
164         jz .doCall
165         ; Quick hack, just this stack frame
166         mov rax, [rbp+1*8]
167         mov [rsi-1*8], rax      ; Return
168         mov [rsi-2*8], rsi      ; EBP
169         and QWORD [rsi-3*8], BYTE 0     ; EBX
170         sub rsi, 3*8
171 .doCall:
172         mov eax, SYS_CLONE
173         SYSCALL_OP
174         mov [rel _errno], ebx
175
176         ; Change stack pointer
177         test eax, eax
178         jnz .ret
179         test r12, r12
180         jz .ret
181         mov rsp, rsi
182 .ret:
183         pop r12
184         pop rbx
185         pop rbp
186         ret
187
188
189 [global _exit:func]
190 _exit:
191         xor eax, eax
192         SYSCALL_OP
193         jmp $
194
195 ; vim: ft=nasm

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