1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 16:07:47 +00:00

Make syscall invocations look pleasant.

Old: Syscall::invoke(Syscall::SC_foo, (dword)arg1, (dword)arg2)
New: syscall(SC_foo, arg1, arg2)
This commit is contained in:
Andreas Kling 2018-12-21 03:02:06 +01:00
parent 36bd53b36a
commit 3a0a8848fb
13 changed files with 75 additions and 72 deletions

View file

@ -67,12 +67,6 @@
__ENUMERATE_SYSCALL(utime) \ __ENUMERATE_SYSCALL(utime) \
__ENUMERATE_SYSCALL(sync) \ __ENUMERATE_SYSCALL(sync) \
#define DO_SYSCALL_A0(function) Syscall::invoke((dword)(function))
#define DO_SYSCALL_A1(function, arg1) Syscall::invoke((dword)(function), (dword)(arg1))
#define DO_SYSCALL_A2(function, arg1, arg2) Syscall::invoke((dword)(function), (dword)(arg1), (dword)(arg2))
#define DO_SYSCALL_A3(function, arg1, arg2, arg3) Syscall::invoke((dword)(function), (dword)(arg1), (dword)(arg2), (dword)arg3)
namespace Syscall { namespace Syscall {
enum Function { enum Function {
@ -112,25 +106,34 @@ inline dword invoke(Function function)
return result; return result;
} }
inline dword invoke(Function function, dword arg1) template<typename T1>
inline dword invoke(Function function, T1 arg1)
{ {
dword result; dword result;
asm volatile("int $0x80":"=a"(result):"a"(function),"d"(arg1):"memory"); asm volatile("int $0x80":"=a"(result):"a"(function),"d"((dword)arg1):"memory");
return result; return result;
} }
inline dword invoke(Function function, dword arg1, dword arg2) template<typename T1, typename T2>
inline dword invoke(Function function, T1 arg1, T2 arg2)
{ {
dword result; dword result;
asm volatile("int $0x80":"=a"(result):"a"(function),"d"(arg1),"c"(arg2):"memory"); asm volatile("int $0x80":"=a"(result):"a"(function),"d"((dword)arg1),"c"((dword)arg2):"memory");
return result; return result;
} }
inline dword invoke(Function function, dword arg1, dword arg2, dword arg3) template<typename T1, typename T2, typename T3>
inline dword invoke(Function function, T1 arg1, T2 arg2, T3 arg3)
{ {
dword result; dword result;
asm volatile("int $0x80":"=a"(result):"a"(function),"d"(arg1),"c"(arg2),"b"(arg3):"memory"); asm volatile("int $0x80":"=a"(result):"a"(function),"d"((dword)arg1),"c"((dword)arg2),"b"((dword)arg3):"memory");
return result; return result;
} }
} }
#undef __ENUMERATE_SYSCALL
#define __ENUMERATE_SYSCALL(x) using Syscall::SC_ ##x;
ENUMERATE_SYSCALLS
#undef __ENUMERATE_SYSCALL
#define syscall Syscall::invoke

View file

@ -53,7 +53,7 @@ dirent* readdir(DIR* dirp)
if (!dirp->buffer) { if (!dirp->buffer) {
// FIXME: Figure out how much to actually allocate. // FIXME: Figure out how much to actually allocate.
dirp->buffer = (char*)malloc(4096); dirp->buffer = (char*)malloc(4096);
ssize_t nread = Syscall::invoke(Syscall::SC_get_dir_entries, (dword)dirp->fd, (dword)dirp->buffer, 4096); ssize_t nread = syscall(SC_get_dir_entries, dirp->fd, dirp->buffer, 4096);
dirp->buffer_size = nread; dirp->buffer_size = nread;
dirp->nextptr = dirp->buffer; dirp->nextptr = dirp->buffer;
} }

View file

