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