mescc: Mes C Library: Add x86_64 libc support.
[mes.git] / lib / linux / x86-mes / mes.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * GNU Mes --- Maxwell Equations of Software
3  * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of GNU Mes.
6  *
7  * GNU 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  * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <errno.h>
22 #include <linux/x86/syscall.h>
23
24 int
25 __sys_call (int sys_call)
26 {
27   asm ("mov____0x8(%ebp),%eax !8");
28   asm ("int____$0x80");
29 }
30
31 int
32 __sys_call1 (int sys_call, int one)
33 {
34   asm ("mov____0x8(%ebp),%eax !8");
35   asm ("mov____0x8(%ebp),%ebx !12");
36   asm ("int____$0x80");
37 }
38
39 int
40 __sys_call2 (int sys_call, int one, int two)
41 {
42   asm ("mov____0x8(%ebp),%eax !8");
43   asm ("mov____0x8(%ebp),%ebx !12");
44   asm ("mov____0x8(%ebp),%ecx !16");
45   asm ("int____$0x80");
46 }
47
48 int
49 __sys_call3 (int sys_call, int one, int two, int three)
50 {
51   asm ("mov____0x8(%ebp),%eax !8");
52   asm ("mov____0x8(%ebp),%ebx !12");
53   asm ("mov____0x8(%ebp),%ecx !16");
54   asm ("mov____0x8(%ebp),%edx !20");
55   asm ("int____$0x80");
56 }
57
58 int
59 __sys_call4 (int sys_call, int one, int two, int three, int four)
60 {
61   asm ("mov____0x8(%ebp),%eax !8");
62   asm ("mov____0x8(%ebp),%ebx !12");
63   asm ("mov____0x8(%ebp),%ecx !16");
64   asm ("mov____0x8(%ebp),%edx !20");
65   asm ("mov____0x8(%ebp),%esi !24");
66   asm ("int____$0x80");
67 }
68
69 int
70 _sys_call (int sys_call)
71 {
72   int r = __sys_call (sys_call);
73   if (r < 0)
74     {
75       errno = -r;
76       r = -1;
77     }
78   else
79     errno = 0;
80   return r;
81 }
82
83 int
84 _sys_call1 (int sys_call, int one)
85 {
86   int r = __sys_call1 (sys_call, one);
87   if (r < 0)
88     {
89       errno = -r;
90       r = -1;
91     }
92   else
93     errno = 0;
94   return r;
95 }
96
97 int
98 _sys_call2 (int sys_call, int one, int two)
99 {
100   int r = __sys_call2 (sys_call, one, two);
101   if (r < 0)
102     {
103       errno = -r;
104       r = -1;
105     }
106   else
107     errno = 0;
108   return r;
109 }
110
111 int
112 _sys_call3 (int sys_call, int one, int two, int three)
113 {
114   int r = __sys_call3 (sys_call, one, two, three);
115   if (r < 0)
116     {
117       errno = -r;
118       r = -1;
119     }
120   else
121     errno = 0;
122   return r;
123 }
124
125 int
126 _sys_call4 (int sys_call, int one, int two, int three, int four)
127 {
128   int r = __sys_call4 (sys_call, one, two, three, four);
129   if (r < 0)
130     {
131       errno = -r;
132       r = -1;
133     }
134   else
135     errno = 0;
136   return r;
137 }