mescc: Mes C Library: Add x86_64 libc support.
[mes.git] / lib / linux / x86_64-mes-gcc / 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_64/syscall.h>
23
24 // HMM, merge this with x86-mes-gcc/mes.c, doing something like
25 // #define R0 eax
26 // #define R1 ebx
27 //
28 // #define R0 rax
29 // #define R1 rdi
30
31 long
32 _sys_call (long sys_call)
33 {
34   long r;
35   asm (
36        "mov     %1,%%rax\n\t"
37        "syscall \n\t"
38        "mov     %%rax,%0\n\t"
39        : "=r" (r)
40        : "rm" (sys_call)
41        : "rax"
42        );
43   if (r < 0)
44     {
45       errno = -r;
46       r = -1;
47     }
48   else
49     errno = 0;
50   return r;
51 }
52
53 long
54 _sys_call1 (long sys_call, long one)
55 {
56   long r;
57   asm (
58        "mov     %1,%%rax\n\t"
59        "mov     %2,%%rdi\n\t"
60        "syscall \n\t"
61        "mov     %%rax,%0\n\t"
62        : "=r" (r)
63        : "rm" (sys_call), "rm" (one)
64        : "rax", "rdi"
65        );
66   if (r < 0)
67     {
68       errno = -r;
69       r = -1;
70     }
71   else
72     errno = 0;
73   return r;
74 }
75
76 long
77 _sys_call2 (long sys_call, long one, long two)
78 {
79   long r;
80   asm (
81        "mov     %1,%%rax\n\t"
82        "mov     %2,%%rdi\n\t"
83        "mov     %3,%%rsi\n\t"
84        "syscall \n\t"
85        "mov     %%rax,%0\n\t"
86        : "=r" (r)
87        : "rm" (sys_call), "rm" (one), "rm" (two)
88        : "rax", "rdi", "rsi"
89        );
90   if (r < 0)
91     {
92       errno = -r;
93       r = -1;
94     }
95   else
96     errno = 0;
97   return r;
98 }
99
100 long
101 _sys_call3 (long sys_call, long one, long two, long three)
102 {
103   long r;
104   asm (
105        "mov     %2,%%rdi\n\t"
106        "mov     %3,%%rsi\n\t"
107        "mov     %4,%%rdx\n\t"
108        "mov     %1,%%rax\n\t"
109        "syscall \n\t"
110        "mov     %%rax,%0\n\t"
111        : "=r" (r)
112        : "rm" (sys_call), "rm" (one), "rm" (two), "rm" (three)
113        : "rax", "rdi", "rsi", "rdx"
114        );
115   if (r < 0)
116     {
117       errno = -r;
118       r = -1;
119     }
120   else
121     errno = 0;
122   return r;
123 }
124
125 long
126 _sys_call4 (long sys_call, long one, long two, long three, long four)
127 {
128   long r;
129   asm (
130        "mov     %2,%%rdi\n\t"
131        "mov     %3,%%rsi\n\t"
132        "mov     %4,%%rdx\n\t"
133        "mov     %5,%%rcx\n\t"
134        "mov     %1,%%rax\n\t"
135        "syscall \n\t"
136        "mov     %%rax,%0\n\t"
137        : "=r" (r)
138        : "rm" (sys_call), "rm" (one), "rm" (two), "rm" (three), "rm" (four)
139        : "rax", "rdi", "rsi", "rdx", "rcx"
140        );
141   if (r < 0)
142     {
143       errno = -r;
144       r = -1;
145     }
146   else
147     errno = 0;
148   return r;
149 }