@ -23,10 +23,10 @@ extern "C" int _start()
int status = 254; int status = 254;
int argc; int argc;
char** argv; char** argv;
int rc = Syscall::invoke(Syscall::SC_get_arguments, (dword)&argc, (dword)&argv); int rc = syscall(SC_get_arguments, &argc, &argv);
if (rc < 0) if (rc < 0)
goto epilogue; goto epilogue;
rc = Syscall::invoke(Syscall::SC_get_environment, (dword)&environ); rc = syscall(SC_get_environment, &environ);
if (rc < 0) if (rc < 0)
goto epilogue; goto epilogue;
status = main(argc, argv); status = main(argc, argv);
@ -35,7 +35,7 @@ extern "C" int _start()
fflush(stderr); fflush(stderr);
epilogue: epilogue:
Syscall::invoke(Syscall::SC_exit, status); syscall(SC_exit, status);
// Birger's birthday <3 // Birger's birthday <3
return 20150614; return 20150614;

View file

@ -11,7 +11,7 @@ int fcntl(int fd, int cmd, ...)
va_list ap; va_list ap;
va_start(ap, cmd); va_start(ap, cmd);
dword extra_arg = va_arg(ap, dword); dword extra_arg = va_arg(ap, dword);
int rc = Syscall::invoke(Syscall::SC_fcntl, (dword)fd, (dword)cmd, extra_arg); int rc = syscall(SC_fcntl, fd, cmd, extra_arg);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }

View file

@ -11,7 +11,7 @@ int ioctl(int fd, unsigned request, ...)
va_list ap; va_list ap;
va_start(ap, request); va_start(ap, request);
unsigned arg = va_arg(ap, unsigned); unsigned arg = va_arg(ap, unsigned);
int rc = Syscall::invoke(Syscall::SC_ioctl, (dword)fd, (dword)request, (dword)arg); int rc = syscall(SC_ioctl, fd, request, arg);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }

View file

