build: configure: Handle VAR=VALUE. Update help.
[mes.git] / lib / linux-gcc.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2016,2017 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
25 #if !POSIX
26
27 int
28 read (int fd, void* buf, size_t n)
29 {
30 #if !__TINYC__
31   int r;
32   //syscall (SYS_write, fd, s, n));
33   asm (
34        "mov    %1,%%ebx\n\t"
35        "mov    %2,%%ecx\n\t"
36        "mov    %3,%%edx\n\t"
37
38        "movl $0x3,%%eax\n\t"
39        "int  $0x80\n\t"
40
41        "mov    %%eax,%0\n\t"
42        : "=r" (r)
43        : "" (fd), "" (buf), "" (n)
44        : "eax", "ebx", "ecx", "edx"
45        );
46   return r;
47 #endif
48 }
49
50 int
51 open (char const *s, int flags, ...)
52 {
53 #if !__TINYC__
54   int mode;
55   asm (
56        "mov    %%ebp,%%eax\n\t"
57        "add    $0x10,%%eax\n\t"
58        "mov    (%%eax),%%eax\n\t"
59        "mov    %%eax,%0\n\t"
60        : "=mode" (mode)
61        : //no inputs ""
62        );
63   int r;
64   //syscall (SYS_open, mode));
65   asm (
66        "mov    %1,%%ebx\n\t"
67        "mov    %2,%%ecx\n\t"
68        "mov    %3,%%edx\n\t"
69        "mov    $0x5,%%eax\n\t"
70        "int    $0x80\n\t"
71        "mov    %%eax,%0\n\t"
72        : "=r" (r)
73        : "" (s), "" (flags), "" (mode)
74        : "eax", "ebx", "ecx", "edx"
75        );
76   return r;
77 #endif
78 }
79
80 int
81 chmod (char const *s, int mode)
82 {
83 #if !__TINYC__
84   int r;
85   //syscall (SYS_chmod, mode));
86   asm (
87        "mov    %1,%%ebx\n\t"
88        "mov    %2,%%ecx\n\t"
89        "mov    $0x0f,%%eax\n\t"
90        "int    $0x80\n\t"
91        "mov    %%eax,%0\n\t"
92        : "=r" (r)
93        : "" (s), "" (mode)
94        : "eax", "ebx", "ecx"
95        );
96   return r;
97 #endif
98 }
99
100 int
101 access (char const *s, int mode)
102 {
103 #if !__TINYC__
104   int r;
105   //syscall (SYS_access, mode));
106   asm (
107        "mov    %1,%%ebx\n\t"
108        "mov    %2,%%ecx\n\t"
109        "mov    $0x21,%%eax\n\t"
110        "int    $0x80\n\t"
111        "mov    %%eax,%0\n\t"
112        : "=r" (r)
113        : "" (s), "" (mode)
114        : "eax", "ebx", "ecx"
115        );
116   return r;
117 #endif
118 }
119
120 void *
121 brk (void *p)
122 {
123 #if !__TINYC__
124   void *r;
125   asm (
126        "mov    %1,%%ebx\n\t"
127
128        "mov    $0x2d,%%eax\n\t"
129        "int    $0x80\n\t"
130
131        "mov    %%eax,%0\n\t"
132        : "=r" (r)
133        : "" (p)
134        : "eax", "ebx"
135        );
136   return r;
137 #endif
138 }
139
140 int
141 ioctl (int fd, unsigned long request, ...)
142 {
143 #if !__TINYC__
144   int p;
145   asm (
146        "mov    %%ebp,%%eax\n\t"
147        "add    $0x10,%%eax\n\t"
148        "mov    (%%eax),%%eax\n\t"
149        "mov    %%eax,%0\n\t"
150        : "=p" (p)
151        : //no inputs ""
152        );
153   int r;
154   //syscall (SYS_ioctl, fd));
155   asm (
156        "mov    %1,%%ebx\n\t"
157        "mov    %2,%%ecx\n\t"
158        "mov    %3,%%edx\n\t"
159
160        "mov    $0x36, %%eax\n\t"
161        "int    $0x80\n\t"
162        "mov    %%eax,%0\n\t"
163        : "=r" (r)
164        : "" (fd), "" (request), "" (p)
165        : "eax", "ebx", "ecx", "edx"
166        );
167   return r;
168 #endif
169 }
170
171 int
172 fsync (int fd)
173 {
174 #if !__TINYC__
175   int r;
176   //syscall (SYS_fsync, fd));
177   asm (
178        "mov    %1,%%ebx\n\t"
179
180        "mov    $0x76, %%eax\n\t"
181        "int    $0x80\n\t"
182        "mov    %%eax,%0\n\t"
183        : "=r" (r)
184        : "" (fd)
185        : "eax", "ebx"
186        );
187   return r;
188 #endif
189 }
190
191 #endif //!POSIX