#include "mlibc/tcb.hpp" #include #include #include #include #include #include #include "syscall.h" #define SYS_EXIT 60 #define SYS_READ 0 #define SYS_WRITE 1 #define STUB() \ ({ \ __ensure(!"STUB function was called"); \ __builtin_unreachable(); \ }) namespace mlibc { void sys_libc_log(const char *msg) { ssize_t dummy; sys_write(1, msg, strlen(msg), &dummy); } void sys_libc_panic() { sys_libc_log("!!! mlibc panic !!!\n"); sys_exit(1); __builtin_trap(); } int sys_isatty(int fd) { return 0; // everything is a tty for now } int sys_write(int fd, const void *buf, size_t size, ssize_t *ret) { long r = syscall(SYS_WRITE, fd, (uintptr_t)buf, size); if (ret) *ret = r; return r >= 0 ? 0 : -r; } int sys_read(int fd, void *buf, size_t size, ssize_t *ret) { long r = syscall(SYS_READ, fd, (uintptr_t)buf, size); if (ret) *ret = r; return r >= 0 ? 0 : -r; } void sys_exit(int status) { syscall(SYS_EXIT, status); __builtin_unreachable(); } int sys_close(int fd) { long r = syscall(SYS_CLOSE, fd); return r >= 0 ? 0 : -r; } // ───────────────────────────────────────────────────────────────────────────── // Memory // ───────────────────────────────────────────────────────────────────────────── int sys_anon_allocate(size_t size, void **pointer) { long r = syscall(SYS_MMAP, 0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); *pointer = (void*)r; return (r == (long)MAP_FAILED) ? ENOMEM : 0; } int sys_anon_free(void *ptr, size_t size) { if (!ptr || size == 0) return 0; long r = syscall(SYS_MUNMAP, (uintptr_t)ptr, size); return r == 0 ? 0 : ENOMEM; } int sys_vm_map(void *hint, size_t size, int prot, int flags, int fd, off_t offset, void **out) { long r = syscall(SYS_MMAP, (uintptr_t)hint, size, prot, flags, fd, offset); if (r < 0) return -r; *out = (void *)r; return 0; } int sys_vm_unmap(void *addr, size_t size) { long r = syscall(SYS_MUNMAP, (uintptr_t)addr, size); return (r == 0) ? 0 : -r; } // ───────────────────────────────────────────────────────────────────────────── // Others // ───────────────────────────────────────────────────────────────────────────── int sys_seek(int, off_t, int, off_t *) { return ESPIPE; // no real files yet } int sys_tcb_set(void *pointer) { sys_libc_log("[sysdeps] sys_tcb_set called"); long ret = syscall(SYS_TCB_SET, (uintptr_t)pointer); if (ret < 0) return -ret; sys_libc_log("[sysdeps] TCB set via syscall.\n"); return 0; } int sys_open(const char *path, int flags, unsigned int mode, int *fd) { (void)flags; (void)mode; long r = syscall(SYS_OPEN, (uintptr_t)path); if (r < 0) return -r; *fd = (int)r; return 0; } // Futexes int sys_futex_wait(int *ptr, int expected, const timespec *time) { long r = syscall(SYS_FUTEX, ptr, 0, expected, time); return (r < 0) ? -r : 0; } int sys_futex_wake(int *ptr) { long r = syscall(SYS_FUTEX, ptr, 1, 1, 0); return (r < 0) ? -r : 0; } int sys_clock_get(int, time_t *, long *) { return ENOSYS; } } // namespace mlibc