user: implement mlibc as the libc, finally.
It's finally done.. Signed-off-by: kaguya <vpshinomiya@protonmail.com>
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
#include "mlibc/tcb.hpp"
|
||||
#include <abi-bits/errno.h>
|
||||
#include <bits/ensure.h>
|
||||
#include <bits/syscall.h>
|
||||
#include <mlibc/all-sysdeps.hpp>
|
||||
#include <string.h>
|
||||
|
||||
#include <mlibc/sysdeps.hpp>
|
||||
|
||||
#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
|
||||
Reference in New Issue
Block a user