summaryrefslogtreecommitdiff
path: root/lib/libc/internal/util
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/internal/util')
-rw-r--r--lib/libc/internal/util/Kbuild3
-rw-r--r--lib/libc/internal/util/futex.c13
-rw-r--r--lib/libc/internal/util/panic.c29
-rw-r--r--lib/libc/internal/util/syscall.c12
4 files changed, 57 insertions, 0 deletions
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 <linux/futex.h>
+#include <syscall.h>
+
+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 <string.h>
+#include <sys/cdefs.h>
+#include <sys/uio.h>
+#include <unistd.h>
+
+__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 <errno.h>
+#include <sys/cdefs.h>
+
+long __syscall_ret(long ret)
+{
+ if (__predict_false(ret > -4096 && ret < 0)) {
+ errno = (int)-ret;
+ ret = -1;
+ }
+
+ return ret;
+}