3dfbf6230c2dac415ef1fd66f946aec1b2b73ae3
[mes.git] / lib / linux-gcc.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of Mes.
6  *
7  * Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <stdio.h>
22 #include <mlibc.h>
23 #include <stdlib.h>
24 #include <unistd.h>
25 #include <sys/wait.h>
26
27 #if !POSIX
28
29 int
30 fork ()
31 {
32 #if !__TINYC__
33   int r;
34   //syscall (SYS_fork, fd));
35   asm (
36        "mov    $0x02,%%eax\n\t"
37        "int    $0x80\n\t"
38        "mov    %%eax,%0\n\t"
39        : "=r" (r)
40        : //no inputs
41        : "eax"
42        );
43   return r;
44 #endif
45 }
46
47 int
48 read (int fd, void* buf, size_t n)
49 {
50 #if !__TINYC__
51   int r;
52   //syscall (SYS_write, fd, s, n));
53   asm (
54        "mov    %1,%%ebx\n\t"
55        "mov    %2,%%ecx\n\t"
56        "mov    %3,%%edx\n\t"
57
58        "movl $0x3,%%eax\n\t"
59        "int  $0x80\n\t"
60
61        "mov    %%eax,%0\n\t"
62        : "=r" (r)
63        : "" (fd), "" (buf), "" (n)
64        : "eax", "ebx", "ecx", "edx"
65        );
66   return r;
67 #endif
68 }
69
70 int
71 open (char const *s, int flags, ...)
72 {
73 #if !__TINYC__
74   int mode;
75   asm (
76        "mov    %%ebp,%%eax\n\t"
77        "add    $0x10,%%eax\n\t"
78        "mov    (%%eax),%%eax\n\t"
79        "mov    %%eax,%0\n\t"
80        : "=mode" (mode)
81        : //no inputs ""
82        );
83   int r;
84   //syscall (SYS_open, mode));
85   asm (
86        "mov    %1,%%ebx\n\t"
87        "mov    %2,%%ecx\n\t"
88        "mov    %3,%%edx\n\t"
89        "mov    $0x5,%%eax\n\t"
90        "int    $0x80\n\t"
91        "mov    %%eax,%0\n\t"
92        : "=r" (r)
93        : "" (s), "" (flags), "" (mode)
94        : "eax", "ebx", "ecx", "edx"
95        );
96   return r;
97 #endif
98 }
99
100 pid_t
101 waitpid (pid_t pid, int *status_ptr, int options)
102 {
103 #if !__TINYC__
104   int r;
105   //syscall (SYS_execve, file_name, argv, env));
106   asm (
107        "mov    %1,%%ebx\n\t"
108        "mov    %2,%%ecx\n\t"
109        "mov    %3,%%edx\n\t"
110
111        "mov    $0x07,%%eax\n\t"
112        "int    $0x80\n\t"
113
114        "mov    %%eax,%0\n\t"
115        : "=r" (r)
116        : "" (pid), "" (status_ptr), "" (options)
117        : "eax", "ebx", "ecx", "edx"
118        );
119   return r;
120 #endif
121 }
122
123 int
124 execve (char const* file_name, char *const argv[], char *const env[])
125 {
126 #if !__TINYC__
127   int r;
128   //syscall (SYS_execve, file_name, argv, env));
129   asm (
130        "mov    %1,%%ebx\n\t"
131        "mov    %2,%%ecx\n\t"
132        "mov    %3,%%edx\n\t"
133
134        "mov    $0x0b,%%eax\n\t"
135        "int    $0x80\n\t"
136
137        "mov    %%eax,%0\n\t"
138        : "=r" (r)
139        : "" (file_name), "" (argv), "" (env)
140        : "eax", "ebx", "ecx", "edx"
141        );
142   return r;
143 #endif
144 }
145
146 int
147 chmod (char const *s, int mode)
148 {
149 #if !__TINYC__
150   int r;
151   //syscall (SYS_chmod, mode));
152   asm (
153        "mov    %1,%%ebx\n\t"
154        "mov    %2,%%ecx\n\t"
155        "mov    $0x0f,%%eax\n\t"
156        "int    $0x80\n\t"
157        "mov    %%eax,%0\n\t"
158        : "=r" (r)
159        : "" (s), "" (mode)
160        : "eax", "ebx", "ecx"
161        );
162   return r;
163 #endif
164 }
165
166 int
167 access (char const *s, int mode)
168 {
169 #if !__TINYC__
170   int r;
171   //syscall (SYS_access, mode));
172   asm (
173        "mov    %1,%%ebx\n\t"
174        "mov    %2,%%ecx\n\t"
175        "mov    $0x21,%%eax\n\t"
176        "int    $0x80\n\t"
177        "mov    %%eax,%0\n\t"
178        : "=r" (r)
179        : "" (s), "" (mode)
180        : "eax", "ebx", "ecx"
181        );
182   return r;
183 #endif
184 }
185
186 void *
187 brk (void *p)
188 {
189 #if !__TINYC__
190   void *r;
191   asm (
192        "mov    %1,%%ebx\n\t"
193
194        "mov    $0x2d,%%eax\n\t"
195        "int    $0x80\n\t"
196
197        "mov    %%eax,%0\n\t"
198        : "=r" (r)
199        : "" (p)
200        : "eax", "ebx"
201        );
202   return r;
203 #endif
204 }
205
206 int
207 ioctl (int fd, unsigned long request, ...)
208 {
209 #if !__TINYC__
210   int p;
211   asm (
212        "mov    %%ebp,%%eax\n\t"
213        "add    $0x10,%%eax\n\t"
214        "mov    (%%eax),%%eax\n\t"
215        "mov    %%eax,%0\n\t"
216        : "=p" (p)
217        : //no inputs ""
218        );
219   int r;
220   //syscall (SYS_ioctl, fd));
221   asm (
222        "mov    %1,%%ebx\n\t"
223        "mov    %2,%%ecx\n\t"
224        "mov    %3,%%edx\n\t"
225
226        "mov    $0x36, %%eax\n\t"
227        "int    $0x80\n\t"
228        "mov    %%eax,%0\n\t"
229        : "=r" (r)
230        : "" (fd), "" (request), "" (p)
231        : "eax", "ebx", "ecx", "edx"
232        );
233   return r;
234 #endif
235 }
236
237 int
238 fsync (int fd)
239 {
240 #if !__TINYC__
241   int r;
242   //syscall (SYS_fsync, fd));
243   asm (
244        "mov    %1,%%ebx\n\t"
245
246        "mov    $0x76, %%eax\n\t"
247        "int    $0x80\n\t"
248        "mov    %%eax,%0\n\t"
249        : "=r" (r)
250        : "" (fd)
251        : "eax", "ebx"
252        );
253   return r;
254 #endif
255 }
256
257 #endif //!POSIX