summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-06-11 21:40:31 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-06-11 21:40:31 -0500
commit24e81bc664f5cdbfc8be1badf00b025ec122af00 (patch)
tree2d41e3305fb903024541d105dfec6adf1824839a /src/lib
parent165e6bed506f9fddd7e9da8ad1f4c7f186e29b00 (diff)
downloadtalos-hostboot-24e81bc664f5cdbfc8be1badf00b025ec122af00.tar.gz
talos-hostboot-24e81bc664f5cdbfc8be1badf00b025ec122af00.zip
Add mutex userspace / syscalls.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/makefile2
-rw-r--r--src/lib/syscall_mutex.C33
-rw-r--r--src/lib/syscall_task.C9
3 files changed, 39 insertions, 5 deletions
diff --git a/src/lib/makefile b/src/lib/makefile
index 1071dc75e..718a8219e 100644
--- a/src/lib/makefile
+++ b/src/lib/makefile
@@ -2,7 +2,7 @@ OBJDIR = ../../obj
include ../../config.mk
OBJS = string.o stdlib.o
-OBJS += syscall_stub.o syscall_task.o
+OBJS += syscall_stub.o syscall_task.o syscall_mutex.o
OBJECTS = $(addprefix ${OBJDIR}/, ${OBJS})
all: ${OBJECTS}
diff --git a/src/lib/syscall_mutex.C b/src/lib/syscall_mutex.C
new file mode 100644
index 000000000..8ac392792
--- /dev/null
+++ b/src/lib/syscall_mutex.C
@@ -0,0 +1,33 @@
+#include <sys/mutex.h>
+#include <sys/syscall.h>
+#include <kernel/usermutex.H>
+
+using namespace Systemcalls;
+
+mutex_t mutex_create()
+{
+ return (mutex_t) _syscall0(MUTEX_CREATE);
+}
+
+int mutex_destroy(mutex_t m)
+{
+ return (int64_t)_syscall1(MUTEX_DESTROY, m);
+}
+
+int mutex_lock(mutex_t m)
+{
+ uint64_t oldvalue = __sync_fetch_and_add(&((UserMutex*)m)->value, 1);
+ if (0 == oldvalue)
+ return 0;
+ else
+ return (int64_t)_syscall1(MUTEX_LOCK_CONTESTED, m);
+}
+
+int mutex_unlock(mutex_t m)
+{
+ uint64_t oldvalue = __sync_fetch_and_sub(&((UserMutex*)m)->value, 1);
+ if (1 == oldvalue)
+ return 0;
+ else
+ return (int64_t)_syscall1(MUTEX_UNLOCK_CONTESTED, m);
+}
diff --git a/src/lib/syscall_task.C b/src/lib/syscall_task.C
index bfd522933..d07ea3f19 100644
--- a/src/lib/syscall_task.C
+++ b/src/lib/syscall_task.C
@@ -1,4 +1,5 @@
#include <sys/task.h>
+#include <sys/syscall.h>
#include <kernel/task.H>
using namespace Systemcalls;
@@ -9,9 +10,9 @@ void task_yield()
return;
}
-int task_create(void(*fn)(void*), void* ptr)
+tid_t task_create(void(*fn)(void*), void* ptr)
{
- return (int64_t) _syscall2(TASK_START, (void*)fn, ptr);
+ return (tid_t) _syscall2(TASK_START, (void*)fn, ptr);
}
void task_end()
@@ -20,7 +21,7 @@ void task_end()
return;
}
-uint64_t task_gettid()
+tid_t task_gettid()
{
- return (uint64_t)_syscall0(TASK_GETTID);
+ return (tid_t)_syscall0(TASK_GETTID);
}
OpenPOWER on IntegriCloud