Luna/libc/src/unistd.cpp

76 lines
1.7 KiB
C++
Raw Normal View History

#include <bits/errno-return.h>
#include <stdarg.h>
#include <stdint.h>
#include <sys/syscall.h>
#include <unistd.h>
extern "C" long arch_invoke_syscall(long, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t);
extern "C"
{
2023-03-11 21:19:58 +00:00
pid_t getpid(void)
{
return (pid_t)syscall(SYS_getpid);
}
2023-03-18 21:31:16 +00:00
int execv(const char* path, char* const* argv)
{
long rc = syscall(SYS_exec, path, argv);
__errno_return(rc, int);
}
long syscall(long num, ...)
{
va_list ap;
va_start(ap, num);
uintptr_t arg0 = va_arg(ap, uintptr_t);
uintptr_t arg1 = va_arg(ap, uintptr_t);
uintptr_t arg2 = va_arg(ap, uintptr_t);
uintptr_t arg3 = va_arg(ap, uintptr_t);
uintptr_t arg4 = va_arg(ap, uintptr_t);
long rc = arch_invoke_syscall(num, arg0, arg1, arg2, arg3, arg4);
va_end(ap);
return rc;
}
int usleep(useconds_t us)
{
long rc = syscall(SYS_usleep, us);
__errno_return(rc, int);
}
unsigned long sleep(unsigned long seconds)
{
syscall(SYS_usleep, seconds * 1000000);
return 0;
}
int close(int fd)
{
long rc = syscall(SYS_close, fd);
__errno_return(rc, int);
}
2023-03-11 17:02:50 +00:00
ssize_t read(int fd, void* buf, size_t size)
{
long rc = syscall(SYS_read, fd, buf, size);
__errno_return(rc, ssize_t);
}
ssize_t write(int fd, const void* buf, size_t size)
{
long rc = syscall(SYS_write, fd, buf, size);
__errno_return(rc, ssize_t);
}
off_t lseek(int fd, off_t offset, int whence)
{
long rc = syscall(SYS_lseek, fd, offset, whence);
__errno_return(rc, off_t);
}
}