libclod
C library for interacting with NBTs, region files, LOD data and other things.
Loading...
Searching...
No Matches
syscall.c
1#include "config.h"
2#include "syscall.h"
3#include <clod/sys/sys.h>
4#include <linux/time.h>
5#include <linux/unistd.h>
6
7#ifdef CLOD_HAVE_X86_64
8
9long syscall0(long number) {
10 asm volatile(
11 "syscall\n\t"
12 : "+a" (number)
13 :
14 : "memory", "cc", "r11", "rcx"
15 );
16 return number;
17}
18
19long syscall1(long _1, long number) {
20 register long r1 asm ("rdi") = _1;
21
22 asm volatile(
23 "syscall\n\t"
24 : "+a" (number)
25 : "D" (r1)
26 : "memory", "cc", "r11", "rcx"
27 );
28 return number;
29}
30
31long syscall2(long _1, long _2, long number) {
32 register long r1 asm ("rdi") = _1;
33 register long r2 asm ("rsi") = _2;
34
35 asm volatile(
36 "syscall\n\t"
37 : "+a" (number)
38 : "D" (r1), "S" (r2)
39 : "memory", "cc", "r11", "rcx"
40 );
41 return number;
42}
43
44long syscall3(long _1, long _2, long _3, long number) {
45 register long r1 asm ("rdi") = _1;
46 register long r2 asm ("rsi") = _2;
47 register long r3 asm ("rdx") = _3;
48
49 asm volatile(
50 "syscall\n\t"
51 : "+a" (number)
52 : "D" (r1), "S" (r2), "d" (r3)
53 : "memory", "cc", "r11", "rcx"
54 );
55 return number;
56}
57
58long syscall4(long _1, long _2, long _3, long _4, long number) {
59 register long r1 asm ("rdi") = _1;
60 register long r2 asm ("rsi") = _2;
61 register long r3 asm ("rdx") = _3;
62 register long r4 asm ("r10") = _4;
63
64 asm volatile(
65 "syscall\n\t"
66 : "+a" (number)
67 : "D" (r1), "S" (r2), "d" (r3), "r" (r4)
68 : "memory", "cc", "r11", "rcx"
69 );
70 return number;
71}
72
73long syscall5(long _1, long _2, long _3, long _4, long _5, long number) {
74 register long r1 asm ("rdi") = _1;
75 register long r2 asm ("rsi") = _2;
76 register long r3 asm ("rdx") = _3;
77 register long r4 asm ("r10") = _4;
78 register long r5 asm ("r8") = _5;
79
80 asm volatile(
81 "syscall\n\t"
82 : "+a" (number)
83 : "D" (r1), "S" (r2), "d" (r3), "r" (r4), "r" (r5)
84 : "memory", "cc", "r11", "rcx"
85 );
86 return number;
87}
88
89long syscall6(long _1, long _2, long _3, long _4, long _5, long _6, long number) {
90 register long r1 asm ("rdi") = _1;
91 register long r2 asm ("rsi") = _2;
92 register long r3 asm ("rdx") = _3;
93 register long r4 asm ("r10") = _4;
94 register long r5 asm ("r8") = _5;
95 register long r6 asm ("r9") = _6;
96
97 asm volatile(
98 "syscall\n\t"
99 : "+a" (number)
100 : "D" (r1), "S" (r2), "d" (r3), "r" (r4), "r" (r5), "r" (r6)
101 : "memory", "cc", "r11", "rcx"
102 );
103 return number;
104}
105
106#else
107#error "Linux syscalls not implemented on this architecture"
108#endif
109
110[[deprecated]]
111int syscall_futex_wait(const int *addr, const int expected, struct timespec *timeout) {
112 return (int)syscall(__NR_futex, (long)addr, __NR_futex_wait, expected, (long)timeout);
113}
114
115[[deprecated]]
116int syscall_futex_wake(const int *addr, const int num) {
117 return (int)syscall(__NR_futex, (long)addr, __NR_futex_wake, num);
118}
119
120[[deprecated]]
121long syscall_read(const int fd, void *buff, const size_t size) {
122 return syscall(__NR_read, fd, (long)buff, (long)size);
123}
124
125[[deprecated]]
126long syscall_write(const int fd, const void *buff, const size_t size) {
127 return syscall(__NR_write, fd, (long)buff, (long)size);
128}
129
130[[deprecated]]
131int syscall_close(const int fd) {
132 return (int)syscall(__NR_close, fd);
133}
134
135[[deprecated]]
136void *syscall_mmap(void *addr, const size_t length, const int prot, const int flags, const int fd, const long offset) {
137 return (void*)syscall(__NR_mmap, (long)addr, (long)length, prot, flags, fd, offset);
138}
139
140[[deprecated]]
141int syscall_munmap(void *addr, const size_t length) {
142 return (int)syscall(__NR_munmap, (long)addr, (long)length);
143}
144
145[[deprecated]]
146void clod_exit(const int code) {
147 syscall(__NR_exit, code);
148 __builtin_unreachable();
149}