From 0f30d227497418c6d3bef7d52244407e30454504 Mon Sep 17 00:00:00 2001 From: Kacper Date: Mon, 22 Dec 2025 23:27:56 +0100 Subject: Added c11 threads, fixed some locks and add *_unlocked functions --- lib/libc/internal/util/Kbuild | 3 +++ lib/libc/internal/util/futex.c | 13 +++++++++++++ lib/libc/internal/util/panic.c | 29 +++++++++++++++++++++++++++++ lib/libc/internal/util/syscall.c | 12 ++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 lib/libc/internal/util/Kbuild create mode 100644 lib/libc/internal/util/futex.c create mode 100644 lib/libc/internal/util/panic.c create mode 100644 lib/libc/internal/util/syscall.c (limited to 'lib/libc/internal/util') diff --git a/lib/libc/internal/util/Kbuild b/lib/libc/internal/util/Kbuild new file mode 100644 index 00000000..9c8d0fc7 --- /dev/null +++ b/lib/libc/internal/util/Kbuild @@ -0,0 +1,3 @@ +obj-y += futex.o +obj-y += panic.o +obj-y += syscall.o diff --git a/lib/libc/internal/util/futex.c b/lib/libc/internal/util/futex.c new file mode 100644 index 00000000..2f9872a0 --- /dev/null +++ b/lib/libc/internal/util/futex.c @@ -0,0 +1,13 @@ +#include +#include + +int __futex_wait(volatile int *uaddr, int val) +{ + return syscall(futex, uaddr, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, val, 0, 0, 0); +} + +int __futex_wake(volatile int *uaddr, int n) +{ + /* futex(uaddr, FUTEX_WAKE, val=n, ...) */ + return syscall(futex, uaddr, FUTEX_WAKE | FUTEX_PRIVATE_FLAG, n, 0, 0, 0); +} diff --git a/lib/libc/internal/util/panic.c b/lib/libc/internal/util/panic.c new file mode 100644 index 00000000..1af6d6cf --- /dev/null +++ b/lib/libc/internal/util/panic.c @@ -0,0 +1,29 @@ +#include +#include +#include +#include + +__dead void __libc_panic(const char *prefix, const char *f, const char *errmsg) +{ + struct iovec iovec[5]; + const char *e = "libc panic: "; + + iovec[0].iov_base = (char *)e; + iovec[0].iov_len = sizeof("libc panic: ") - 1; + + iovec[1].iov_base = (char *)prefix; + iovec[1].iov_len = strlen(prefix); + + iovec[2].iov_base = (char *)f; + iovec[2].iov_len = strlen(f); + + iovec[3].iov_base = (char *)errmsg; + iovec[3].iov_len = strlen(errmsg); + + iovec[4].iov_base = "\n"; + iovec[4].iov_len = 1; + + writev(STDERR_FILENO, iovec, 5); + + __builtin_trap(); +} diff --git a/lib/libc/internal/util/syscall.c b/lib/libc/internal/util/syscall.c new file mode 100644 index 00000000..f7fd3c4b --- /dev/null +++ b/lib/libc/internal/util/syscall.c @@ -0,0 +1,12 @@ +#include +#include + +long __syscall_ret(long ret) +{ + if (__predict_false(ret > -4096 && ret < 0)) { + errno = (int)-ret; + ret = -1; + } + + return ret; +} -- cgit v1.2.3