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

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