@ -8,19 +8,19 @@ extern "C" {
void* mmap(void* addr, size_t size, int prot, int flags, int fd, off_t offset) void* mmap(void* addr, size_t size, int prot, int flags, int fd, off_t offset)
{ {
Syscall::SC_mmap_params params { (dword)addr, size, prot, flags, fd, offset }; Syscall::SC_mmap_params params { (dword)addr, size, prot, flags, fd, offset };
int rc = Syscall::invoke(Syscall::SC_mmap, (dword)&params); int rc = syscall(SC_mmap, &params);
__RETURN_WITH_ERRNO(rc, (void*)rc, (void*)-1); __RETURN_WITH_ERRNO(rc, (void*)rc, (void*)-1);
} }
int munmap(void* addr, size_t size) int munmap(void* addr, size_t size)
{ {
int rc = Syscall::invoke(Syscall::SC_munmap, (dword)addr, (dword)size); int rc = syscall(SC_munmap, addr, size);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int set_mmap_name(void* addr, size_t size, const char* name) int set_mmap_name(void* addr, size_t size, const char* name)
{ {
int rc = Syscall::invoke(Syscall::SC_set_mmap_name, (dword)addr, (dword)size, (dword)name); int rc = syscall(SC_set_mmap_name, addr, size, name);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }

View file

@ -8,13 +8,13 @@ extern "C" {
int kill(pid_t pid, int sig) int kill(pid_t pid, int sig)
{ {
int rc = Syscall::invoke(Syscall::SC_kill, (dword)pid, (dword)sig); int rc = syscall(SC_kill, pid, sig);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int killpg(int pgrp, int sig) int killpg(int pgrp, int sig)
{ {
int rc = Syscall::invoke(Syscall::SC_killpg, (dword)pgrp, (dword)sig); int rc = syscall(SC_killpg, pgrp, sig);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
@ -34,7 +34,7 @@ sighandler_t signal(int signum, sighandler_t handler)
int sigaction(int signum, const struct sigaction* act, struct sigaction* old_act) int sigaction(int signum, const struct sigaction* act, struct sigaction* old_act)
{ {
int rc = Syscall::invoke(Syscall::SC_sigaction, (dword)signum, (dword)act, (dword)old_act); int rc = syscall(SC_sigaction, signum, act, old_act);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
@ -83,13 +83,13 @@ int sigismember(const sigset_t* set, int sig)
int sigprocmask(int how, const sigset_t* set, sigset_t* old_set) int sigprocmask(int how, const sigset_t* set, sigset_t* old_set)
{ {
int rc = Syscall::invoke(Syscall::SC_sigprocmask, (dword)how, (dword)set, (dword)old_set); int rc = syscall(SC_sigprocmask, how, set, old_set);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int sigpending(sigset_t* set) int sigpending(sigset_t* set)
{ {
int rc = Syscall::invoke(Syscall::SC_sigpending, (dword)set); int rc = syscall(SC_sigpending, set);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }

View file

@ -6,12 +6,12 @@ extern "C" {
mode_t umask(mode_t mask) mode_t umask(mode_t mask)
{ {
return Syscall::invoke(Syscall::SC_umask, (dword)mask); return syscall(SC_umask, mask);
} }
int mkdir(const char* pathname, mode_t mode) int mkdir(const char* pathname, mode_t mode)
{ {
int rc = Syscall::invoke(Syscall::SC_mkdir, (dword)pathname, (dword)mode); int rc = syscall(SC_mkdir, pathname, mode);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }

View file

@ -18,7 +18,7 @@ time_t time(time_t* tloc)
int gettimeofday(struct timeval* tv, struct timezone*) int gettimeofday(struct timeval* tv, struct timezone*)
{ {
int rc = Syscall::invoke(Syscall::SC_gettimeofday, (dword)tv); int rc = syscall(SC_gettimeofday, tv);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }

View file

@ -4,6 +4,6 @@
clock_t times(struct tms* buf) clock_t times(struct tms* buf)
{ {
int rc = Syscall::invoke(Syscall::SC_times, (dword)buf); int rc = syscall(SC_times, buf);
__RETURN_WITH_ERRNO(rc, rc, (clock_t)-1); __RETURN_WITH_ERRNO(rc, rc, (clock_t)-1);
} }

View file

@ -13,49 +13,49 @@ extern "C" {
pid_t fork() pid_t fork()
{ {
int rc = Syscall::invoke(Syscall::SC_fork); int rc = syscall(SC_fork);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int execve(const char* filename, const char** argv, const char** envp) int execve(const char* filename, const char** argv, const char** envp)
{ {
int rc = Syscall::invoke(Syscall::SC_execve, (dword)filename, (dword)argv, (dword)envp); int rc = syscall(SC_execve, filename, argv, envp);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
uid_t getuid() uid_t getuid()
{ {
return Syscall::invoke(Syscall::SC_getuid); return syscall(SC_getuid);
} }
gid_t getgid() gid_t getgid()
{ {
return Syscall::invoke(Syscall::SC_getgid); return syscall(SC_getgid);
} }
uid_t geteuid() uid_t geteuid()
{ {
return Syscall::invoke(Syscall::SC_geteuid); return syscall(SC_geteuid);
} }
gid_t getegid() gid_t getegid()
{ {
return Syscall::invoke(Syscall::SC_getegid); return syscall(SC_getegid);
} }
pid_t getpid() pid_t getpid()
{ {
return Syscall::invoke(Syscall::SC_getpid); return syscall(SC_getpid);
} }
pid_t getppid() pid_t getppid()
{ {
return Syscall::invoke(Syscall::SC_getppid); return syscall(SC_getppid);
} }
pid_t setsid() pid_t setsid()
{ {
int rc = Syscall::invoke(Syscall::SC_setsid); int rc = syscall(SC_setsid);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
@ -71,19 +71,19 @@ int tcsetpgrp(int fd, pid_t pgid)
int setpgid(pid_t pid, pid_t pgid) int setpgid(pid_t pid, pid_t pgid)
{ {
int rc = Syscall::invoke(Syscall::SC_setpgid, (dword)pid, (dword)pgid); int rc = syscall(SC_setpgid, pid, pgid);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
pid_t getpgid(pid_t pid) pid_t getpgid(pid_t pid)
{ {
int rc = Syscall::invoke(Syscall::SC_getpgid, (dword)pid); int rc = syscall(SC_getpgid, pid);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
pid_t getpgrp() pid_t getpgrp()
{ {
int rc = Syscall::invoke(Syscall::SC_getpgrp); int rc = syscall(SC_getpgrp);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
@ -91,26 +91,26 @@ int open(const char* path, int options, ...)
{ {
va_list ap; va_list ap;
va_start(ap, options); va_start(ap, options);
int rc = Syscall::invoke(Syscall::SC_open, (dword)path, (dword)options, (dword)ap); int rc = syscall(SC_open, path, options, ap);
va_end(ap); va_end(ap);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
ssize_t read(int fd, void* buf, size_t count) ssize_t read(int fd, void* buf, size_t count)
{ {
int rc = Syscall::invoke(Syscall::SC_read, (dword)fd, (dword)buf, (dword)count); int rc = syscall(SC_read, fd, buf, count);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
ssize_t write(int fd, const void* buf, size_t count) ssize_t write(int fd, const void* buf, size_t count)
{ {
int rc = Syscall::invoke(Syscall::SC_write, (dword)fd, (dword)buf, (dword)count); int rc = syscall(SC_write, fd, buf, count);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int ttyname_r(int fd, char* buffer, size_t size) int ttyname_r(int fd, char* buffer, size_t size)
{ {
int rc = Syscall::invoke(Syscall::SC_ttyname_r, (dword)fd, (dword)buffer, (dword)size); int rc = syscall(SC_ttyname_r, fd, buffer, size);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
@ -124,43 +124,43 @@ char* ttyname(int fd)
int close(int fd) int close(int fd)
{ {
int rc = Syscall::invoke(Syscall::SC_close, fd); int rc = syscall(SC_close, fd);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
pid_t waitpid(pid_t waitee, int* wstatus, int options) pid_t waitpid(pid_t waitee, int* wstatus, int options)
{ {
int rc = Syscall::invoke(Syscall::SC_waitpid, waitee, (dword)wstatus, (dword)options); int rc = syscall(SC_waitpid, waitee, wstatus, options);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int lstat(const char* path, struct stat* statbuf) int lstat(const char* path, struct stat* statbuf)
{ {
int rc = Syscall::invoke(Syscall::SC_lstat, (dword)path, (dword)statbuf); int rc = syscall(SC_lstat, path, statbuf);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int stat(const char* path, struct stat* statbuf) int stat(const char* path, struct stat* statbuf)
{ {
int rc = Syscall::invoke(Syscall::SC_stat, (dword)path, (dword)statbuf); int rc = syscall(SC_stat, path, statbuf);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int fstat(int fd, struct stat *statbuf) int fstat(int fd, struct stat *statbuf)
{ {
int rc = Syscall::invoke(Syscall::SC_fstat, (dword)fd, (dword)statbuf); int rc = syscall(SC_fstat, fd, statbuf);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int chdir(const char* path) int chdir(const char* path)
{ {
int rc = Syscall::invoke(Syscall::SC_chdir, (dword)path); int rc = syscall(SC_chdir, path);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
char* getcwd(char* buffer, size_t size) char* getcwd(char* buffer, size_t size)
{ {
int rc = Syscall::invoke(Syscall::SC_getcwd, (dword)buffer, (dword)size); int rc = syscall(SC_getcwd, buffer, size);
__RETURN_WITH_ERRNO(rc, buffer, nullptr); __RETURN_WITH_ERRNO(rc, buffer, nullptr);
} }
@ -172,24 +172,24 @@ char* getwd(char* buf)
int sleep(unsigned seconds) int sleep(unsigned seconds)
{ {
return Syscall::invoke(Syscall::SC_sleep, (dword)seconds); return syscall(SC_sleep, seconds);
} }
int gethostname(char* buffer, size_t size) int gethostname(char* buffer, size_t size)
{ {
int rc = Syscall::invoke(Syscall::SC_gethostname, (dword)buffer, (dword)size); int rc = syscall(SC_gethostname, buffer, size);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
ssize_t readlink(const char* path, char* buffer, size_t size) ssize_t readlink(const char* path, char* buffer, size_t size)
{ {
int rc = Syscall::invoke(Syscall::SC_readlink, (dword)path, (dword)buffer, (dword)size); int rc = syscall(SC_readlink, path, buffer, size);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
off_t lseek(int fd, off_t offset, int whence) off_t lseek(int fd, off_t offset, int whence)
{ {
int rc = Syscall::invoke(Syscall::SC_lseek, (dword)fd, (dword)offset, (dword)whence); int rc = syscall(SC_lseek, fd, offset, whence);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
@ -205,66 +205,66 @@ int unlink(const char*)
int isatty(int fd) int isatty(int fd)
{ {
int rc = Syscall::invoke(Syscall::SC_isatty, (dword)fd); int rc = syscall(SC_isatty, fd);
__RETURN_WITH_ERRNO(rc, 1, 0); __RETURN_WITH_ERRNO(rc, 1, 0);
} }
int getdtablesize() int getdtablesize()
{ {
int rc = Syscall::invoke(Syscall::SC_getdtablesize); int rc = syscall(SC_getdtablesize);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int dup(int old_fd) int dup(int old_fd)
{ {
int rc = Syscall::invoke(Syscall::SC_dup, (dword)old_fd); int rc = syscall(SC_dup, old_fd);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int dup2(int old_fd, int new_fd) int dup2(int old_fd, int new_fd)
{ {
int rc = Syscall::invoke(Syscall::SC_dup2, (dword)old_fd, (dword)new_fd); int rc = syscall(SC_dup2, old_fd, new_fd);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int setgroups(size_t size, const gid_t* list) int setgroups(size_t size, const gid_t* list)
{ {
int rc = Syscall::invoke(Syscall::SC_getgroups, (dword)size, (dword)list); int rc = syscall(SC_getgroups, size, list);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int getgroups(int size, gid_t list[]) int getgroups(int size, gid_t list[])
{ {
int rc = Syscall::invoke(Syscall::SC_getgroups, (dword)size, (dword)list); int rc = syscall(SC_getgroups, size, list);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int pipe(int pipefd[2]) int pipe(int pipefd[2])
{ {
int rc = Syscall::invoke(Syscall::SC_pipe, (dword)pipefd); int rc = syscall(SC_pipe, pipefd);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
unsigned int alarm(unsigned int seconds) unsigned int alarm(unsigned int seconds)
{ {
return Syscall::invoke(Syscall::SC_alarm, (dword)seconds); return syscall(SC_alarm, seconds);
} }
int setuid(uid_t uid) int setuid(uid_t uid)
{ {
int rc = Syscall::invoke(Syscall::SC_setuid, (dword)uid); int rc = syscall(SC_setuid, uid);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int setgid(uid_t gid) int setgid(uid_t gid)
{ {
int rc = Syscall::invoke(Syscall::SC_setgid, (dword)gid); int rc = syscall(SC_setgid, gid);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int access(const char* pathname, int mode) int access(const char* pathname, int mode)
{ {
int rc = Syscall::invoke(Syscall::SC_access, (dword)pathname, (dword)mode); int rc = syscall(SC_access, pathname, mode);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
@ -290,13 +290,13 @@ long pathconf(const char* path, int name)
void _exit(int status) void _exit(int status)
{ {
Syscall::invoke(Syscall::SC_exit, (dword)status); syscall(SC_exit, status);
assert(false); assert(false);
} }
void sync() void sync()
{ {
Syscall::invoke(Syscall::SC_sync); syscall(SC_sync);
} }
} }

View file

@ -6,7 +6,7 @@ extern "C" {
int utime(const char* pathname, const struct utimbuf* buf) int utime(const char* pathname, const struct utimbuf* buf)
{ {
int rc = Syscall::invoke(Syscall::SC_utime, (dword)pathname, (dword)buf); int rc = syscall(SC_utime, (dword)pathname, (dword)buf);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }

View file

@ -6,7 +6,7 @@ extern "C" {
int uname(struct utsname* buf) int uname(struct utsname* buf)
{ {
int rc = Syscall::invoke(Syscall::SC_uname, (dword)buf); int rc = syscall(SC_uname, buf);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }