From 580c7c6a8ae9cceff649d668b0d122614620e9dd Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Mon, 7 Jul 2025 12:30:44 +0200 Subject: [PATCH 1/6] [compiler-rt] Avoid using musl's syscall layer. NFC Use libc calls instead, similar to the NetBSD and macOS implementations. --- .../sanitizer_common/sanitizer_emscripten.cpp | 96 +++++++++++++- .../lib/sanitizer_common/sanitizer_linux.cpp | 125 ++++-------------- .../sanitizer_platform_interceptors.h | 2 +- .../sanitizer_platform_limits_posix.h | 14 +- .../sanitizer_syscall_generic.inc | 6 +- tools/system_libs.py | 4 +- 6 files changed, 137 insertions(+), 110 deletions(-) diff --git a/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_emscripten.cpp b/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_emscripten.cpp index 1f71de0743277..33f3eb602fbd3 100644 --- a/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_emscripten.cpp +++ b/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_emscripten.cpp @@ -14,17 +14,25 @@ //===----------------------------------------------------------------------===// #include "sanitizer_platform.h" +#include "sanitizer_platform_limits_posix.h" #include "sanitizer_common.h" #include "sanitizer_stoptheworld.h" +#include #include #include +#include +#include #if SANITIZER_EMSCRIPTEN +#include +#include + #include #include -#include +#include +#include #include "emscripten_internal.h" @@ -128,6 +136,92 @@ u64 MonotonicNanoTime() { void GetMemoryProfile(fill_profile_f cb, uptr *stats) {} +int internal_madvise(uptr addr, uptr length, int advice) { + return 0; // madvise is currently ignored +} + +uptr internal_close(fd_t fd) { + return __wasi_fd_close(fd); +} + +uptr internal_open(const char *filename, int flags) { + return open(filename, flags); +} + +uptr internal_open(const char *filename, int flags, u32 mode) { + return open(filename, flags, mode); +} + +uptr internal_read(fd_t fd, void *buf, uptr count) { + __wasi_iovec_t iov = { (uint8_t*)buf, count }; + size_t num; + if (__wasi_syscall_ret(__wasi_fd_read(fd, &iov, 1, &num))) { + return -1; + } + return num; +} + +uptr internal_write(fd_t fd, const void *buf, uptr count) { + __wasi_ciovec_t iov = { (const uint8_t*)buf, count }; + size_t num; + if (__wasi_syscall_ret(__wasi_fd_write(fd, &iov, 1, &num))) { + return -1; + } + return num; +} + +uptr internal_stat(const char *path, void *buf) { + return stat(path, (struct stat *)buf); +} + +uptr internal_fstat(fd_t fd, void *buf) { + return fstat(fd, (struct stat *)buf); +} + +uptr internal_filesize(fd_t fd) { + struct stat st; + if (internal_fstat(fd, &st)) + return -1; + return (uptr)st.st_size; +} + +uptr internal_dup(int oldfd) { + return dup(oldfd); +} + +uptr internal_getpid() { + return 42; +} + +uptr internal_sched_yield() { + return sched_yield(); +} + +void internal_sigfillset(__sanitizer_sigset_t *set) { + sigfillset(set); +} + +uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set, + __sanitizer_sigset_t *oldset) { + return sigprocmask(how, set, oldset); +} + +void internal_usleep(u64 useconds) { + usleep(useconds); +} + +void internal__exit(int exitcode) { + __wasi_proc_exit(exitcode); +} + +tid_t GetTid() { + return gettid(); +} + +uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp) { + return clock_gettime(clk_id, (struct timespec *)tp); +} + } // namespace __sanitizer #endif diff --git a/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp index 0a77861b1af11..4607f13e054da 100644 --- a/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp +++ b/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp @@ -115,15 +115,8 @@ extern struct ps_strings *__ps_strings; # endif # if SANITIZER_EMSCRIPTEN -# define weak __attribute__(__weak__) -# define hidden __attribute__((__visibility__("hidden"))) -# include -# undef weak -# undef hidden -# include -# include -# include -# include +# include // For INFINITY +# include // For emscripten_futex_wait # endif extern char **environ; @@ -254,8 +247,8 @@ ScopedBlockSignals::~ScopedBlockSignals() { SetSigProcMask(&saved_, nullptr); } # endif // --------------- sanitizer_libc.h -# if !SANITIZER_SOLARIS && !SANITIZER_NETBSD -# if !SANITIZER_S390 && !SANITIZER_EMSCRIPTEN +# if !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN +# if !SANITIZER_S390 uptr internal_mmap(void *addr, uptr length, int prot, int flags, int fd, u64 offset) { # if SANITIZER_FREEBSD @@ -270,25 +263,23 @@ uptr internal_mmap(void *addr, uptr length, int prot, int flags, int fd, (OFF_T)(offset / 4096)); # endif } -# endif // !SANITIZER_S390 && !SANITIZER_EMSCRIPTEN +# endif // !SANITIZER_S390 -# if !SANITIZER_EMSCRIPTEN uptr internal_munmap(void *addr, uptr length) { return internal_syscall(SYSCALL(munmap), (uptr)addr, length); } -# if SANITIZER_LINUX +# if SANITIZER_LINUX uptr internal_mremap(void *old_address, uptr old_size, uptr new_size, int flags, void *new_address) { return internal_syscall(SYSCALL(mremap), (uptr)old_address, old_size, new_size, flags, (uptr)new_address); } -# endif +# endif int internal_mprotect(void *addr, uptr length, int prot) { return internal_syscall(SYSCALL(mprotect), (uptr)addr, length, prot); } -# endif int internal_madvise(uptr addr, uptr length, int advice) { return internal_syscall(SYSCALL(madvise), addr, length, advice); @@ -301,15 +292,11 @@ uptr internal_close_range(fd_t lowfd, fd_t highfd, int flags) { # endif uptr internal_close(fd_t fd) { -# if SANITIZER_EMSCRIPTEN - return __wasi_fd_close(fd); -# else return internal_syscall(SYSCALL(close), fd); -# endif } uptr internal_open(const char *filename, int flags) { -# if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN +# if SANITIZER_LINUX return internal_syscall(SYSCALL(openat), AT_FDCWD, (uptr)filename, flags); # else return internal_syscall(SYSCALL(open), (uptr)filename, flags); @@ -317,7 +304,7 @@ uptr internal_open(const char *filename, int flags) { } uptr internal_open(const char *filename, int flags, u32 mode) { -# if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN +# if SANITIZER_LINUX return internal_syscall(SYSCALL(openat), AT_FDCWD, (uptr)filename, flags, mode); # else @@ -326,35 +313,17 @@ uptr internal_open(const char *filename, int flags, u32 mode) { } uptr internal_read(fd_t fd, void *buf, uptr count) { -# if SANITIZER_EMSCRIPTEN - __wasi_iovec_t iov = {(uint8_t *)buf, count}; - size_t num; - if (__wasi_syscall_ret(__wasi_fd_read(fd, &iov, 1, &num))) { - return -1; - } - return num; -# else sptr res; HANDLE_EINTR(res, (sptr)internal_syscall(SYSCALL(read), fd, (uptr)buf, count)); return res; -# endif } uptr internal_write(fd_t fd, const void *buf, uptr count) { -# if SANITIZER_EMSCRIPTEN - __wasi_ciovec_t iov = {(const uint8_t *)buf, count}; - size_t num; - if (__wasi_syscall_ret(__wasi_fd_write(fd, &iov, 1, &num))) { - return -1; - } - return num; -# else sptr res; HANDLE_EINTR(res, (sptr)internal_syscall(SYSCALL(write), fd, (uptr)buf, count)); return res; -# endif } uptr internal_ftruncate(fd_t fd, uptr size) { @@ -577,7 +546,7 @@ uptr internal_filesize(fd_t fd) { uptr internal_dup(int oldfd) { return internal_syscall(SYSCALL(dup), oldfd); } uptr internal_dup2(int oldfd, int newfd) { -# if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN +# if SANITIZER_LINUX return internal_syscall(SYSCALL(dup3), oldfd, newfd, 0); # else return internal_syscall(SYSCALL(dup2), oldfd, newfd); @@ -585,7 +554,7 @@ uptr internal_dup2(int oldfd, int newfd) { } uptr internal_readlink(const char *path, char *buf, uptr bufsize) { -# if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN +# if SANITIZER_LINUX return internal_syscall(SYSCALL(readlinkat), AT_FDCWD, (uptr)path, (uptr)buf, bufsize); # else @@ -594,7 +563,7 @@ uptr internal_readlink(const char *path, char *buf, uptr bufsize) { } uptr internal_unlink(const char *path) { -# if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN +# if SANITIZER_LINUX return internal_syscall(SYSCALL(unlinkat), AT_FDCWD, (uptr)path, 0); # else return internal_syscall(SYSCALL(unlink), (uptr)path); @@ -605,7 +574,7 @@ uptr internal_rename(const char *oldpath, const char *newpath) { # if (defined(__riscv) || defined(__loongarch__)) && defined(__linux__) return internal_syscall(SYSCALL(renameat2), AT_FDCWD, (uptr)oldpath, AT_FDCWD, (uptr)newpath, 0); -# elif SANITIZER_LINUX || SANITIZER_EMSCRIPTEN +# elif SANITIZER_LINUX return internal_syscall(SYSCALL(renameat), AT_FDCWD, (uptr)oldpath, AT_FDCWD, (uptr)newpath); # else @@ -614,45 +583,33 @@ uptr internal_rename(const char *oldpath, const char *newpath) { } uptr internal_sched_yield() { -# if SANITIZER_EMSCRIPTEN - return 0; -# else return internal_syscall(SYSCALL(sched_yield)); -# endif } void internal_usleep(u64 useconds) { -# if SANITIZER_EMSCRIPTEN - usleep(useconds); -# else struct timespec ts; ts.tv_sec = useconds / 1000000; ts.tv_nsec = (useconds % 1000000) * 1000; internal_syscall(SYSCALL(nanosleep), &ts, &ts); -# endif } -# if !SANITIZER_EMSCRIPTEN uptr internal_execve(const char *filename, char *const argv[], char *const envp[]) { return internal_syscall(SYSCALL(execve), (uptr)filename, (uptr)argv, (uptr)envp); } -# endif // !SANITIZER_EMSCRIPTEN -# endif // !SANITIZER_SOLARIS && !SANITIZER_NETBSD +# endif // !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN -# if !SANITIZER_NETBSD +# if !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN void internal__exit(int exitcode) { -# if SANITIZER_EMSCRIPTEN - __wasi_proc_exit(exitcode); -# elif SANITIZER_FREEBSD || SANITIZER_SOLARIS +# if SANITIZER_FREEBSD || SANITIZER_SOLARIS internal_syscall(SYSCALL(exit), exitcode); # else internal_syscall(SYSCALL(exit_group), exitcode); # endif Die(); // Unreachable. } -# endif // !SANITIZER_NETBSD +# endif // !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN // ----------------- sanitizer_common.h bool FileExists(const char *filename) { @@ -672,7 +629,7 @@ bool DirExists(const char *path) { return S_ISDIR(st.st_mode); } -# if !SANITIZER_NETBSD +# if !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN tid_t GetTid() { # if SANITIZER_FREEBSD long Tid; @@ -680,8 +637,6 @@ tid_t GetTid() { return Tid; # elif SANITIZER_SOLARIS return thr_self(); -# elif SANITIZER_EMSCRIPTEN - return (tid_t)pthread_self(); # else return internal_syscall(SYSCALL(gettid)); # endif @@ -722,16 +677,6 @@ u64 NanoTime() { } # endif -# if SANITIZER_EMSCRIPTEN -extern "C" { -int __clock_gettime(__sanitizer_clockid_t clk_id, void *tp); -} - -uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp) { - return __clock_gettime(clk_id, tp); -} -# endif - // Like getenv, but reads env directly from /proc (on Linux) or parses the // 'environ' array (on some others) and does not use libc. This function // should be called first inside __asan_init. @@ -916,14 +861,12 @@ struct linux_dirent { }; # endif -# if !SANITIZER_SOLARIS && !SANITIZER_NETBSD -# if !SANITIZER_EMSCRIPTEN +# if !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN // Syscall wrappers. uptr internal_ptrace(int request, int pid, void *addr, void *data) { return internal_syscall(SYSCALL(ptrace), request, pid, (uptr)addr, (uptr)data); } -# endif uptr internal_waitpid(int pid, int *status, int options) { return internal_syscall(SYSCALL(wait4), pid, (uptr)status, options, @@ -953,14 +896,7 @@ uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count) { } uptr internal_lseek(fd_t fd, OFF_T offset, int whence) { -# if SANITIZER_EMSCRIPTEN - __wasi_filesize_t result; - return __wasi_syscall_ret(__wasi_fd_seek(fd, offset, whence, &result)) - ? -1 - : result; -# else return internal_syscall(SYSCALL(lseek), fd, offset, whence); -# endif } # if SANITIZER_LINUX @@ -976,32 +912,25 @@ uptr internal_arch_prctl(int option, uptr arg2) { # endif # endif -# if !SANITIZER_EMSCRIPTEN uptr internal_sigaltstack(const void *ss, void *oss) { return internal_syscall(SYSCALL(sigaltstack), (uptr)ss, (uptr)oss); } -# endif extern "C" pid_t __fork(void); int internal_fork() { -# if SANITIZER_EMSCRIPTEN - Report("fork not supported on emscripten\n"); - return -1; -# else -# if SANITIZER_LINUX -# if SANITIZER_S390 +# if SANITIZER_LINUX +# if SANITIZER_S390 return internal_syscall(SYSCALL(clone), 0, SIGCHLD); -# elif SANITIZER_SPARC +# elif SANITIZER_SPARC // The clone syscall interface on SPARC differs massively from the rest, // so fall back to __fork. return __fork(); -# else - return internal_syscall(SYSCALL(clone), SIGCHLD, 0); -# endif # else - return internal_syscall(SYSCALL(fork)); + return internal_syscall(SYSCALL(clone), SIGCHLD, 0); # endif +# else + return internal_syscall(SYSCALL(fork)); # endif } @@ -1093,8 +1022,6 @@ uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set, __sanitizer_sigset_t *oldset) { # if SANITIZER_FREEBSD return internal_syscall(SYSCALL(sigprocmask), how, set, oldset); -# elif SANITIZER_EMSCRIPTEN - return 0; # else __sanitizer_kernel_sigset_t *k_set = (__sanitizer_kernel_sigset_t *)set; __sanitizer_kernel_sigset_t *k_oldset = (__sanitizer_kernel_sigset_t *)oldset; @@ -1146,7 +1073,7 @@ bool internal_sigismember(__sanitizer_sigset_t *set, int signum) { return sigismember(rset, signum); } # endif -# endif // !SANITIZER_SOLARIS +# endif // !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN # if !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN // ThreadLister implementation. diff --git a/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h index 15a72d2d714d1..3cc84b995c62f 100644 --- a/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -308,7 +308,7 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment, #define SANITIZER_INTERCEPT_SENDMMSG SI_LINUX #define SANITIZER_INTERCEPT_SYSMSG SI_LINUX_NOT_ANDROID #define SANITIZER_INTERCEPT_GETPEERNAME SI_POSIX -#define SANITIZER_INTERCEPT_IOCTL SI_POSIX && !SI_EMSCRIPTEN +#define SANITIZER_INTERCEPT_IOCTL SI_POSIX_NOT_EMSCRIPTEN #define SANITIZER_INTERCEPT_INET_ATON SI_POSIX #define SANITIZER_INTERCEPT_SYSINFO SI_LINUX #define SANITIZER_INTERCEPT_READDIR SI_POSIX diff --git a/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h index cb60606f9cbd3..aa05c4f577791 100644 --- a/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h +++ b/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h @@ -38,6 +38,11 @@ #define SANITIZER_HAS_STATFS64 1 #endif +#if SANITIZER_EMSCRIPTEN +#include // For sigset_t +#include // For clock_t and clockid_t +#endif + #if defined(__sparc__) // FIXME: This can't be included from tsan which does not support sparc yet. #include "sanitizer_glibc_version.h" @@ -534,16 +539,19 @@ extern unsigned struct_sock_fprog_sz; #endif #if SANITIZER_EMSCRIPTEN -typedef int __sanitizer_clock_t; +typedef clock_t __sanitizer_clock_t; #elif defined(__x86_64__) && !defined(_LP64) typedef long long __sanitizer_clock_t; #else typedef long __sanitizer_clock_t; #endif -#if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN +#if SANITIZER_LINUX typedef int __sanitizer_clockid_t; typedef unsigned long long __sanitizer_eventfd_t; +#elif SANITIZER_EMSCRIPTEN +typedef clockid_t __sanitizer_clockid_t; +// eventfd is Unix-specific. #endif #if SANITIZER_LINUX @@ -596,7 +604,7 @@ struct __sanitizer_sigset_t { uptr val[128 / sizeof(uptr)]; }; #elif SANITIZER_EMSCRIPTEN -typedef unsigned long __sanitizer_sigset_t; +typedef sigset_t __sanitizer_sigset_t; #endif struct __sanitizer_siginfo_pad { diff --git a/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_syscall_generic.inc b/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_syscall_generic.inc index ae2cea517c1f9..2780f885d5ab8 100644 --- a/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_syscall_generic.inc +++ b/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_syscall_generic.inc @@ -10,10 +10,10 @@ // //===----------------------------------------------------------------------===// -// NetBSD uses libc calls directly -#if !SANITIZER_NETBSD +// NetBSD and Emscripten uses libc calls directly +#if !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN -#if SANITIZER_FREEBSD || SANITIZER_APPLE || SANITIZER_SOLARIS || SANITIZER_EMSCRIPTEN +#if SANITIZER_FREEBSD || SANITIZER_APPLE || SANITIZER_SOLARIS # define SYSCALL(name) SYS_ ## name #else # define SYSCALL(name) __NR_ ## name diff --git a/tools/system_libs.py b/tools/system_libs.py index 711dc4d5844ea..883c734e84942 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -2125,9 +2125,7 @@ class libubsan_minimal_rt(CompilerRTLibrary, MTLibrary): class libsanitizer_common_rt(CompilerRTLibrary, MTLibrary): name = 'libsanitizer_common_rt' - # TODO(sbc): We should not need musl-internal headers here. - includes = ['system/lib/libc/musl/src/internal', - 'system/lib/compiler-rt/lib', + includes = ['system/lib/compiler-rt/lib', 'system/lib/libc'] never_force = True cflags = [ From 302d38aab2f665c4361a7b3a0aa2e68f009e420d Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Mon, 7 Jul 2025 12:43:56 +0200 Subject: [PATCH 2/6] Sync with LLVM 20.1.4 --- .../compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp index 4607f13e054da..538f0570e131b 100644 --- a/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp +++ b/system/lib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp @@ -290,10 +290,7 @@ uptr internal_close_range(fd_t lowfd, fd_t highfd, int flags) { return internal_syscall(SYSCALL(close_range), lowfd, highfd, flags); } # endif - -uptr internal_close(fd_t fd) { - return internal_syscall(SYSCALL(close), fd); -} +uptr internal_close(fd_t fd) { return internal_syscall(SYSCALL(close), fd); } uptr internal_open(const char *filename, int flags) { # if SANITIZER_LINUX @@ -582,9 +579,7 @@ uptr internal_rename(const char *oldpath, const char *newpath) { # endif } -uptr internal_sched_yield() { - return internal_syscall(SYSCALL(sched_yield)); -} +uptr internal_sched_yield() { return internal_syscall(SYSCALL(sched_yield)); } void internal_usleep(u64 useconds) { struct timespec ts; From 8ee08edee65a66b311e50cd41535419b6521da74 Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Tue, 19 Jul 2022 19:57:30 +0200 Subject: [PATCH 3/6] Use correct types for syscalls --- system/lib/libc/emscripten_syscall_stubs.c | 44 ++++++------- .../libc/musl/arch/emscripten/syscall_arch.h | 62 +++++++++---------- system/lib/standalone/standalone.c | 2 +- system/lib/wasmfs/js_api.cpp | 2 +- system/lib/wasmfs/syscalls.cpp | 18 +++--- 5 files changed, 64 insertions(+), 64 deletions(-) diff --git a/system/lib/libc/emscripten_syscall_stubs.c b/system/lib/libc/emscripten_syscall_stubs.c index ba865709babce..429d7810fc809 100644 --- a/system/lib/libc/emscripten_syscall_stubs.c +++ b/system/lib/libc/emscripten_syscall_stubs.c @@ -25,10 +25,10 @@ #include #include -static int g_pid = 42; -static int g_pgid = 42; -static int g_ppid = 1; -static int g_sid = 42; +static pid_t g_pid = 42; +static pid_t g_pgid = 42; +static pid_t g_ppid = 1; +static pid_t g_sid = 42; static mode_t g_umask = S_IWGRP | S_IWOTH; #ifdef NDEBUG @@ -69,7 +69,7 @@ weak int __syscall_uname(intptr_t buf) { return 0; } -weak int __syscall_setpgid(int pid, int pgid) { +weak int __syscall_setpgid(pid_t pid, pid_t pgid) { if (pid && pid != g_pid) { return -ESRCH; } @@ -83,25 +83,25 @@ weak int __syscall_sync() { return 0; } -weak int __syscall_getsid(int pid) { +weak pid_t __syscall_getsid(pid_t pid) { if (pid && pid != g_pid) { return -ESRCH; } return g_sid; } -weak int __syscall_getpgid(int pid) { +weak pid_t __syscall_getpgid(pid_t pid) { if (pid && pid != g_pid) { return -ESRCH; } return g_pgid; } -weak int __syscall_getpid() { +weak pid_t __syscall_getpid() { return g_pid; } -weak int __syscall_getppid() { +weak pid_t __syscall_getppid() { return g_ppid; } @@ -109,20 +109,20 @@ weak int __syscall_linkat(int olddirfd, intptr_t oldpath, int newdirfd, intptr_t return -EMLINK; // no hardlinks for us } -weak int __syscall_getgroups32(int size, intptr_t list) { - if (size < 1) { +weak int __syscall_getgroups32(int count, intptr_t list) { + if (count < 1) { return -EINVAL; } ((gid_t*)list)[0] = 0; return 1; } -weak int __syscall_setsid() { +weak pid_t __syscall_setsid() { return 0; // no-op } -weak int __syscall_umask(int mask) { - int old = g_umask; +weak mode_t __syscall_umask(mode_t mask) { + mode_t old = g_umask; g_umask = mask; return old; } @@ -138,11 +138,11 @@ weak int __syscall_getrusage(int who, intptr_t usage) { return 0; } -weak int __syscall_getpriority(int which, int who) { +weak int __syscall_getpriority(int which, id_t who) { return 0; } -weak int __syscall_setpriority(int which, int who, int prio) { +weak int __syscall_setpriority(int which, id_t who, int prio) { return -EPERM; } @@ -150,19 +150,19 @@ weak int __syscall_setdomainname(intptr_t name, size_t size) { return -EPERM; } -weak int __syscall_getuid32(void) { +weak uid_t __syscall_getuid32(void) { return 0; } -weak int __syscall_getgid32(void) { +weak gid_t __syscall_getgid32(void) { return 0; } -weak int __syscall_geteuid32(void) { +weak uid_t __syscall_geteuid32(void) { return 0; } -weak int __syscall_getegid32(void) { +weak gid_t __syscall_getegid32(void) { return 0; } @@ -222,7 +222,7 @@ weak int __syscall_munlockall() { return 0; } -weak int __syscall_prlimit64(int pid, int resource, intptr_t new_limit, intptr_t old_limit) { +weak int __syscall_prlimit64(pid_t pid, int resource, intptr_t new_limit, intptr_t old_limit) { REPORT(prlimit64); struct rlimit *old = (struct rlimit *)old_limit; if (new_limit) { @@ -262,4 +262,4 @@ UNIMPLEMENTED(recvmmsg, (int sockfd, intptr_t msgvec, size_t vlen, int flags, .. UNIMPLEMENTED(sendmmsg, (int sockfd, intptr_t msgvec, size_t vlen, int flags, ...)) UNIMPLEMENTED(shutdown, (int sockfd, int how, int dummy, int dummy2, int dummy3, int dummy4)) UNIMPLEMENTED(socketpair, (int domain, int type, int protocol, intptr_t fds, int dummy, int dummy2)) -UNIMPLEMENTED(wait4,(int pid, intptr_t wstatus, int options, int rusage)) +UNIMPLEMENTED(wait4,(pid_t pid, intptr_t wstatus, int options, int rusage)) diff --git a/system/lib/libc/musl/arch/emscripten/syscall_arch.h b/system/lib/libc/musl/arch/emscripten/syscall_arch.h index 8076adad04e96..124f66dbac0cd 100644 --- a/system/lib/libc/musl/arch/emscripten/syscall_arch.h +++ b/system/lib/libc/musl/arch/emscripten/syscall_arch.h @@ -13,9 +13,9 @@ extern "C" { #endif int __syscall_chdir(intptr_t path); -int __syscall_mknod(intptr_t path, int mode, int dev); -int __syscall_chmod(intptr_t path, int mode); -int __syscall_getpid(void); +int __syscall_mknod(intptr_t path, mode_t mode, dev_t dev); +int __syscall_chmod(intptr_t path, mode_t mode); +pid_t __syscall_getpid(void); int __syscall_pause(void); int __syscall_access(intptr_t path, int amode); int __syscall_sync(void); @@ -24,26 +24,26 @@ int __syscall_dup(int fd); int __syscall_pipe(intptr_t fd); int __syscall_acct(intptr_t filename); int __syscall_ioctl(int fd, int request, ...); -int __syscall_setpgid(int pid, int gpid); -int __syscall_umask(int mask); -int __syscall_getppid(void); -int __syscall_getpgrp(void); -int __syscall_setsid(void); +int __syscall_setpgid(pid_t pid, pid_t gpid); +mode_t __syscall_umask(mode_t mask); +pid_t __syscall_getppid(void); +pid_t __syscall_getpgrp(void); +pid_t __syscall_setsid(void); int __syscall_getrusage(int who, intptr_t usage); int __syscall_munmap(intptr_t addr, size_t len); -int __syscall_fchmod(int fd, int mode); -int __syscall_getpriority(int which, int who); -int __syscall_setpriority(int which, int who, int prio); +int __syscall_fchmod(int fd, mode_t mode); +int __syscall_getpriority(int which, id_t who); +int __syscall_setpriority(int which, id_t who, int prio); int __syscall_socketcall(int call, intptr_t args); -int __syscall_wait4(int pid, intptr_t wstatus, int options, int rusage); +pid_t __syscall_wait4(pid_t pid, intptr_t wstatus, int options, int rusage); int __syscall_setdomainname(intptr_t name, size_t size); int __syscall_uname(intptr_t buf); int __syscall_mprotect(size_t addr, size_t len, int prot); -int __syscall_getpgid(int pid); +pid_t __syscall_getpgid(pid_t pid); int __syscall_fchdir(int fd); int __syscall__newselect(int nfds, intptr_t readfds, intptr_t writefds, intptr_t exceptfds, intptr_t timeout); int __syscall_msync(intptr_t addr, size_t len, int flags); -int __syscall_getsid(int pid); +pid_t __syscall_getsid(pid_t pid); int __syscall_fdatasync(int fd); int __syscall_mlock(intptr_t addr, size_t len); int __syscall_munlock(intptr_t addr, size_t len); @@ -58,20 +58,20 @@ int __syscall_ftruncate64(int fd, off_t length); int __syscall_stat64(intptr_t path, intptr_t buf); int __syscall_lstat64(intptr_t path, intptr_t buf); int __syscall_fstat64(int fd, intptr_t buf); -int __syscall_getuid32(void); -int __syscall_getgid32(void); -int __syscall_geteuid32(void); -int __syscall_getegid32(void); -int __syscall_setreuid32(int ruid, int euid); -int __syscall_setregid32(int rgid, int egid); -int __syscall_getgroups32(int size, intptr_t list); -int __syscall_fchown32(int fd, int owner, int group); -int __syscall_setresuid32(int ruid, int euid, int suid); +uid_t __syscall_getuid32(void); +gid_t __syscall_getgid32(void); +uid_t __syscall_geteuid32(void); +gid_t __syscall_getegid32(void); +int __syscall_setreuid32(uid_t ruid, uid_t euid); +int __syscall_setregid32(gid_t rgid, gid_t egid); +int __syscall_getgroups32(int count, intptr_t list); +int __syscall_fchown32(int fd, uid_t owner, gid_t group); +int __syscall_setresuid32(uid_t ruid, uid_t euid, uid_t suid); int __syscall_getresuid32(intptr_t ruid, intptr_t euid, intptr_t suid); -int __syscall_setresgid32(int rgid, int egid, int sgid); +int __syscall_setresgid32(gid_t rgid, gid_t egid, gid_t sgid); int __syscall_getresgid32(intptr_t rgid, intptr_t egid, intptr_t sgid); -int __syscall_setuid32(int uid); -int __syscall_setgid32(int uid); +int __syscall_setuid32(uid_t uid); +int __syscall_setgid32(gid_t gid); int __syscall_mincore(intptr_t addr, size_t length, intptr_t vec); int __syscall_madvise(intptr_t addr, size_t length, int advice); int __syscall_getdents64(int fd, intptr_t dirp, size_t count); @@ -80,16 +80,16 @@ int __syscall_statfs64(intptr_t path, size_t size, intptr_t buf); int __syscall_fstatfs64(int fd, size_t size, intptr_t buf); int __syscall_fadvise64(int fd, off_t offset, off_t length, int advice); int __syscall_openat(int dirfd, intptr_t path, int flags, ...); // mode is optional -int __syscall_mkdirat(int dirfd, intptr_t path, int mode); -int __syscall_mknodat(int dirfd, intptr_t path, int mode, int dev); -int __syscall_fchownat(int dirfd, intptr_t path, int owner, int group, int flags); +int __syscall_mkdirat(int dirfd, intptr_t path, mode_t mode); +int __syscall_mknodat(int dirfd, intptr_t path, mode_t mode, dev_t dev); +int __syscall_fchownat(int dirfd, intptr_t path, uid_t owner, gid_t group, int flags); int __syscall_newfstatat(int dirfd, intptr_t path, intptr_t buf, int flags); int __syscall_unlinkat(int dirfd, intptr_t path, int flags); int __syscall_renameat(int olddirfd, intptr_t oldpath, int newdirfd, intptr_t newpath); int __syscall_linkat(int olddirfd, intptr_t oldpath, int newdirfd, intptr_t newpath, int flags); int __syscall_symlinkat(intptr_t target, int newdirfd, intptr_t linkpath); int __syscall_readlinkat(int dirfd, intptr_t path, intptr_t buf, size_t bufsize); -int __syscall_fchmodat2(int dirfd, intptr_t path, int mode, int flags); +int __syscall_fchmodat2(int dirfd, intptr_t path, mode_t mode, int flags); int __syscall_faccessat(int dirfd, intptr_t path, int amode, int flags); int __syscall_pselect6(int nfds, intptr_t readfds, intptr_t writefds, intptr_t exceptfds, intptr_t timeout, intptr_t sigmaks); int __syscall_utimensat(int dirfd, intptr_t path, intptr_t times, int flags); @@ -97,7 +97,7 @@ int __syscall_fallocate(int fd, int mode, off_t offset, off_t len); int __syscall_dup3(int fd, int suggestfd, int flags); int __syscall_pipe2(intptr_t fds, int flags); int __syscall_recvmmsg(int sockfd, intptr_t msgvec, size_t vlen, int flags, ...); -int __syscall_prlimit64(int pid, int resource, intptr_t new_limit, intptr_t old_limit); +int __syscall_prlimit64(pid_t pid, int resource, intptr_t new_limit, intptr_t old_limit); int __syscall_sendmmsg(int sockfd, intptr_t msgvec, size_t vlen, int flags, ...); int __syscall_socket(int domain, int type, int protocol, int dummy1, int dummy2, int dummy3); int __syscall_socketpair(int domain, int type, int protocol, intptr_t fds, int dummy, int dummy2); diff --git a/system/lib/standalone/standalone.c b/system/lib/standalone/standalone.c index 3a910ba662d62..cb1c448524866 100644 --- a/system/lib/standalone/standalone.c +++ b/system/lib/standalone/standalone.c @@ -102,7 +102,7 @@ weak int __syscall_dup(int fd) { return -ENOSYS; } -weak int __syscall_mkdirat(int dirfd, intptr_t path, int mode) { +weak int __syscall_mkdirat(int dirfd, intptr_t path, mode_t mode) { return -ENOSYS; } diff --git a/system/lib/wasmfs/js_api.cpp b/system/lib/wasmfs/js_api.cpp index dba5fdb6dd93d..14c35af16f6d7 100644 --- a/system/lib/wasmfs/js_api.cpp +++ b/system/lib/wasmfs/js_api.cpp @@ -114,7 +114,7 @@ int _wasmfs_write_file(const char* pathname, char* data, size_t data_size) { return data_size; } -int _wasmfs_mkdir(const char* path, int mode) { +int _wasmfs_mkdir(const char* path, mode_t mode) { return __syscall_mkdirat(AT_FDCWD, (intptr_t)path, mode); } diff --git a/system/lib/wasmfs/syscalls.cpp b/system/lib/wasmfs/syscalls.cpp index 64932128d19ad..cbde8eb898daf 100644 --- a/system/lib/wasmfs/syscalls.cpp +++ b/system/lib/wasmfs/syscalls.cpp @@ -582,7 +582,7 @@ int __syscall_openat(int dirfd, intptr_t path, int flags, ...) { return doOpen(path::parseParent((char*)path, dirfd), flags, mode); } -int __syscall_mknodat(int dirfd, intptr_t path, int mode, int dev) { +int __syscall_mknodat(int dirfd, intptr_t path, mode_t mode, dev_t dev) { assert(dev == 0); // TODO: support special devices if (mode & S_IFDIR) { return -EINVAL; @@ -598,7 +598,7 @@ int __syscall_mknodat(int dirfd, intptr_t path, int mode, int dev) { } static int -doMkdir(path::ParsedParent parsed, int mode, backend_t backend = NullBackend) { +doMkdir(path::ParsedParent parsed, mode_t mode, backend_t backend = NullBackend) { if (auto err = parsed.getError()) { return err; } @@ -655,14 +655,14 @@ doMkdir(path::ParsedParent parsed, int mode, backend_t backend = NullBackend) { // This function is exposed to users and allows users to specify a particular // backend that a directory should be created within. -int wasmfs_create_directory(char* path, int mode, backend_t backend) { +int wasmfs_create_directory(char* path, mode_t mode, backend_t backend) { static_assert(std::is_same_v, "unexpected conversion from result of doMkdir to int"); return doMkdir(path::parseParent(path), mode, backend); } // TODO: Test this. -int __syscall_mkdirat(int dirfd, intptr_t path, int mode) { +int __syscall_mkdirat(int dirfd, intptr_t path, mode_t mode) { return doMkdir(path::parseParent((char*)path, dirfd), mode); } @@ -1165,7 +1165,7 @@ int __syscall_utimensat(int dirFD, intptr_t path_, intptr_t times_, int flags) { } // TODO: Test this with non-AT_FDCWD values. -int __syscall_fchmodat2(int dirfd, intptr_t path, int mode, int flags) { +int __syscall_fchmodat2(int dirfd, intptr_t path, mode_t mode, int flags) { if (flags & ~AT_SYMLINK_NOFOLLOW) { // TODO: Test this case. return -EINVAL; @@ -1181,11 +1181,11 @@ int __syscall_fchmodat2(int dirfd, intptr_t path, int mode, int flags) { return 0; } -int __syscall_chmod(intptr_t path, int mode) { +int __syscall_chmod(intptr_t path, mode_t mode) { return __syscall_fchmodat2(AT_FDCWD, path, mode, 0); } -int __syscall_fchmod(int fd, int mode) { +int __syscall_fchmod(int fd, mode_t mode) { auto openFile = wasmFS.getFileTable().locked().getEntry(fd); if (!openFile) { return -EBADF; @@ -1197,7 +1197,7 @@ int __syscall_fchmod(int fd, int mode) { } int __syscall_fchownat( - int dirfd, intptr_t path, int owner, int group, int flags) { + int dirfd, intptr_t path, uid_t owner, gid_t group, int flags) { // Only accept valid flags. if (flags & ~(AT_EMPTY_PATH | AT_SYMLINK_NOFOLLOW)) { // TODO: Test this case. @@ -1213,7 +1213,7 @@ int __syscall_fchownat( return 0; } -int __syscall_fchown32(int fd, int owner, int group) { +int __syscall_fchown32(int fd, uid_t owner, gid_t group) { return __syscall_fchownat(fd, (intptr_t) "", owner, group, AT_EMPTY_PATH); } From 49e81d10253ead9341001cb64accdeaa872580da Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Fri, 9 Jun 2023 15:00:02 +0200 Subject: [PATCH 4/6] Use correct types for syscalls (2) --- src/lib/libsigs.js | 28 +-- src/lib/libsyscall.js | 22 +- system/lib/libc/emscripten_internal.h | 4 +- system/lib/libc/emscripten_mmap.c | 10 +- system/lib/libc/emscripten_syscall_stubs.c | 61 ++--- .../libc/musl/arch/emscripten/syscall_arch.h | 144 ++++++------ system/lib/libc/musl/src/internal/syscall.h | 27 +-- system/lib/standalone/standalone.c | 20 +- system/lib/wasmfs/js_api.cpp | 39 ++-- system/lib/wasmfs/syscalls.cpp | 214 ++++++++---------- 10 files changed, 272 insertions(+), 297 deletions(-) diff --git a/src/lib/libsigs.js b/src/lib/libsigs.js index 4b19dec546636..314dbda467325 100644 --- a/src/lib/libsigs.js +++ b/src/lib/libsigs.js @@ -230,11 +230,11 @@ sigs = { __pthread_create_js__sig: 'ipppp', __resumeException__sig: 'vp', __syscall__newselect__sig: 'iipppp', - __syscall_accept4__sig: 'iippiii', - __syscall_bind__sig: 'iippiii', + __syscall_accept4__sig: 'iippip', + __syscall_bind__sig: 'iipip', __syscall_chdir__sig: 'ip', __syscall_chmod__sig: 'ipi', - __syscall_connect__sig: 'iippiii', + __syscall_connect__sig: 'iipip', __syscall_dup__sig: 'ii', __syscall_dup3__sig: 'iiii', __syscall_faccessat__sig: 'iipii', @@ -252,27 +252,27 @@ sigs = { __syscall_ftruncate64__sig: 'iij', __syscall_getcwd__sig: 'ipp', __syscall_getdents64__sig: 'iipp', - __syscall_getpeername__sig: 'iippiii', - __syscall_getsockname__sig: 'iippiii', - __syscall_getsockopt__sig: 'iiiippi', + __syscall_getpeername__sig: 'iippp', + __syscall_getsockname__sig: 'iippp', + __syscall_getsockopt__sig: 'iiiippp', __syscall_ioctl__sig: 'iiip', - __syscall_listen__sig: 'iiiiiii', + __syscall_listen__sig: 'iiip', __syscall_lstat64__sig: 'ipp', __syscall_mkdirat__sig: 'iipi', __syscall_mknodat__sig: 'iipii', __syscall_newfstatat__sig: 'iippi', __syscall_openat__sig: 'iipip', __syscall_pipe__sig: 'ip', - __syscall_poll__sig: 'ipii', + __syscall_poll__sig: 'ippi', __syscall_readlinkat__sig: 'iippp', - __syscall_recvfrom__sig: 'iippipp', - __syscall_recvmsg__sig: 'iipiiii', + __syscall_recvfrom__sig: 'pippipp', + __syscall_recvmsg__sig: 'pipip', __syscall_renameat__sig: 'iipip', __syscall_rmdir__sig: 'ip', - __syscall_sendmsg__sig: 'iipippi', - __syscall_sendto__sig: 'iippipp', - __syscall_shutdown__sig: 'iiiiiii', - __syscall_socket__sig: 'iiiiiii', + __syscall_sendmsg__sig: 'pipip', + __syscall_sendto__sig: 'pippipi', + __syscall_shutdown__sig: 'iiip', + __syscall_socket__sig: 'iiiip', __syscall_stat64__sig: 'ipp', __syscall_statfs64__sig: 'ippp', __syscall_symlinkat__sig: 'ipip', diff --git a/src/lib/libsyscall.js b/src/lib/libsyscall.js index 61af4001bd53f..6c6b8e537ffa3 100644 --- a/src/lib/libsyscall.js +++ b/src/lib/libsyscall.js @@ -345,7 +345,7 @@ var SyscallsLibrary = { return info; }, __syscall_socket__deps: ['$SOCKFS'], - __syscall_socket: (domain, type, protocol) => { + __syscall_socket: (domain, type, protocol, varargs) => { var sock = SOCKFS.createSocket(domain, type, protocol); #if ASSERTIONS assert(sock.stream.fd < 64); // XXX ? select() assumes socket fd values are in 0..63 @@ -353,7 +353,7 @@ var SyscallsLibrary = { return sock.stream.fd; }, __syscall_getsockname__deps: ['$getSocketFromFD', '$writeSockaddr', '$DNS'], - __syscall_getsockname: (fd, addr, addrlen, d1, d2, d3) => { + __syscall_getsockname: (fd, addr, addrlen, varargs) => { var sock = getSocketFromFD(fd); // TODO: sock.saddr should never be undefined, see TODO in websocket_sock_ops.getname var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || '0.0.0.0'), sock.sport, addrlen); @@ -363,7 +363,7 @@ var SyscallsLibrary = { return 0; }, __syscall_getpeername__deps: ['$getSocketFromFD', '$writeSockaddr', '$DNS'], - __syscall_getpeername: (fd, addr, addrlen, d1, d2, d3) => { + __syscall_getpeername: (fd, addr, addrlen, varargs) => { var sock = getSocketFromFD(fd); if (!sock.daddr) { return -{{{ cDefs.ENOTCONN }}}; // The socket is not connected. @@ -375,19 +375,19 @@ var SyscallsLibrary = { return 0; }, __syscall_connect__deps: ['$getSocketFromFD', '$getSocketAddress'], - __syscall_connect: (fd, addr, addrlen, d1, d2, d3) => { + __syscall_connect: (fd, addr, addrlen, varargs) => { var sock = getSocketFromFD(fd); var info = getSocketAddress(addr, addrlen); sock.sock_ops.connect(sock, info.addr, info.port); return 0; }, __syscall_shutdown__deps: ['$getSocketFromFD'], - __syscall_shutdown: (fd, how) => { + __syscall_shutdown: (fd, how, varargs) => { getSocketFromFD(fd); return -{{{ cDefs.ENOSYS }}}; // unsupported feature }, __syscall_accept4__deps: ['$getSocketFromFD', '$writeSockaddr', '$DNS'], - __syscall_accept4: (fd, addr, addrlen, flags, d1, d2) => { + __syscall_accept4: (fd, addr, addrlen, flags, varargs) => { var sock = getSocketFromFD(fd); var newsock = sock.sock_ops.accept(sock); if (addr) { @@ -399,14 +399,14 @@ var SyscallsLibrary = { return newsock.stream.fd; }, __syscall_bind__deps: ['$getSocketFromFD', '$getSocketAddress'], - __syscall_bind: (fd, addr, addrlen, d1, d2, d3) => { + __syscall_bind: (fd, addr, addrlen, varargs) => { var sock = getSocketFromFD(fd); var info = getSocketAddress(addr, addrlen); sock.sock_ops.bind(sock, info.addr, info.port); return 0; }, __syscall_listen__deps: ['$getSocketFromFD'], - __syscall_listen: (fd, backlog) => { + __syscall_listen: (fd, backlog, varargs) => { var sock = getSocketFromFD(fd); sock.sock_ops.listen(sock, backlog); return 0; @@ -437,7 +437,7 @@ var SyscallsLibrary = { return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port); }, __syscall_getsockopt__deps: ['$getSocketFromFD'], - __syscall_getsockopt: (fd, level, optname, optval, optlen, d1) => { + __syscall_getsockopt: (fd, level, optname, optval, optlen, varargs) => { var sock = getSocketFromFD(fd); // Minimal getsockopt aimed at resolving https://github.com/emscripten-core/emscripten/issues/2211 // so only supports SOL_SOCKET with SO_ERROR. @@ -452,7 +452,7 @@ var SyscallsLibrary = { return -{{{ cDefs.ENOPROTOOPT }}}; // The option is unknown at the level indicated. }, __syscall_sendmsg__deps: ['$getSocketFromFD', '$getSocketAddress'], - __syscall_sendmsg: (fd, message, flags, d1, d2, d3) => { + __syscall_sendmsg: (fd, message, flags, varargs) => { var sock = getSocketFromFD(fd); var iov = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iov, '*') }}}; var num = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iovlen, 'i32') }}}; @@ -483,7 +483,7 @@ var SyscallsLibrary = { return sock.sock_ops.sendmsg(sock, view, 0, total, addr, port); }, __syscall_recvmsg__deps: ['$getSocketFromFD', '$writeSockaddr', '$DNS'], - __syscall_recvmsg: (fd, message, flags, d1, d2, d3) => { + __syscall_recvmsg: (fd, message, flags, varargs) => { var sock = getSocketFromFD(fd); var iov = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iov, '*') }}}; var num = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iovlen, 'i32') }}}; diff --git a/system/lib/libc/emscripten_internal.h b/system/lib/libc/emscripten_internal.h index 6b6eb97693ab9..23f5455111fc3 100644 --- a/system/lib/libc/emscripten_internal.h +++ b/system/lib/libc/emscripten_internal.h @@ -76,9 +76,9 @@ int _mmap_js(size_t length, int* allocated, void** addr); int _munmap_js( - intptr_t addr, size_t length, int prot, int flags, int fd, off_t offset); + void *addr, size_t length, int prot, int flags, int fd, off_t offset); int _msync_js( - intptr_t addr, size_t length, int prot, int flags, int fd, off_t offset); + void *addr, size_t length, int prot, int flags, int fd, off_t offset); struct dso; diff --git a/system/lib/libc/emscripten_mmap.c b/system/lib/libc/emscripten_mmap.c index 7281d5b8baebe..448a1897bd04d 100644 --- a/system/lib/libc/emscripten_mmap.c +++ b/system/lib/libc/emscripten_mmap.c @@ -35,10 +35,10 @@ struct map { static volatile int lock[1]; static struct map* mappings; -static struct map* find_mapping(intptr_t addr, struct map** prev) { +static struct map* find_mapping(void *addr, struct map** prev) { struct map* map = mappings; while (map) { - if (map->addr == (void*)addr) { + if (map->addr == addr) { return map; } if (prev) { @@ -49,7 +49,7 @@ static struct map* find_mapping(intptr_t addr, struct map** prev) { return map; } -int __syscall_munmap(intptr_t addr, size_t length) { +int __syscall_munmap(void *addr, size_t length) { LOCK(lock); struct map* prev = NULL; struct map* map = find_mapping(addr, &prev); @@ -89,7 +89,7 @@ int __syscall_munmap(intptr_t addr, size_t length) { return 0; } -int __syscall_msync(intptr_t addr, size_t len, int flags) { +int __syscall_msync(void *addr, size_t len, int flags) { LOCK(lock); struct map* map = find_mapping(addr, NULL); UNLOCK(lock); @@ -102,7 +102,7 @@ int __syscall_msync(intptr_t addr, size_t len, int flags) { return _msync_js(addr, len, map->prot, map->flags, map->fd, map->offset); } -intptr_t __syscall_mmap2(intptr_t addr, size_t len, int prot, int flags, int fd, off_t offset) { +intptr_t __syscall_mmap2(void *addr, size_t len, int prot, int flags, int fd, off_t offset) { if (addr != 0) { // We don't currently support location hints for the address of the mapping return -EINVAL; diff --git a/system/lib/libc/emscripten_syscall_stubs.c b/system/lib/libc/emscripten_syscall_stubs.c index 429d7810fc809..71b24d73a6873 100644 --- a/system/lib/libc/emscripten_syscall_stubs.c +++ b/system/lib/libc/emscripten_syscall_stubs.c @@ -47,7 +47,7 @@ static mode_t g_umask = S_IWGRP | S_IWOTH; #define STRINGIFY(s) #s #define STR(s) STRINGIFY(s) -weak int __syscall_uname(intptr_t buf) { +weak int __syscall_uname(void *buf) { if (!buf) { return -EFAULT; } @@ -105,15 +105,15 @@ weak pid_t __syscall_getppid() { return g_ppid; } -weak int __syscall_linkat(int olddirfd, intptr_t oldpath, int newdirfd, intptr_t newpath, int flags) { +weak int __syscall_linkat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, int flags) { return -EMLINK; // no hardlinks for us } -weak int __syscall_getgroups32(int count, intptr_t list) { +weak int __syscall_getgroups32(int count, gid_t list[]) { if (count < 1) { return -EINVAL; } - ((gid_t*)list)[0] = 0; + list[0] = 0; return 1; } @@ -127,7 +127,7 @@ weak mode_t __syscall_umask(mode_t mask) { return old; } -weak int __syscall_getrusage(int who, intptr_t usage) { +weak int __syscall_getrusage(int who, void *usage) { REPORT(getrusage); struct rusage *u = (struct rusage *)usage; memset(u, 0, sizeof(*u)); @@ -146,7 +146,7 @@ weak int __syscall_setpriority(int which, id_t who, int prio) { return -EPERM; } -weak int __syscall_setdomainname(intptr_t name, size_t size) { +weak int __syscall_setdomainname(const char *name, size_t len) { return -EPERM; } @@ -166,18 +166,18 @@ weak gid_t __syscall_getegid32(void) { return 0; } -weak int __syscall_getresuid32(intptr_t ruid, intptr_t euid, intptr_t suid) { - *((uid_t *)ruid) = 0; - *((uid_t *)euid) = 0; - *((uid_t *)suid) = 0; +weak int __syscall_getresuid32(uid_t *ruid, uid_t *euid, uid_t *suid) { + *ruid = 0; + *euid = 0; + *suid = 0; return 0; } -weak int __syscall_getresgid32(intptr_t ruid, intptr_t euid, intptr_t suid) { +weak int __syscall_getresgid32(gid_t *rgid, gid_t *egid, gid_t *sgid) { REPORT(getresgid32); - *((uid_t *)ruid) = 0; - *((uid_t *)euid) = 0; - *((uid_t *)suid) = 0; + *rgid = 0; + *egid = 0; + *sgid = 0; return 0; } @@ -186,28 +186,28 @@ weak int __syscall_pause() { return -EINTR; // we can't pause } -weak int __syscall_madvise(intptr_t addr, size_t length, int advice) { +weak int __syscall_madvise(void *addr, size_t length, int advice) { REPORT(madvise); // advice is welcome, but ignored return 0; } -weak int __syscall_mlock(intptr_t addr, size_t len) { +weak int __syscall_mlock(const void *addr, size_t len) { REPORT(mlock); return 0; } -weak int __syscall_munlock(intptr_t addr, size_t len) { +weak int __syscall_munlock(const void *addr, size_t len) { REPORT(munlock); return 0; } -weak int __syscall_mprotect(size_t addr, size_t len, int prot) { +weak int __syscall_mprotect(size_t start, size_t len, int prot) { REPORT(mprotect); return 0; // let's not and say we did } -weak int __syscall_mremap(intptr_t old_addr, size_t old_size, size_t new_size, int flags, intptr_t new_addr) { +weak int __syscall_mremap(void *old_addr, size_t old_size, size_t new_size, int flags, void *new_addr) { REPORT(mremap); return -ENOMEM; // never succeed } @@ -222,7 +222,7 @@ weak int __syscall_munlockall() { return 0; } -weak int __syscall_prlimit64(pid_t pid, int resource, intptr_t new_limit, intptr_t old_limit) { +weak int __syscall_prlimit64(pid_t pid, int resource, const void *new_limit, void *old_limit) { REPORT(prlimit64); struct rlimit *old = (struct rlimit *)old_limit; if (new_limit) { @@ -249,17 +249,18 @@ weak int __syscall_prlimit64(pid_t pid, int resource, intptr_t new_limit, intptr return 0; } -weak int __syscall_setsockopt(int sockfd, int level, int optname, intptr_t optval, size_t optlen, int dummy) { +weak int __syscall_setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen, ...) { REPORT(setsockopt); return -ENOPROTOOPT; // The option is unknown at the level indicated. } -UNIMPLEMENTED(acct, (intptr_t filename)) -UNIMPLEMENTED(mincore, (intptr_t addr, size_t length, intptr_t vec)) -UNIMPLEMENTED(pipe2, (intptr_t fds, int flags)) -UNIMPLEMENTED(pselect6, (int nfds, intptr_t readfds, intptr_t writefds, intptr_t exceptfds, intptr_t timeout, intptr_t sigmaks)) -UNIMPLEMENTED(recvmmsg, (int sockfd, intptr_t msgvec, size_t vlen, int flags, ...)) -UNIMPLEMENTED(sendmmsg, (int sockfd, intptr_t msgvec, size_t vlen, int flags, ...)) -UNIMPLEMENTED(shutdown, (int sockfd, int how, int dummy, int dummy2, int dummy3, int dummy4)) -UNIMPLEMENTED(socketpair, (int domain, int type, int protocol, intptr_t fds, int dummy, int dummy2)) -UNIMPLEMENTED(wait4,(pid_t pid, intptr_t wstatus, int options, int rusage)) +UNIMPLEMENTED(acct, (const char *filename)) +UNIMPLEMENTED(mincore, (void *addr, size_t length, unsigned char *vec)) +UNIMPLEMENTED(pipe2, (int pipefd[2], int flags)) +UNIMPLEMENTED(pselect6, (int nfds, void *rfds, void *wfds, void *efds, void *ts, const void *mask)) +UNIMPLEMENTED(recvmmsg, (int sockfd, void *msgvec, unsigned int vlen, int flags, struct timespec *timeout)) +UNIMPLEMENTED(sendmmsg, (int sockfd, void *msgvec, unsigned int vlen, int flags)) +UNIMPLEMENTED(shutdown, (int sockfd, int how, ...)) +UNIMPLEMENTED(socketpair, (int domain, int type, int protocol, int fd[2], ...)) +UNIMPLEMENTED(socketcall, (int call, long args[6])) +UNIMPLEMENTED(wait4, (pid_t pid, int *wstatus, int options, void *rusage)) diff --git a/system/lib/libc/musl/arch/emscripten/syscall_arch.h b/system/lib/libc/musl/arch/emscripten/syscall_arch.h index 124f66dbac0cd..449b736695004 100644 --- a/system/lib/libc/musl/arch/emscripten/syscall_arch.h +++ b/system/lib/libc/musl/arch/emscripten/syscall_arch.h @@ -1,4 +1,10 @@ +#include +#include +#include +#include +#include #include + #include #include @@ -12,108 +18,108 @@ extern "C" { #endif -int __syscall_chdir(intptr_t path); -int __syscall_mknod(intptr_t path, mode_t mode, dev_t dev); -int __syscall_chmod(intptr_t path, mode_t mode); +int __syscall_chdir(const char *path); +int __syscall_mknod(const char *path, mode_t mode, dev_t dev); +int __syscall_chmod(const char *path, mode_t mode); pid_t __syscall_getpid(void); int __syscall_pause(void); -int __syscall_access(intptr_t path, int amode); +int __syscall_access(const char *path, int amode); int __syscall_sync(void); -int __syscall_rmdir(intptr_t path); +int __syscall_rmdir(const char *path); int __syscall_dup(int fd); -int __syscall_pipe(intptr_t fd); -int __syscall_acct(intptr_t filename); +int __syscall_pipe(int fd[2]); +int __syscall_acct(const char *filename); int __syscall_ioctl(int fd, int request, ...); int __syscall_setpgid(pid_t pid, pid_t gpid); mode_t __syscall_umask(mode_t mask); pid_t __syscall_getppid(void); pid_t __syscall_getpgrp(void); pid_t __syscall_setsid(void); -int __syscall_getrusage(int who, intptr_t usage); -int __syscall_munmap(intptr_t addr, size_t len); +int __syscall_getrusage(int who, void *usage); +int __syscall_munmap(void *addr, size_t len); int __syscall_fchmod(int fd, mode_t mode); int __syscall_getpriority(int which, id_t who); int __syscall_setpriority(int which, id_t who, int prio); -int __syscall_socketcall(int call, intptr_t args); -pid_t __syscall_wait4(pid_t pid, intptr_t wstatus, int options, int rusage); -int __syscall_setdomainname(intptr_t name, size_t size); -int __syscall_uname(intptr_t buf); -int __syscall_mprotect(size_t addr, size_t len, int prot); +int __syscall_socketcall(int call, long args[6]); +pid_t __syscall_wait4(pid_t pid, int *wstatus, int options, void *rusage); +int __syscall_setdomainname(const char *name, size_t len); +int __syscall_uname(void *buf); +int __syscall_mprotect(size_t start, size_t len, int prot); pid_t __syscall_getpgid(pid_t pid); int __syscall_fchdir(int fd); -int __syscall__newselect(int nfds, intptr_t readfds, intptr_t writefds, intptr_t exceptfds, intptr_t timeout); -int __syscall_msync(intptr_t addr, size_t len, int flags); +int __syscall__newselect(int nfds, void *readfds, void *writefds, void *exceptfds, void *timeout); +int __syscall_msync(void *addr, size_t len, int flags); pid_t __syscall_getsid(pid_t pid); int __syscall_fdatasync(int fd); -int __syscall_mlock(intptr_t addr, size_t len); -int __syscall_munlock(intptr_t addr, size_t len); +int __syscall_mlock(const void *addr, size_t len); +int __syscall_munlock(const void *addr, size_t len); int __syscall_mlockall(int flags); int __syscall_munlockall(void); -int __syscall_mremap(intptr_t old_addr, size_t old_size, size_t new_size, int flags, intptr_t new_addr); -int __syscall_poll(intptr_t fds, int nfds, int timeout); -int __syscall_getcwd(intptr_t buf, size_t size); -intptr_t __syscall_mmap2(intptr_t addr, size_t len, int prot, int flags, int fd, off_t offset); -int __syscall_truncate64(intptr_t path, off_t length); +int __syscall_mremap(void *old_addr, size_t old_size, size_t new_size, int flags, void *new_addr); +int __syscall_poll(struct pollfd *fds, nfds_t nfds, int timeout); +int __syscall_getcwd(char *buf, size_t size); +intptr_t __syscall_mmap2(void *addr, size_t len, int prot, int flags, int fd, off_t offset); +int __syscall_truncate64(const char *path, off_t length); int __syscall_ftruncate64(int fd, off_t length); -int __syscall_stat64(intptr_t path, intptr_t buf); -int __syscall_lstat64(intptr_t path, intptr_t buf); -int __syscall_fstat64(int fd, intptr_t buf); +int __syscall_stat64(const char *path, struct stat *buf); +int __syscall_lstat64(const char *path, struct stat *buf); +int __syscall_fstat64(int fd, struct stat *buf); uid_t __syscall_getuid32(void); gid_t __syscall_getgid32(void); uid_t __syscall_geteuid32(void); gid_t __syscall_getegid32(void); int __syscall_setreuid32(uid_t ruid, uid_t euid); int __syscall_setregid32(gid_t rgid, gid_t egid); -int __syscall_getgroups32(int count, intptr_t list); +int __syscall_getgroups32(int count, gid_t list[]); int __syscall_fchown32(int fd, uid_t owner, gid_t group); int __syscall_setresuid32(uid_t ruid, uid_t euid, uid_t suid); -int __syscall_getresuid32(intptr_t ruid, intptr_t euid, intptr_t suid); +int __syscall_getresuid32(uid_t *ruid, uid_t *euid, uid_t *suid); int __syscall_setresgid32(gid_t rgid, gid_t egid, gid_t sgid); -int __syscall_getresgid32(intptr_t rgid, intptr_t egid, intptr_t sgid); +int __syscall_getresgid32(gid_t *rgid, gid_t *egid, gid_t *sgid); int __syscall_setuid32(uid_t uid); int __syscall_setgid32(gid_t gid); -int __syscall_mincore(intptr_t addr, size_t length, intptr_t vec); -int __syscall_madvise(intptr_t addr, size_t length, int advice); -int __syscall_getdents64(int fd, intptr_t dirp, size_t count); +int __syscall_mincore(void *addr, size_t length, unsigned char *vec); +int __syscall_madvise(void *addr, size_t length, int advice); +int __syscall_getdents64(int fd, void *dirp, size_t count); int __syscall_fcntl64(int fd, int cmd, ...); -int __syscall_statfs64(intptr_t path, size_t size, intptr_t buf); -int __syscall_fstatfs64(int fd, size_t size, intptr_t buf); -int __syscall_fadvise64(int fd, off_t offset, off_t length, int advice); -int __syscall_openat(int dirfd, intptr_t path, int flags, ...); // mode is optional -int __syscall_mkdirat(int dirfd, intptr_t path, mode_t mode); -int __syscall_mknodat(int dirfd, intptr_t path, mode_t mode, dev_t dev); -int __syscall_fchownat(int dirfd, intptr_t path, uid_t owner, gid_t group, int flags); -int __syscall_newfstatat(int dirfd, intptr_t path, intptr_t buf, int flags); -int __syscall_unlinkat(int dirfd, intptr_t path, int flags); -int __syscall_renameat(int olddirfd, intptr_t oldpath, int newdirfd, intptr_t newpath); -int __syscall_linkat(int olddirfd, intptr_t oldpath, int newdirfd, intptr_t newpath, int flags); -int __syscall_symlinkat(intptr_t target, int newdirfd, intptr_t linkpath); -int __syscall_readlinkat(int dirfd, intptr_t path, intptr_t buf, size_t bufsize); -int __syscall_fchmodat2(int dirfd, intptr_t path, mode_t mode, int flags); -int __syscall_faccessat(int dirfd, intptr_t path, int amode, int flags); -int __syscall_pselect6(int nfds, intptr_t readfds, intptr_t writefds, intptr_t exceptfds, intptr_t timeout, intptr_t sigmaks); -int __syscall_utimensat(int dirfd, intptr_t path, intptr_t times, int flags); +int __syscall_statfs64(const char *path, size_t size, struct statfs *buf); +int __syscall_fstatfs64(int fd, size_t size, struct statfs *buf); +int __syscall_fadvise64(int fd, off_t offset, off_t len, int advice); +int __syscall_openat(int dirfd, const char *path, int flags, ...); // mode is optional +int __syscall_mkdirat(int dirfd, const char *path, mode_t mode); +int __syscall_mknodat(int dirfd, const char *path, mode_t mode, dev_t dev); +int __syscall_fchownat(int dirfd, const char *path, uid_t owner, gid_t group, int flags); +int __syscall_newfstatat(int dirfd, const char *path, struct stat *buf, int flags); +int __syscall_unlinkat(int dirfd, const char *path, int flags); +int __syscall_renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath); +int __syscall_linkat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, int flags); +int __syscall_symlinkat(const char *target, int newdirfd, const char *linkpath); +int __syscall_readlinkat(int dirfd, const char *path, char *buf, size_t bufsize); +int __syscall_fchmodat2(int dirfd, const char *path, mode_t mode, int flags); +int __syscall_faccessat(int dirfd, const char *path, int amode, int flags); +int __syscall_pselect6(int nfds, void *rfds, void *wfds, void *efds, void *ts, const void *mask); +int __syscall_utimensat(int dirfd, const char *path, const struct timespec times[2], int flags); int __syscall_fallocate(int fd, int mode, off_t offset, off_t len); -int __syscall_dup3(int fd, int suggestfd, int flags); -int __syscall_pipe2(intptr_t fds, int flags); -int __syscall_recvmmsg(int sockfd, intptr_t msgvec, size_t vlen, int flags, ...); -int __syscall_prlimit64(pid_t pid, int resource, intptr_t new_limit, intptr_t old_limit); -int __syscall_sendmmsg(int sockfd, intptr_t msgvec, size_t vlen, int flags, ...); -int __syscall_socket(int domain, int type, int protocol, int dummy1, int dummy2, int dummy3); -int __syscall_socketpair(int domain, int type, int protocol, intptr_t fds, int dummy, int dummy2); -int __syscall_bind(int sockfd, intptr_t addr, size_t alen, int dummy, int dummy2, int dummy3); -int __syscall_connect(int sockfd, intptr_t addr, size_t len, int dummy, int dummy2, int dummy3); -int __syscall_listen(int sockfd, int backlock, int dummy1, int dummy2, int dummy3, int dummy4); -int __syscall_accept4(int sockfd, intptr_t addr, intptr_t addrlen, int flags, int dummy1, int dummy2); -int __syscall_getsockopt(int sockfd, int level, int optname, intptr_t optval, intptr_t optlen, int dummy); -int __syscall_setsockopt(int sockfd, int level, int optname, intptr_t optval, size_t optlen, int dummy); -int __syscall_getsockname(int sockfd, intptr_t addr, intptr_t len, int dummy, int dummy2, int dummy3); -int __syscall_getpeername(int sockfd, intptr_t addr, intptr_t len, int dummy, int dummy2, int dummy3); -int __syscall_sendto(int sockfd, intptr_t msg, size_t len, int flags, intptr_t addr, size_t alen); -int __syscall_sendmsg(int sockfd, intptr_t msg , int flags, intptr_t addr, size_t alen, int dummy); -int __syscall_recvfrom(int sockfd, intptr_t msg, size_t len, int flags, intptr_t addr, intptr_t alen); -int __syscall_recvmsg(int sockfd, intptr_t msg, int flags, int dummy, int dummy2, int dummy3); -int __syscall_shutdown(int sockfd, int how, int dummy, int dummy2, int dummy3, int dummy4); +int __syscall_dup3(int oldfd, int newfd, int flags); +int __syscall_pipe2(int pipefd[2], int flags); +int __syscall_recvmmsg(int sockfd, void *msgvec, unsigned int vlen, int flags, struct timespec *timeout); +int __syscall_prlimit64(pid_t pid, int resource, const void *new_limit, void *old_limit); +int __syscall_sendmmsg(int sockfd, void *msgvec, unsigned int vlen, int flags); +int __syscall_socket(int domain, int type, int protocol, ...); +int __syscall_socketpair(int domain, int type, int protocol, int fd[2], ...); +int __syscall_bind(int sockfd, const void *addr, socklen_t len, ...); +int __syscall_connect(int sockfd, const void *addr, socklen_t len, ...); +int __syscall_listen(int sockfd, int backlog, ...); +int __syscall_accept4(int sockfd, void *addr, socklen_t *len, int flags, ...); +int __syscall_getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen, ...); +int __syscall_setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen, ...); +int __syscall_getsockname(int sockfd, void *addr, socklen_t *len, ...); +int __syscall_getpeername(int sockfd, void *addr, socklen_t *len, ...); +ssize_t __syscall_sendto(int sockfd, const void *buf, size_t len, int flags, const void *addr, socklen_t alen); +ssize_t __syscall_sendmsg(int sockfd, const void *msg, int flags, ...); +ssize_t __syscall_recvfrom(int sockfd, void *buf, size_t len, int flags, void *addr, socklen_t *alen); +ssize_t __syscall_recvmsg(int sockfd, void *msg, int flags, ...); +int __syscall_shutdown(int sockfd, int how, ...); #ifdef __cplusplus } diff --git a/system/lib/libc/musl/src/internal/syscall.h b/system/lib/libc/musl/src/internal/syscall.h index 1a6c4313852d7..5385b71ecb191 100644 --- a/system/lib/libc/musl/src/internal/syscall.h +++ b/system/lib/libc/musl/src/internal/syscall.h @@ -19,16 +19,9 @@ #endif #ifndef __scc -#ifdef __EMSCRIPTEN__ -// With emscripten we allow the passing of longer-than-word-sized -// argument (such as off_t on wasm32) and let binaryen handle splitting -// them into a pair of i32 arguments. -#define __scc(X) ((long long) (X)) -#else #define __scc(X) ((long) (X)) #endif typedef long syscall_arg_t; -#endif #ifdef __cplusplus extern "C" { @@ -50,12 +43,12 @@ hidden long __syscall_ret(unsigned long), #else // __EMSCRIPTEN__ #define __syscall_emscripten(n, ...) n(__VA_ARGS__) #define __syscall_emscripten0(n) __syscall_emscripten(n) -#define __syscall_emscripten1(n,a) __syscall_emscripten(n,__scc(a)) -#define __syscall_emscripten2(n,a,b) __syscall_emscripten(n,__scc(a),__scc(b)) -#define __syscall_emscripten3(n,a,b,c) __syscall_emscripten(n,__scc(a),__scc(b),__scc(c)) -#define __syscall_emscripten4(n,a,b,c,d) __syscall_emscripten(n,__scc(a),__scc(b),__scc(c),__scc(d)) -#define __syscall_emscripten5(n,a,b,c,d,e) __syscall_emscripten(n,__scc(a),__scc(b),__scc(c),__scc(d),__scc(e)) -#define __syscall_emscripten6(n,a,b,c,d,e,f) __syscall_emscripten(n,__scc(a),__scc(b),__scc(c),__scc(d),__scc(e),__scc(f)) +#define __syscall_emscripten1(n,a) __syscall_emscripten(n,a) +#define __syscall_emscripten2(n,a,b) __syscall_emscripten(n,a,b) +#define __syscall_emscripten3(n,a,b,c) __syscall_emscripten(n,a,b,c) +#define __syscall_emscripten4(n,a,b,c,d) __syscall_emscripten(n,a,b,c,d) +#define __syscall_emscripten5(n,a,b,c,d,e) __syscall_emscripten(n,a,b,c,d,e) +#define __syscall_emscripten6(n,a,b,c,d,e,f) __syscall_emscripten(n,a,b,c,d,e,f) #endif // __EMSCRIPTEN__ #define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n @@ -421,10 +414,10 @@ hidden long __syscall_ret(unsigned long), #define __sys_open_cp3(x,pn,fl,mo) __syscall_cp4(SYS_openat, AT_FDCWD, pn, (fl)|O_LARGEFILE, mo) #endif #else // __EMSCRIPTEN__ -#define __sys_open2(x,pn,fl) __syscall_openat(__scc(AT_FDCWD), __scc(pn), __scc((fl)|O_LARGEFILE)) -#define __sys_open3(x,pn,fl,mo) __syscall_openat(__scc(AT_FDCWD), __scc(pn), __scc((fl)|O_LARGEFILE), __scc(mo)) -#define __sys_open_cp2(x,pn,fl) __syscall_openat(__scc(AT_FDCWD), __scc(pn), __scc((fl)|O_LARGEFILE)) -#define __sys_open_cp3(x,pn,fl,mo) __syscall_openat(__scc(AT_FDCWD), __scc(pn), __scc((fl)|O_LARGEFILE), __scc(mo)) +#define __sys_open2(x,pn,fl) __syscall_openat(AT_FDCWD, pn, (fl)|O_LARGEFILE) +#define __sys_open3(x,pn,fl,mo) __syscall_openat(AT_FDCWD, pn, (fl)|O_LARGEFILE, mo) +#define __sys_open_cp2(x,pn,fl) __syscall_openat(AT_FDCWD, pn, (fl)|O_LARGEFILE) +#define __sys_open_cp3(x,pn,fl,mo) __syscall_openat(AT_FDCWD, pn, (fl)|O_LARGEFILE, mo) #endif #define __sys_open(...) __SYSCALL_DISP(__sys_open,,__VA_ARGS__) diff --git a/system/lib/standalone/standalone.c b/system/lib/standalone/standalone.c index cb1c448524866..7923b4ef0f1c7 100644 --- a/system/lib/standalone/standalone.c +++ b/system/lib/standalone/standalone.c @@ -61,7 +61,7 @@ weak int _mmap_js(size_t length, } weak int _munmap_js( - intptr_t addr, size_t length, int prot, int flags, int fd, off_t offset) { + void *addr, size_t length, int prot, int flags, int fd, off_t offset) { return -ENOSYS; } @@ -69,14 +69,14 @@ weak int _munmap_js( // corner case error checking; everything else is not permitted. // TODO: full file support for WASI, or an option for it // open() -weak int __syscall_openat(int dirfd, intptr_t path, int flags, ...) { - if (!strcmp((const char*)path, "/dev/stdin")) { +weak int __syscall_openat(int dirfd, const char *path, int flags, ...) { + if (!strcmp(path, "/dev/stdin")) { return STDIN_FILENO; } - if (!strcmp((const char*)path, "/dev/stdout")) { + if (!strcmp(path, "/dev/stdout")) { return STDOUT_FILENO; } - if (!strcmp((const char*)path, "/dev/stderr")) { + if (!strcmp(path, "/dev/stderr")) { return STDERR_FILENO; } return -EPERM; @@ -90,11 +90,11 @@ weak int __syscall_fcntl64(int fd, int cmd, ...) { return -ENOSYS; } -weak int __syscall_fstat64(int fd, intptr_t buf) { +weak int __syscall_fstat64(int fd, struct stat *buf) { return -ENOSYS; } -weak int __syscall_stat64(intptr_t path, intptr_t buf) { +weak int __syscall_stat64(const char *path, struct stat *buf) { return -ENOSYS; } @@ -102,15 +102,15 @@ weak int __syscall_dup(int fd) { return -ENOSYS; } -weak int __syscall_mkdirat(int dirfd, intptr_t path, mode_t mode) { +weak int __syscall_mkdirat(int dirfd, const char *path, mode_t mode) { return -ENOSYS; } -weak int __syscall_newfstatat(int dirfd, intptr_t path, intptr_t buf, int flags) { +weak int __syscall_newfstatat(int dirfd, const char *path, struct stat *buf, int flags) { return -ENOSYS; } -weak int __syscall_lstat64(intptr_t path, intptr_t buf) { +weak int __syscall_lstat64(const char *path, struct stat *buf) { return -ENOSYS; } diff --git a/system/lib/wasmfs/js_api.cpp b/system/lib/wasmfs/js_api.cpp index 14c35af16f6d7..c5dca36a98006 100644 --- a/system/lib/wasmfs/js_api.cpp +++ b/system/lib/wasmfs/js_api.cpp @@ -115,35 +115,34 @@ int _wasmfs_write_file(const char* pathname, char* data, size_t data_size) { } int _wasmfs_mkdir(const char* path, mode_t mode) { - return __syscall_mkdirat(AT_FDCWD, (intptr_t)path, mode); + return __syscall_mkdirat(AT_FDCWD, path, mode); } int _wasmfs_rmdir(const char* path) { - return __syscall_unlinkat(AT_FDCWD, (intptr_t)path, AT_REMOVEDIR); + return __syscall_unlinkat(AT_FDCWD, path, AT_REMOVEDIR); } int _wasmfs_open(const char* path, int flags, mode_t mode) { - return __syscall_openat(AT_FDCWD, (intptr_t)path, flags, mode); + return __syscall_openat(AT_FDCWD, path, flags, mode); } int _wasmfs_mknod(const char* path, mode_t mode, dev_t dev) { - return __syscall_mknodat(AT_FDCWD, (intptr_t)path, mode, dev); + return __syscall_mknodat(AT_FDCWD, path, mode, dev); } int _wasmfs_unlink(const char* path) { - return __syscall_unlinkat(AT_FDCWD, (intptr_t)path, 0); + return __syscall_unlinkat(AT_FDCWD, path, 0); } -int _wasmfs_chdir(const char* path) { return __syscall_chdir((intptr_t)path); } +int _wasmfs_chdir(const char* path) { return __syscall_chdir(path); } int _wasmfs_symlink(const char* old_path, const char* new_path) { - return __syscall_symlinkat((intptr_t)old_path, AT_FDCWD, (intptr_t)new_path); + return __syscall_symlinkat(old_path, AT_FDCWD, new_path); } int _wasmfs_readlink(const char* path, char** out_ptr) { static thread_local char* readBuf = (char*)malloc(PATH_MAX); - int bytes = - __syscall_readlinkat(AT_FDCWD, (intptr_t)path, (intptr_t)readBuf, PATH_MAX); + int bytes = __syscall_readlinkat(AT_FDCWD, path, readBuf, PATH_MAX); if (bytes < 0) { return bytes; } @@ -179,14 +178,13 @@ int _wasmfs_pwrite(int fd, void* buf, size_t count, off_t offset) { } int _wasmfs_chmod(const char* path, mode_t mode) { - return __syscall_chmod((intptr_t)path, mode); + return __syscall_chmod(path, mode); } int _wasmfs_fchmod(int fd, mode_t mode) { return __syscall_fchmod(fd, mode); } int _wasmfs_lchmod(const char* path, mode_t mode) { - return __syscall_fchmodat2( - AT_FDCWD, (intptr_t)path, mode, AT_SYMLINK_NOFOLLOW); + return __syscall_fchmodat2(AT_FDCWD, path, mode, AT_SYMLINK_NOFOLLOW); } int _wasmfs_llseek(int fd, off_t offset, int whence) { @@ -199,8 +197,7 @@ int _wasmfs_llseek(int fd, off_t offset, int whence) { } int _wasmfs_rename(const char* oldpath, const char* newpath) { - return __syscall_renameat( - AT_FDCWD, (intptr_t)oldpath, AT_FDCWD, (intptr_t)newpath); + return __syscall_renameat(AT_FDCWD, oldpath, AT_FDCWD, newpath); } int _wasmfs_read(int fd, void* buf, size_t count) { @@ -230,7 +227,7 @@ int _wasmfs_pread(int fd, void* buf, size_t count, off_t offset) { } int _wasmfs_truncate(const char* path, off_t length) { - return __syscall_truncate64((intptr_t)path, length); + return __syscall_truncate64(path, length); } int _wasmfs_ftruncate(int fd, off_t length) { @@ -244,11 +241,11 @@ void* _wasmfs_mmap(size_t length, int prot, int flags, int fd, off_t offset) { } int _wasmfs_msync(void* addr, size_t length, int flags) { - return __syscall_msync((intptr_t)addr, length, flags); + return __syscall_msync(addr, length, flags); } int _wasmfs_munmap(void* addr, size_t length) { - return __syscall_munmap((intptr_t)addr, length); + return __syscall_munmap(addr, length); } int _wasmfs_utime(const char* path, double atime_ms, double mtime_ms) { @@ -258,22 +255,22 @@ int _wasmfs_utime(const char* path, double atime_ms, double mtime_ms) { times[1].tv_sec = (long)mtime_ms / 1000; times[1].tv_nsec = ((long)mtime_ms % 1000) * 1000000; - return __syscall_utimensat(AT_FDCWD, (intptr_t)path, (intptr_t)times, 0); + return __syscall_utimensat(AT_FDCWD, path, times, 0); } int _wasmfs_stat(const char* path, struct stat* statBuf) { - return __syscall_stat64((intptr_t)path, (intptr_t)statBuf); + return __syscall_stat64(path, statBuf); } int _wasmfs_lstat(const char* path, struct stat* statBuf) { - return __syscall_lstat64((intptr_t)path, (intptr_t)statBuf); + return __syscall_lstat64(path, statBuf); } // The legacy JS API requires a mountpoint to already exist, so WasmFS will // attempt to remove the target directory if it exists before replacing it with // a mounted directory. int _wasmfs_mount(const char* path, ::backend_t created_backend) { - int err = __syscall_rmdir((intptr_t)path); + int err = __syscall_rmdir(path); // The legacy JS API mount requires the directory to already exist, but we // will also allow it to be missing. diff --git a/system/lib/wasmfs/syscalls.cpp b/system/lib/wasmfs/syscalls.cpp index cbde8eb898daf..4b944ec4f3e12 100644 --- a/system/lib/wasmfs/syscalls.cpp +++ b/system/lib/wasmfs/syscalls.cpp @@ -352,13 +352,13 @@ static timespec ms_to_timespec(double ms) { return ts; } -int __syscall_newfstatat(int dirfd, intptr_t path, intptr_t buf, int flags) { +int __syscall_newfstatat(int dirfd, const char* path, struct stat* buf, int flags) { // Only accept valid flags. if (flags & ~(AT_EMPTY_PATH | AT_NO_AUTOMOUNT | AT_SYMLINK_NOFOLLOW)) { // TODO: Test this case. return -EINVAL; } - auto parsed = path::getFileAt(dirfd, (char*)path, flags); + auto parsed = path::getFileAt(dirfd, path, flags); if (auto err = parsed.getError()) { return err; } @@ -366,48 +366,47 @@ int __syscall_newfstatat(int dirfd, intptr_t path, intptr_t buf, int flags) { // Extract the information from the file. auto lockedFile = file->locked(); - auto buffer = (struct stat*)buf; off_t size = lockedFile.getSize(); if (size < 0) { return size; } - buffer->st_size = size; + buf->st_size = size; // ATTN: hard-coded constant values are copied from the existing JS file // system. Specific values were chosen to match existing library_fs.js // values. // ID of device containing file: Hardcode 1 for now, no meaning at the // moment for Emscripten. - buffer->st_dev = 1; - buffer->st_mode = lockedFile.getMode(); - buffer->st_ino = file->getIno(); + buf->st_dev = 1; + buf->st_mode = lockedFile.getMode(); + buf->st_ino = file->getIno(); // The number of hard links is 1 since they are unsupported. - buffer->st_nlink = 1; - buffer->st_uid = 0; - buffer->st_gid = 0; + buf->st_nlink = 1; + buf->st_uid = 0; + buf->st_gid = 0; // Device ID (if special file) No meaning right now for Emscripten. - buffer->st_rdev = 0; + buf->st_rdev = 0; // The syscall docs state this is hardcoded to # of 512 byte blocks. - buffer->st_blocks = (buffer->st_size + 511) / 512; + buf->st_blocks = (buf->st_size + 511) / 512; // Specifies the preferred blocksize for efficient disk I/O. - buffer->st_blksize = 4096; - buffer->st_atim = ms_to_timespec(lockedFile.getATime()); - buffer->st_mtim = ms_to_timespec(lockedFile.getMTime()); - buffer->st_ctim = ms_to_timespec(lockedFile.getCTime()); + buf->st_blksize = 4096; + buf->st_atim = ms_to_timespec(lockedFile.getATime()); + buf->st_mtim = ms_to_timespec(lockedFile.getMTime()); + buf->st_ctim = ms_to_timespec(lockedFile.getCTime()); return __WASI_ERRNO_SUCCESS; } -int __syscall_stat64(intptr_t path, intptr_t buf) { +int __syscall_stat64(const char* path, struct stat* buf) { return __syscall_newfstatat(AT_FDCWD, path, buf, 0); } -int __syscall_lstat64(intptr_t path, intptr_t buf) { +int __syscall_lstat64(const char* path, struct stat* buf) { return __syscall_newfstatat(AT_FDCWD, path, buf, AT_SYMLINK_NOFOLLOW); } -int __syscall_fstat64(int fd, intptr_t buf) { - return __syscall_newfstatat(fd, (intptr_t) "", buf, AT_EMPTY_PATH); +int __syscall_fstat64(int fd, struct stat* buf) { + return __syscall_newfstatat(fd, "", buf, AT_EMPTY_PATH); } // When calling doOpen(), we may request an FD be returned, or we may not need @@ -564,25 +563,24 @@ static __wasi_fd_t doOpen(path::ParsedParent parsed, // This function is exposed to users and allows users to create a file in a // specific backend. An fd to an open file is returned. -int wasmfs_create_file(char* pathname, mode_t mode, backend_t backend) { +int wasmfs_create_file(const char* pathname, mode_t mode, backend_t backend) { static_assert(std::is_same_v, "unexpected conversion from result of doOpen to int"); - return doOpen( - path::parseParent((char*)pathname), O_CREAT | O_EXCL, mode, backend); + return doOpen(path::parseParent(pathname), O_CREAT | O_EXCL, mode, backend); } // TODO: Test this with non-AT_FDCWD values. -int __syscall_openat(int dirfd, intptr_t path, int flags, ...) { +int __syscall_openat(int dirfd, const char* path, int flags, ...) { mode_t mode = 0; va_list v1; va_start(v1, flags); mode = va_arg(v1, int); va_end(v1); - return doOpen(path::parseParent((char*)path, dirfd), flags, mode); + return doOpen(path::parseParent(path, dirfd), flags, mode); } -int __syscall_mknodat(int dirfd, intptr_t path, mode_t mode, dev_t dev) { +int __syscall_mknodat(int dirfd, const char* path, mode_t mode, dev_t dev) { assert(dev == 0); // TODO: support special devices if (mode & S_IFDIR) { return -EINVAL; @@ -590,7 +588,7 @@ int __syscall_mknodat(int dirfd, intptr_t path, mode_t mode, dev_t dev) { if (mode & S_IFIFO) { return -EPERM; } - return doOpen(path::parseParent((char*)path, dirfd), + return doOpen(path::parseParent(path, dirfd), O_CREAT | O_EXCL, mode, NullBackend, @@ -662,8 +660,8 @@ int wasmfs_create_directory(char* path, mode_t mode, backend_t backend) { } // TODO: Test this. -int __syscall_mkdirat(int dirfd, intptr_t path, mode_t mode) { - return doMkdir(path::parseParent((char*)path, dirfd), mode); +int __syscall_mkdirat(int dirfd, const char* path, mode_t mode) { + return doMkdir(path::parseParent(path, dirfd), mode); } __wasi_errno_t __wasi_fd_seek(__wasi_fd_t fd, @@ -720,8 +718,8 @@ static int doChdir(std::shared_ptr& file) { return 0; } -int __syscall_chdir(intptr_t path) { - auto parsed = path::parseFile((char*)path); +int __syscall_chdir(const char* path) { + auto parsed = path::parseFile(path); if (auto err = parsed.getError()) { return err; } @@ -736,7 +734,7 @@ int __syscall_fchdir(int fd) { return doChdir(openFile->locked().getFile()); } -int __syscall_getcwd(intptr_t buf, size_t size) { +int __syscall_getcwd(char* buf, size_t size) { // Check if buf points to a bad address. if (!buf && size > 0) { return -EFAULT; @@ -778,7 +776,7 @@ int __syscall_getcwd(intptr_t buf, size_t size) { } // Return value is a null-terminated c string. - strcpy((char*)buf, result.c_str()); + strcpy(buf, result.c_str()); return len; } @@ -802,7 +800,7 @@ __wasi_errno_t __wasi_fd_fdstat_get(__wasi_fd_t fd, __wasi_fdstat_t* stat) { } // TODO: Test this with non-AT_FDCWD values. -int __syscall_unlinkat(int dirfd, intptr_t path, int flags) { +int __syscall_unlinkat(int dirfd, const char* path, int flags) { if (flags & ~AT_REMOVEDIR) { // TODO: Test this case. return -EINVAL; @@ -811,7 +809,7 @@ int __syscall_unlinkat(int dirfd, intptr_t path, int flags) { // this case from the case of `parseParent` returning (root, '.') when parsing // "/", so we need to find the invalid "/." manually. if (flags == AT_REMOVEDIR) { - std::string_view p((char*)path); + std::string_view p(path); // Ignore trailing '/'. while (!p.empty() && p.back() == '/') { p.remove_suffix(1); @@ -820,7 +818,7 @@ int __syscall_unlinkat(int dirfd, intptr_t path, int flags) { return -EINVAL; } } - auto parsed = path::parseParent((char*)path, dirfd); + auto parsed = path::parseParent(path, dirfd); if (auto err = parsed.getError()) { return err; } @@ -861,7 +859,7 @@ int __syscall_unlinkat(int dirfd, intptr_t path, int flags) { return lockedParent.removeChild(childName); } -int __syscall_rmdir(intptr_t path) { +int __syscall_rmdir(const char* path) { return __syscall_unlinkat(AT_FDCWD, path, AT_REMOVEDIR); } @@ -898,7 +896,7 @@ int wasmfs_unmount(const char* path) { return lockedParent.removeChild(childName); } -int __syscall_getdents64(int fd, intptr_t dirp, size_t count) { +int __syscall_getdents64(int fd, void* dirp, size_t count) { dirent* result = (dirent*)dirp; // Check if the result buffer is too small. @@ -967,9 +965,9 @@ int __syscall_getdents64(int fd, intptr_t dirp, size_t count) { // TODO: Test this with non-AT_FDCWD values. int __syscall_renameat(int olddirfd, - intptr_t oldpath, + const char* oldpath, int newdirfd, - intptr_t newpath) { + const char* newpath) { // Rename is the only syscall that needs to (or is allowed to) acquire locks // on two directories at once. It requires locks on both the old and new // parent directories to ensure that the moved file can be atomically removed @@ -982,7 +980,7 @@ int __syscall_renameat(int olddirfd, std::lock_guard renameLock(renameMutex); // Get the old directory. - auto parsedOld = path::parseParent((char*)oldpath, olddirfd); + auto parsedOld = path::parseParent(oldpath, olddirfd); if (auto err = parsedOld.getError()) { return err; } @@ -990,7 +988,7 @@ int __syscall_renameat(int olddirfd, std::string oldFileName(oldFileNameView); // Get the new directory. - auto parsedNew = path::parseParent((char*)newpath, newdirfd); + auto parsedNew = path::parseParent(newpath, newdirfd); if (auto err = parsedNew.getError()) { return err; } @@ -1071,8 +1069,8 @@ int __syscall_renameat(int olddirfd, } // TODO: Test this with non-AT_FDCWD values. -int __syscall_symlinkat(intptr_t target, int newdirfd, intptr_t linkpath) { - auto parsed = path::parseParent((char*)linkpath, newdirfd); +int __syscall_symlinkat(const char* target, int newdirfd, const char* linkpath) { + auto parsed = path::parseParent(linkpath, newdirfd); if (auto err = parsed.getError()) { return err; } @@ -1085,7 +1083,7 @@ int __syscall_symlinkat(intptr_t target, int newdirfd, intptr_t linkpath) { if (lockedParent.getChild(childName)) { return -EEXIST; } - if (!lockedParent.insertSymlink(childName, (char*)target)) { + if (!lockedParent.insertSymlink(childName, target)) { return -EPERM; } return 0; @@ -1093,11 +1091,11 @@ int __syscall_symlinkat(intptr_t target, int newdirfd, intptr_t linkpath) { // TODO: Test this with non-AT_FDCWD values. int __syscall_readlinkat(int dirfd, - intptr_t path, - intptr_t buf, + const char* path, + char* buf, size_t bufsize) { // TODO: Handle empty paths. - auto parsed = path::parseFile((char*)path, dirfd, path::NoFollowLinks); + auto parsed = path::parseFile(path, dirfd, path::NoFollowLinks); if (auto err = parsed.getError()) { return err; } @@ -1107,7 +1105,7 @@ int __syscall_readlinkat(int dirfd, } const auto& target = link->getTarget(); auto bytes = std::min((size_t)bufsize, target.size()); - memcpy((char*)buf, target.c_str(), bytes); + memcpy(buf, target.c_str(), bytes); return bytes; } @@ -1122,9 +1120,10 @@ static double timespec_to_ms(timespec ts) { } // TODO: Test this with non-AT_FDCWD values. -int __syscall_utimensat(int dirFD, intptr_t path_, intptr_t times_, int flags) { - const char* path = (const char*)path_; - const struct timespec* times = (const struct timespec*)times_; +int __syscall_utimensat(int dirfd, + const char* path, + const struct timespec times[2], + int flags) { if (flags & ~AT_SYMLINK_NOFOLLOW) { // TODO: Test this case. return -EINVAL; @@ -1137,7 +1136,7 @@ int __syscall_utimensat(int dirFD, intptr_t path_, intptr_t times_, int flags) { // https://man7.org/linux/man-pages/man2/utimensat.2.html // // TODO: Handle AT_SYMLINK_NOFOLLOW once we traverse symlinks correctly. - auto parsed = path::getFileAt(dirFD, path, flags | AT_EMPTY_PATH); + auto parsed = path::getFileAt(dirfd, path, flags | AT_EMPTY_PATH); if (auto err = parsed.getError()) { return err; } @@ -1165,12 +1164,12 @@ int __syscall_utimensat(int dirFD, intptr_t path_, intptr_t times_, int flags) { } // TODO: Test this with non-AT_FDCWD values. -int __syscall_fchmodat2(int dirfd, intptr_t path, mode_t mode, int flags) { +int __syscall_fchmodat2(int dirfd, const char* path, mode_t mode, int flags) { if (flags & ~AT_SYMLINK_NOFOLLOW) { // TODO: Test this case. return -EINVAL; } - auto parsed = path::getFileAt(dirfd, (char*)path, flags); + auto parsed = path::getFileAt(dirfd, path, flags); if (auto err = parsed.getError()) { return err; } @@ -1181,7 +1180,7 @@ int __syscall_fchmodat2(int dirfd, intptr_t path, mode_t mode, int flags) { return 0; } -int __syscall_chmod(intptr_t path, mode_t mode) { +int __syscall_chmod(const char* path, mode_t mode) { return __syscall_fchmodat2(AT_FDCWD, path, mode, 0); } @@ -1197,13 +1196,13 @@ int __syscall_fchmod(int fd, mode_t mode) { } int __syscall_fchownat( - int dirfd, intptr_t path, uid_t owner, gid_t group, int flags) { + int dirfd, const char* path, uid_t owner, gid_t group, int flags) { // Only accept valid flags. if (flags & ~(AT_EMPTY_PATH | AT_SYMLINK_NOFOLLOW)) { // TODO: Test this case. return -EINVAL; } - auto parsed = path::getFileAt(dirfd, (char*)path, flags); + auto parsed = path::getFileAt(dirfd, path, flags); if (auto err = parsed.getError()) { return err; } @@ -1214,11 +1213,11 @@ int __syscall_fchownat( } int __syscall_fchown32(int fd, uid_t owner, gid_t group) { - return __syscall_fchownat(fd, (intptr_t) "", owner, group, AT_EMPTY_PATH); + return __syscall_fchownat(fd, "", owner, group, AT_EMPTY_PATH); } // TODO: Test this with non-AT_FDCWD values. -int __syscall_faccessat(int dirfd, intptr_t path, int amode, int flags) { +int __syscall_faccessat(int dirfd, const char* path, int amode, int flags) { // The input must be F_OK (check for existence) or a combination of [RWX]_OK // flags. if (amode != F_OK && (amode & ~(R_OK | W_OK | X_OK))) { @@ -1230,7 +1229,7 @@ int __syscall_faccessat(int dirfd, intptr_t path, int amode, int flags) { } // TODO: Handle AT_SYMLINK_NOFOLLOW once we traverse symlinks correctly. - auto parsed = path::parseFile((char*)path, dirfd); + auto parsed = path::parseFile(path, dirfd); if (auto err = parsed.getError()) { return err; } @@ -1272,12 +1271,12 @@ static int doTruncate(std::shared_ptr& file, off_t size) { return ret; } -int __syscall_truncate64(intptr_t path, off_t size) { - auto parsed = path::parseFile((char*)path); +int __syscall_truncate64(const char* path, off_t length) { + auto parsed = path::parseFile(path); if (auto err = parsed.getError()) { return err; } - return doTruncate(parsed.getFile(), size); + return doTruncate(parsed.getFile(), length); } int __syscall_ftruncate64(int fd, off_t size) { @@ -1331,7 +1330,7 @@ int __syscall_ioctl(int fd, int request, ...) { } } -int __syscall_pipe(intptr_t fd) { +int __syscall_pipe(int fd[2]) { auto* fds = (__wasi_fd_t*)fd; // Make a pipe: Two PipeFiles that share a single data source between them, so @@ -1353,9 +1352,7 @@ int __syscall_pipe(intptr_t fd) { return 0; } -// int poll(struct pollfd* fds, nfds_t nfds, int timeout); -int __syscall_poll(intptr_t fds_, int nfds, int timeout) { - struct pollfd* fds = (struct pollfd*)fds_; +int __syscall_poll(struct pollfd* fds, nfds_t nfds, int timeout) { auto fileTable = wasmFS.getFileTable().locked(); // Process the list of FDs and compute their revents masks. Count the number @@ -1555,20 +1552,20 @@ doStatFS(std::shared_ptr& file, size_t size, struct statfs* buf) { return 0; } -int __syscall_statfs64(intptr_t path, size_t size, intptr_t buf) { - auto parsed = path::parseFile((char*)path); +int __syscall_statfs64(const char* path, size_t size, struct statfs* buf) { + auto parsed = path::parseFile(path); if (auto err = parsed.getError()) { return err; } - return doStatFS(parsed.getFile(), size, (struct statfs*)buf); + return doStatFS(parsed.getFile(), size, buf); } -int __syscall_fstatfs64(int fd, size_t size, intptr_t buf) { +int __syscall_fstatfs64(int fd, size_t size, struct statfs* buf) { auto openFile = wasmFS.getFileTable().locked().getEntry(fd); if (!openFile) { return -EBADF; } - return doStatFS(openFile->locked().getFile(), size, (struct statfs*)buf); + return doStatFS(openFile->locked().getFile(), size, buf); } int _mmap_js(size_t length, @@ -1666,7 +1663,7 @@ int _mmap_js(size_t length, } int _msync_js( - intptr_t addr, size_t length, int prot, int flags, int fd, off_t offset) { + void* addr, size_t length, int prot, int flags, int fd, off_t offset) { // TODO: This is not correct! Mappings should be associated with files, not // fds. Only need to sync if shared and writes are allowed. int mapType = flags & MAP_TYPE; @@ -1682,7 +1679,7 @@ int _msync_js( } int _munmap_js( - intptr_t addr, size_t length, int prot, int flags, int fd, off_t offset) { + void* addr, size_t length, int prot, int flags, int fd, off_t offset) { // TODO: This is not correct! Mappings should be associated with files, not // fds. // TODO: Syncing should probably be handled in __syscall_munmap instead. @@ -1691,88 +1688,69 @@ int _munmap_js( // Stubs (at least for now) -int __syscall_accept4(int sockfd, - intptr_t addr, - intptr_t addrlen, - int flags, - int dummy1, - int dummy2) { +int __syscall_accept4(int sockfd, void* addr, socklen_t* len, int flags, ...) { return -ENOSYS; } -int __syscall_bind( - int sockfd, intptr_t addr, size_t alen, int dummy, int dummy2, int dummy3) { +int __syscall_bind(int sockfd, const void* addr, socklen_t len, ...) { return -ENOSYS; } -int __syscall_connect( - int sockfd, intptr_t addr, size_t len, int dummy, int dummy2, int dummy3) { +int __syscall_connect(int sockfd, const void* addr, socklen_t len, ...) { return -ENOSYS; } -int __syscall_socket( - int domain, int type, int protocol, int dummy1, int dummy2, int dummy3) { +int __syscall_socket(int domain, int type, int protocol, ...) { return -ENOSYS; } -int __syscall_listen( - int sockfd, int backlock, int dummy1, int dummy2, int dummy3, int dummy4) { - return -ENOSYS; -} +int __syscall_listen(int sockfd, int backlog, ...) { return -ENOSYS; } -int __syscall_getsockopt(int sockfd, - int level, - int optname, - intptr_t optval, - intptr_t optlen, - int dummy) { +int __syscall_getsockopt( + int sockfd, int level, int optname, void* optval, socklen_t* optlen, ...) { return -ENOSYS; } -int __syscall_getsockname( - int sockfd, intptr_t addr, intptr_t len, int dummy, int dummy2, int dummy3) { +int __syscall_getsockname(int sockfd, void* addr, socklen_t* len, ...) { return -ENOSYS; } -int __syscall_getpeername( - int sockfd, intptr_t addr, intptr_t len, int dummy, int dummy2, int dummy3) { +int __syscall_getpeername(int sockfd, void* addr, socklen_t* len, ...) { return -ENOSYS; } -int __syscall_sendto( - int sockfd, intptr_t msg, size_t len, int flags, intptr_t addr, size_t alen) { +ssize_t __syscall_sendto(int sockfd, + const void* buf, + size_t len, + int flags, + const void* addr, + socklen_t alen) { return -ENOSYS; } -int __syscall_sendmsg( - int sockfd, intptr_t msg, int flags, intptr_t addr, size_t alen, int dummy) { +ssize_t __syscall_sendmsg(int sockfd, const void* msg, int flags, ...) { return -ENOSYS; } -int __syscall_recvfrom(int sockfd, - intptr_t msg, - size_t len, - int flags, - intptr_t addr, - intptr_t alen) { +ssize_t __syscall_recvfrom( + int sockfd, void* buf, size_t len, int flags, void* addr, socklen_t* alen) { return -ENOSYS; } -int __syscall_recvmsg( - int sockfd, intptr_t msg, int flags, int dummy, int dummy2, int dummy3) { +ssize_t __syscall_recvmsg(int sockfd, void* msg, int flags, ...) { return -ENOSYS; } -int __syscall_fadvise64(int fd, off_t offset, off_t length, int advice) { +int __syscall_fadvise64(int fd, off_t offset, off_t len, int advice) { // Advice is currently ignored. TODO some backends might use it return 0; } int __syscall__newselect(int nfds, - intptr_t readfds_, - intptr_t writefds_, - intptr_t exceptfds_, - intptr_t timeout_) { + void* readfds_, + void* writefds_, + void* exceptfds_, + void* timeout_) { // TODO: Implement this syscall. For now, we return an error code, // specifically ENOMEM which is valid per the docs: // ENOMEM Unable to allocate memory for internal tables From 92e838cfa4f3019378622a7adb6d27e2fc36baa4 Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Fri, 9 Jun 2023 15:21:05 +0200 Subject: [PATCH 5/6] clang-format syscalls.cpp --- system/lib/wasmfs/syscalls.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/system/lib/wasmfs/syscalls.cpp b/system/lib/wasmfs/syscalls.cpp index 4b944ec4f3e12..5acff4944db8b 100644 --- a/system/lib/wasmfs/syscalls.cpp +++ b/system/lib/wasmfs/syscalls.cpp @@ -347,12 +347,15 @@ backend_t wasmfs_get_backend_by_path(const char* path) { static timespec ms_to_timespec(double ms) { long long seconds = ms / 1000; timespec ts; - ts.tv_sec = seconds; // seconds + ts.tv_sec = seconds; // seconds ts.tv_nsec = (ms - (seconds * 1000)) * 1000 * 1000; // nanoseconds return ts; } -int __syscall_newfstatat(int dirfd, const char* path, struct stat* buf, int flags) { +int __syscall_newfstatat(int dirfd, + const char* path, + struct stat* buf, + int flags) { // Only accept valid flags. if (flags & ~(AT_EMPTY_PATH | AT_NO_AUTOMOUNT | AT_SYMLINK_NOFOLLOW)) { // TODO: Test this case. @@ -595,8 +598,9 @@ int __syscall_mknodat(int dirfd, const char* path, mode_t mode, dev_t dev) { OpenReturnMode::Nothing); } -static int -doMkdir(path::ParsedParent parsed, mode_t mode, backend_t backend = NullBackend) { +static int doMkdir(path::ParsedParent parsed, + mode_t mode, + backend_t backend = NullBackend) { if (auto err = parsed.getError()) { return err; } @@ -1069,7 +1073,9 @@ int __syscall_renameat(int olddirfd, } // TODO: Test this with non-AT_FDCWD values. -int __syscall_symlinkat(const char* target, int newdirfd, const char* linkpath) { +int __syscall_symlinkat(const char* target, + int newdirfd, + const char* linkpath) { auto parsed = path::parseParent(linkpath, newdirfd); if (auto err = parsed.getError()) { return err; @@ -1746,11 +1752,8 @@ int __syscall_fadvise64(int fd, off_t offset, off_t len, int advice) { return 0; } -int __syscall__newselect(int nfds, - void* readfds_, - void* writefds_, - void* exceptfds_, - void* timeout_) { +int __syscall__newselect( + int nfds, void* readfds_, void* writefds_, void* exceptfds_, void* timeout_) { // TODO: Implement this syscall. For now, we return an error code, // specifically ENOMEM which is valid per the docs: // ENOMEM Unable to allocate memory for internal tables From d18f24f3cd99131e02d009b94338dbbb122a2220 Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Fri, 9 Jun 2023 15:34:02 +0200 Subject: [PATCH 6/6] WasmFS JS API: prefer `const char*` --- system/lib/wasmfs/js_api.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/lib/wasmfs/js_api.cpp b/system/lib/wasmfs/js_api.cpp index c5dca36a98006..445b674ea2741 100644 --- a/system/lib/wasmfs/js_api.cpp +++ b/system/lib/wasmfs/js_api.cpp @@ -64,7 +64,7 @@ int _wasmfs_read_file(const char* path, uint8_t** out_buf, off_t* out_size) { // Writes to a file, possibly creating it, and returns the number of bytes // written successfully. If the file already exists, appends to it. -int _wasmfs_write_file(const char* pathname, char* data, size_t data_size) { +int _wasmfs_write_file(const char* pathname, const char* data, size_t data_size) { auto parsedParent = path::parseParent(pathname); if (parsedParent.getError()) { return 0;