summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-06-09 14:12:01 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-06-09 14:12:01 -0500
commite7a6ae9cc5b84abe63c7439005656ecc4beda8c1 (patch)
treee50ad79598edeccd4b2e513f146896d2d60f0c82
parentcbbd9e5b225e743ee3b4688ac6a3b69a9876926a (diff)
downloadtalos-hostboot-e7a6ae9cc5b84abe63c7439005656ecc4beda8c1.tar.gz
talos-hostboot-e7a6ae9cc5b84abe63c7439005656ecc4beda8c1.zip
Kernel spinlock support.
-rw-r--r--src/include/kernel/spinlock.H20
-rw-r--r--src/include/util/locked/lock.H20
-rw-r--r--src/kernel/makefile2
-rw-r--r--src/kernel/spinlock.C12
-rw-r--r--src/libc++/builtins.C6
5 files changed, 59 insertions, 1 deletions
diff --git a/src/include/kernel/spinlock.H b/src/include/kernel/spinlock.H
new file mode 100644
index 000000000..92d1f6e05
--- /dev/null
+++ b/src/include/kernel/spinlock.H
@@ -0,0 +1,20 @@
+#ifndef __KERNEL_SPINLOCK_H
+#define __KERNEL_SPINLOCK_H
+
+#include <util/locked/lock.H>
+#include <stdint.h>
+
+class Spinlock : public Util::Locked::Lock
+{
+ public:
+ Spinlock() : iv_reserve(0), iv_ready(0) {};
+
+ void lock();
+ void unlock();
+
+ private:
+ volatile uint64_t iv_reserve;
+ volatile uint64_t iv_ready;
+};
+
+#endif
diff --git a/src/include/util/locked/lock.H b/src/include/util/locked/lock.H
new file mode 100644
index 000000000..b5237276e
--- /dev/null
+++ b/src/include/util/locked/lock.H
@@ -0,0 +1,20 @@
+#ifndef __UTIL_LOCKED_LOCK_H
+#define __UTIL_LOCKED_LOCK_H
+
+namespace Util
+{
+ namespace Locked
+ {
+ class Lock
+ {
+ public:
+ Lock() {};
+ virtual ~Lock() {};
+
+ virtual void lock() = 0;
+ virtual void unlock() = 0;
+ };
+ };
+};
+
+#endif
diff --git a/src/kernel/makefile b/src/kernel/makefile
index c07ae815a..629c39bcb 100644
--- a/src/kernel/makefile
+++ b/src/kernel/makefile
@@ -2,7 +2,7 @@ OBJDIR = ../../obj
include ../../config.mk
OBJS = start.o kernel.o console.o pagemgr.o heapmgr.o taskmgr.o cpumgr.o
-OBJS += syscall.o scheduler.o
+OBJS += syscall.o scheduler.o spinlock.o
OBJECTS = $(addprefix ${OBJDIR}/, ${OBJS})
all: ${OBJECTS}
diff --git a/src/kernel/spinlock.C b/src/kernel/spinlock.C
new file mode 100644
index 000000000..bfada05c4
--- /dev/null
+++ b/src/kernel/spinlock.C
@@ -0,0 +1,12 @@
+#include <kernel/spinlock.H>
+
+void Spinlock::lock()
+{
+ uint64_t reservation = __sync_fetch_and_add(&iv_reserve, 1);
+ while(iv_ready != reservation);
+}
+
+void Spinlock::unlock()
+{
+ __sync_add_and_fetch(&iv_ready, 1);
+}
diff --git a/src/libc++/builtins.C b/src/libc++/builtins.C
index 66eae1092..c2fffa816 100644
--- a/src/libc++/builtins.C
+++ b/src/libc++/builtins.C
@@ -76,4 +76,10 @@ extern "C" int __cxa_atexit(void (*)(void*), void*, void*)
return 0;
}
+extern "C" void __cxa_pure_virtual()
+{
+ // TODO: Add better code for invalid pure virtual call.
+ while(1);
+}
+
void* __dso_handle = (void*) &__dso_handle;
OpenPOWER on IntegriCloud