From 87baff1fa5e739916ff25da1e4eaccca7b078923 Mon Sep 17 00:00:00 2001 From: DH Date: Tue, 31 Oct 2023 21:32:43 +0300 Subject: [PATCH] [orbis-kernel] implement sys_socket and sys_socketpair stub sys_nmount, sys_wait4, sys_getsid, sys_settimeofday, sys_bind, sys_listen, sys_accept, sys_setsockopt, sys_getsockopt Reduce log spam of sys__umtx_op --- orbis-kernel/src/sys/sys_exit.cpp | 8 ++++- orbis-kernel/src/sys/sys_prot.cpp | 2 +- orbis-kernel/src/sys/sys_time.cpp | 2 +- orbis-kernel/src/sys/sys_uipc.cpp | 47 ++++++++++++++++++++++---- orbis-kernel/src/sys/sys_umtx.cpp | 15 +++++--- orbis-kernel/src/sys/sys_vfs_mount.cpp | 16 ++++++++- 6 files changed, 75 insertions(+), 15 deletions(-) diff --git a/orbis-kernel/src/sys/sys_exit.cpp b/orbis-kernel/src/sys/sys_exit.cpp index d025e92bc..1fc9b864d 100644 --- a/orbis-kernel/src/sys/sys_exit.cpp +++ b/orbis-kernel/src/sys/sys_exit.cpp @@ -1,4 +1,7 @@ #include "sys/sysproto.hpp" +#include "utils/Logs.hpp" +#include +#include orbis::SysResult orbis::sys_exit(Thread *thread, sint status) { if (auto exit = thread->tproc->ops->exit) { @@ -13,5 +16,8 @@ orbis::SysResult orbis::sys_abort2(Thread *thread, ptr why, } orbis::SysResult orbis::sys_wait4(Thread *thread, sint pid, ptr status, sint options, ptr rusage) { - return ErrorCode::NOSYS; + // TODO + ORBIS_LOG_ERROR(__FUNCTION__, pid, status, options, rusage); + std::this_thread::sleep_for(std::chrono::days(1)); + return {}; } diff --git a/orbis-kernel/src/sys/sys_prot.cpp b/orbis-kernel/src/sys/sys_prot.cpp index 5b8decee7..00e9aee09 100644 --- a/orbis-kernel/src/sys/sys_prot.cpp +++ b/orbis-kernel/src/sys/sys_prot.cpp @@ -11,7 +11,7 @@ orbis::SysResult orbis::sys_getpgid(Thread *thread, pid_t pid) { return ErrorCode::NOSYS; } orbis::SysResult orbis::sys_getsid(Thread *thread, pid_t pid) { - return ErrorCode::NOSYS; + return {}; } orbis::SysResult orbis::sys_getuid(Thread *thread) { return ErrorCode::NOSYS; } orbis::SysResult orbis::sys_geteuid(Thread *thread) { return ErrorCode::NOSYS; } diff --git a/orbis-kernel/src/sys/sys_time.cpp b/orbis-kernel/src/sys/sys_time.cpp index 29e7c658b..4a3a665c3 100644 --- a/orbis-kernel/src/sys/sys_time.cpp +++ b/orbis-kernel/src/sys/sys_time.cpp @@ -157,7 +157,7 @@ orbis::SysResult orbis::sys_gettimeofday(Thread *thread, ptr tp, } orbis::SysResult orbis::sys_settimeofday(Thread *thread, ptr tp, ptr tzp) { - return ErrorCode::NOSYS; + return {}; } orbis::SysResult orbis::sys_getitimer(Thread *thread, uint which, ptr itv) { diff --git a/orbis-kernel/src/sys/sys_uipc.cpp b/orbis-kernel/src/sys/sys_uipc.cpp index a87c04d9a..59fe81d74 100644 --- a/orbis-kernel/src/sys/sys_uipc.cpp +++ b/orbis-kernel/src/sys/sys_uipc.cpp @@ -1,20 +1,43 @@ +#include "pipe.hpp" #include "sys/sysproto.hpp" +#include "utils/Logs.hpp" +#include +#include +#include orbis::SysResult orbis::sys_socket(Thread *thread, sint domain, sint type, sint protocol) { + ORBIS_LOG_TODO(__FUNCTION__, domain, type, protocol); + if (auto socket = thread->tproc->ops->socket) { + Ref file; + auto result = socket(thread, nullptr, domain, type, protocol, &file); + + if (result.isError()) { + return result; + } + + auto fd = thread->tproc->fileDescriptors.insert(file); + ORBIS_LOG_WARNING("Socket opened", fd); + thread->retval[0] = fd; + return {}; + } return ErrorCode::NOSYS; } orbis::SysResult orbis::sys_bind(Thread *thread, sint s, caddr_t name, sint namelen) { - return ErrorCode::NOSYS; + ORBIS_LOG_ERROR(__FUNCTION__, s, name, namelen); + return {}; } orbis::SysResult orbis::sys_listen(Thread *thread, sint s, sint backlog) { - return ErrorCode::NOSYS; + ORBIS_LOG_ERROR(__FUNCTION__, s, backlog); + return {}; } orbis::SysResult orbis::sys_accept(Thread *thread, sint s, ptr from, ptr fromlenaddr) { - return ErrorCode::NOSYS; + ORBIS_LOG_ERROR(__FUNCTION__, s, from, fromlenaddr); + std::this_thread::sleep_for(std::chrono::days(1)); + return SysResult::notAnError(ErrorCode::WOULDBLOCK); } orbis::SysResult orbis::sys_connect(Thread *thread, sint s, caddr_t name, sint namelen) { @@ -22,12 +45,20 @@ orbis::SysResult orbis::sys_connect(Thread *thread, sint s, caddr_t name, } orbis::SysResult orbis::sys_socketpair(Thread *thread, sint domain, sint type, sint protocol, ptr rsv) { - return ErrorCode::NOSYS; + ORBIS_LOG_ERROR(__FUNCTION__, domain, type, protocol, rsv); + + auto pipe = createPipe(); + auto a = thread->tproc->fileDescriptors.insert(pipe); + auto b = thread->tproc->fileDescriptors.insert(pipe); + if (auto errc = uwrite(rsv, a); errc != ErrorCode{}) { + return errc; + } + return uwrite(rsv + 1, b); } orbis::SysResult orbis::sys_sendto(Thread *thread, sint s, caddr_t buf, size_t len, sint flags, caddr_t to, sint tolen) { - return ErrorCode::NOSYS; + return {}; } orbis::SysResult orbis::sys_sendmsg(Thread *thread, sint s, ptr msg, sint flags) { @@ -48,12 +79,14 @@ orbis::SysResult orbis::sys_shutdown(Thread *thread, sint s, sint how) { } orbis::SysResult orbis::sys_setsockopt(Thread *thread, sint s, sint level, sint name, caddr_t val, sint valsize) { - return ErrorCode::NOSYS; + ORBIS_LOG_TODO(__FUNCTION__, s, level, name, val, valsize); + return {}; } orbis::SysResult orbis::sys_getsockopt(Thread *thread, sint s, sint level, sint name, caddr_t val, ptr avalsize) { - return ErrorCode::NOSYS; + ORBIS_LOG_TODO(__FUNCTION__, s, level, name, val, avalsize); + return {}; } orbis::SysResult orbis::sys_getsockname(Thread *thread, sint fdes, ptr asa, diff --git a/orbis-kernel/src/sys/sys_umtx.cpp b/orbis-kernel/src/sys/sys_umtx.cpp index 0783e51a8..4b8a97d4c 100644 --- a/orbis-kernel/src/sys/sys_umtx.cpp +++ b/orbis-kernel/src/sys/sys_umtx.cpp @@ -34,7 +34,7 @@ orbis::SysResult orbis::sys__umtx_op(Thread *thread, ptr obj, sint op, ORBIS_LOG_TRACE(__FUNCTION__, obj, op, val, uaddr1, uaddr2); if (reinterpret_cast(obj) - 0x10000 > 0xff'fffe'ffff) return ErrorCode::FAULT; - auto with_timeout = [&](auto op, bool loop = true) -> orbis::ErrorCode { + auto with_timeout = [&](auto op, bool loop = true) -> SysResult { timespec *ts = nullptr; timespec timeout{}; if (uaddr2 != nullptr) { @@ -59,8 +59,15 @@ orbis::SysResult orbis::sys__umtx_op(Thread *thread, ptr obj, sint op, usec += (timeout.nsec + 999) / 1000; if (usec >= UINT64_MAX) usec = -2; - if (!loop) - return op(usec); + + if (!loop) { + if (auto result = op(usec); result != ErrorCode::TIMEDOUT) { + return result; + } + + return SysResult::notAnError(ErrorCode::TIMEDOUT); + } + auto start = std::chrono::steady_clock::now(); std::uint64_t udiff = 0; while (true) { @@ -70,7 +77,7 @@ orbis::SysResult orbis::sys__umtx_op(Thread *thread, ptr obj, sint op, std::chrono::steady_clock::now() - start) .count(); if (udiff >= usec) - return ErrorCode::TIMEDOUT; + return SysResult::notAnError(ErrorCode::TIMEDOUT); } } }; diff --git a/orbis-kernel/src/sys/sys_vfs_mount.cpp b/orbis-kernel/src/sys/sys_vfs_mount.cpp index 3f80cc105..0d94f3511 100644 --- a/orbis-kernel/src/sys/sys_vfs_mount.cpp +++ b/orbis-kernel/src/sys/sys_vfs_mount.cpp @@ -1,4 +1,6 @@ #include "sys/sysproto.hpp" +#include "uio.hpp" +#include "utils/Logs.hpp" orbis::SysResult orbis::sys_mount(Thread *thread, ptr type, ptr path, sint flags, caddr_t data) { @@ -10,5 +12,17 @@ orbis::SysResult orbis::sys_unmount(Thread *thread, ptr path, } orbis::SysResult orbis::sys_nmount(Thread *thread, ptr iovp, uint iovcnt, sint flags) { - return ErrorCode::NOSYS; + ORBIS_LOG_ERROR(__FUNCTION__, iovp, iovcnt, flags); + + for (auto it = iovp; it < iovp + iovcnt; it += 2) { + IoVec a{}, b{}; + uread(a, it); + uread(b, it + 1); + + std::string aSv((char *)a.base, a.len); + std::string bSv((char *)b.base, b.len); + + std::fprintf(stderr, "%s: '%s':'%s'\n", __FUNCTION__, aSv.c_str(), bSv.c_str()); + } + return {}; }