More work on x86_64 port of usermode
[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         push rdi
16         push rsi        ; // DI and SI must be maintained, CX doesn't
17         
18         mov rcx, [rbp+4*8]
19         mov rsi, [rbp+3*8]
20         mov rdi, [rbp+2*8]
21         rep movsb
22         
23         pop rsi
24         pop rdi
25         pop rbp
26         ret
27
28 [global _errno:data 4]
29 _errno: dw      0       ; Placed in .text, to allow use of relative addressing
30
31 #define SYSCALL0(_name,_num)    SYSCALL0 _name, _num
32 #define SYSCALL1(_name,_num)    SYSCALL1 _name, _num
33 #define SYSCALL2(_name,_num)    SYSCALL2 _name, _num
34 #define SYSCALL3(_name,_num)    SYSCALL3 _name, _num
35 #define SYSCALL4(_name,_num)    SYSCALL4 _name, _num
36 #define SYSCALL5(_name,_num)    SYSCALL5 _name, _num
37 #define SYSCALL6(_name,_num)    SYSCALL6 _name, _num
38
39 ;%define SYSCALL_OP     jmp 0xCFFF0000
40 %define SYSCALL_OP      int 0xAC
41
42 ; System Call - No Arguments
43 %macro SYSCALL0 2
44 [global %1:func]
45 %1:
46         push rbx
47         mov eax, %2
48         SYSCALL_OP
49         mov [DWORD rel _errno], ebx
50         pop rbx
51         ret
52 %endmacro
53
54 %macro _SYSCALL_HEAD 2
55 [global %1:func]
56 %1:
57         push rbp
58         mov rbp, rsp
59         push rbx
60         mov eax, %2
61 %endmacro
62 %macro _SYSCALL_TAIL 0
63         mov [DWORD rel _errno], ebx
64         pop rbx
65         pop rbp
66         ret
67 %endmacro
68
69 ; System Call - 1 Argument
70 %macro SYSCALL1 2
71 _SYSCALL_HEAD %1, %2
72         mov rbx, [rbp+2*8]
73         SYSCALL_OP
74 _SYSCALL_TAIL
75 %endmacro
76
77 ; System Call - 2 Arguments
78 %macro SYSCALL2 2
79 _SYSCALL_HEAD %1, %2
80         mov rbx, [rbp+2*8]
81         mov rcx, [rbp+3*8]
82         SYSCALL_OP
83 _SYSCALL_TAIL
84 %endmacro
85
86 ; System Call - 3 Arguments
87 %macro SYSCALL3 2
88 _SYSCALL_HEAD %1, %2
89         mov rbx, [rbp+2*8]
90         mov rcx, [rbp+3*8]
91         mov rdx, [rbp+4*8]
92         SYSCALL_OP
93 _SYSCALL_TAIL
94 %endmacro
95
96 ; System Call - 4 Arguments
97 %macro SYSCALL4 2
98 _SYSCALL_HEAD %1, %2
99         push rdi
100         mov rbx, [rbp+2*8]
101         mov rcx, [rbp+3*8]
102         mov rdx, [rbp+4*8]
103         mov rdi, [rbp+5*8]
104         SYSCALL_OP
105         pop rdi
106 _SYSCALL_TAIL
107 %endmacro
108
109 ; System Call - 5 Arguments
110 %macro SYSCALL5 2
111 _SYSCALL_HEAD %1, %2
112         push rdi
113         push rsi
114         mov rbx, [rbp+2*8]
115         mov rcx, [rbp+3*8]
116         mov rdx, [rbp+4*8]
117         mov rdi, [rbp+5*8]
118         mov rsi, [rbp+6*8]
119         SYSCALL_OP
120         pop rsi
121         pop rdi
122 _SYSCALL_TAIL
123 %endmacro
124
125 ; System Call - 6 Arguments
126 %macro SYSCALL6 2
127 _SYSCALL_HEAD %1, %2
128         push rdi
129         push rsi
130         mov rbx, [rbp+2*8]
131         mov rcx, [rbp+3*8]
132         mov rdx, [rbp+4*8]
133         mov rdi, [rbp+5*8]
134         mov rsi, [rbp+6*8]
135         mov rbp, [rbp+7*8]
136         SYSCALL_OP
137         pop rsi
138         pop rdi
139 _SYSCALL_TAIL
140 %endmacro
141
142 ; // Override the clone syscall
143 #define clone   _clone_raw
144 #include "syscalls.s.h"
145 #undef clone
146
147 [global clone:func]
148 clone:
149         push rbp
150         mov rbp, rsp
151         push rbx
152         
153         mov rbx, [rbp+3*8]      ; Get new stack pointer
154         
155         ; Check if the new stack is being used
156         test rbx, rbx
157         jz .doCall
158         ; Quick hack, just this stack frame
159         mov rax, [rbp+1*8]
160         mov [rbx-1*8], rax      ; Return
161         mov [rbx-2*8], rbx      ; EBP
162         and QWORD [rbx-3*8], BYTE 0     ; EBX
163         sub rbx, 3*8
164 .doCall:
165         mov eax, SYS_CLONE
166         mov rcx, rbx    ; Stack
167         mov rbx, [rbp+2*8]      ; Flags
168         SYSCALL_OP
169         mov [rel _errno], ebx
170         pop rbx
171         pop rbp
172         ret
173

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