--- /dev/null
+#ifndef ULIBC_SYS_IOCTL_H
+#define ULIBC_SYS_IOCTL_H
+
+int ioctl(int fd, unsigned long cmd, void* arg);
+
+#endif
--- /dev/null
+#ifndef ULIBC_SYS_MMAN_H
+#define ULIBC_SYS_MMAN_H
+
+#include <stddef.h>
+
+#define PROT_NONE 0x0
+#define PROT_READ 0x1
+#define PROT_WRITE 0x2
+#define PROT_EXEC 0x4
+
+#define MAP_SHARED 0x01
+#define MAP_PRIVATE 0x02
+#define MAP_FIXED 0x10
+#define MAP_ANONYMOUS 0x20
+
+#define MAP_FAILED ((void*)-1)
+
+void* mmap(void* addr, size_t length, int prot, int flags, int fd, int offset);
+int munmap(void* addr, size_t length);
+
+#endif
--- /dev/null
+#ifndef ULIBC_TIME_H
+#define ULIBC_TIME_H
+
+#include <stdint.h>
+
+struct timespec {
+ uint32_t tv_sec;
+ uint32_t tv_nsec;
+};
+
+#define CLOCK_REALTIME 0
+#define CLOCK_MONOTONIC 1
+
+int nanosleep(const struct timespec* req, struct timespec* rem);
+int clock_gettime(int clk_id, struct timespec* tp);
+
+#endif
--- /dev/null
+#include "sys/ioctl.h"
+#include "syscall.h"
+#include "errno.h"
+
+int ioctl(int fd, unsigned long cmd, void* arg) {
+ return __syscall_ret(_syscall3(SYS_IOCTL, fd, (int)cmd, (int)arg));
+}
--- /dev/null
+#include "sys/mman.h"
+#include "syscall.h"
+#include "errno.h"
+
+void* mmap(void* addr, size_t length, int prot, int flags, int fd, int offset) {
+ int ret = _syscall5(SYS_MMAP, (int)addr, (int)length, prot, flags, fd);
+ (void)offset;
+ if (ret < 0 && ret > -4096) {
+ errno = -ret;
+ return MAP_FAILED;
+ }
+ return (void*)ret;
+}
+
+int munmap(void* addr, size_t length) {
+ return __syscall_ret(_syscall2(SYS_MUNMAP, (int)addr, (int)length));
+}
--- /dev/null
+#include "time.h"
+#include "syscall.h"
+#include "errno.h"
+
+int nanosleep(const struct timespec* req, struct timespec* rem) {
+ return __syscall_ret(_syscall2(SYS_NANOSLEEP, (int)req, (int)rem));
+}
+
+int clock_gettime(int clk_id, struct timespec* tp) {
+ return __syscall_ret(_syscall2(SYS_CLOCK_GETTIME, clk_id, (int)tp));
+}