mescc: drop naive realloc.
[mes.git] / mlibc / libc-gcc+tcc.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2016,2017 Jan 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 <libc-gcc.c>
22 #include <libc-mes+tcc.c>
23
24 int errno;
25
26 #include <unistd.h>
27 #include <stdarg.h>
28 #include <signal.h>
29 #include <sys/mman.h>
30 #include <sys/time.h>
31
32 #define SYS_exit   "0x01"
33 #define SYS_read   "0x03"
34 #define SYS_write  "0x04"
35 #define SYS_open   "0x05"
36 #define SYS_close  "0x06"
37 #define SYS_unlink "0x0a"
38 #define SYS_lseek  "0x13"
39 #define SYS_access "0x21"
40 #define SYS_brk    "0x2d"
41 #define SYS_fsync  "0x76"
42 #define SYS_getcwd "0xb7"
43
44 int
45 close (int fd)
46 {
47   int r;
48   asm (
49        "mov    %0,%%ebx\n\t"
50        "mov    $"SYS_close",%%eax\n\t"
51        "int    $0x80"
52        : "=r" (r)
53        : "" (fd)
54        );
55   return r;
56 }
57
58 int
59 unlink (char const *file_name)
60 {
61   int r;
62   asm (
63        "mov    %0,%%ebx\n\t"
64        "mov    $"SYS_unlink",%%eax\n\t"
65        "int    $0x80"
66        : "=r" (r)
67        : "" (file_name)
68        );
69   return r;
70 }
71
72 off_t
73 lseek (int fd, off_t offset, int whence)
74 {
75   int r;
76   asm (
77        "mov    %1,%%ebx\n\t"
78        "mov    %2,%%ecx\n\t"
79        "mov    %3,%%edx\n\t"
80
81        "mov    $"SYS_lseek",%%eax\n\t"
82        "int  $0x80\n\t"
83
84        "mov    %%eax,%0\n\t"
85        : "=r" (r)
86        : "" (fd), "" (offset), "" (whence)
87        : "eax", "ebx", "ecx", "edx"
88        );
89   return r;
90 }
91
92 char *
93 getcwd (char *buf, size_t size)
94 {
95   int r;
96   asm (
97        "mov    %1,%%ebx\n\t"
98        "mov    %2,%%ecx\n\t"
99
100        "mov    $"SYS_getcwd",%%eax\n\t"
101        "int  $0x80\n\t"
102
103        "mov    %%eax,%0\n\t"
104        : "=r" (r)
105        : "" (buf), "" (size)
106        : "eax", "ebx", "ecx"
107        );
108   return r;
109 }
110
111 int
112 __udivdi3 (int a, int b)
113 {
114   return a / b;
115 }
116
117 int
118 __umoddi3 (int a, int b)
119 {
120   return a % b;
121 }