From e7a6ae9cc5b84abe63c7439005656ecc4beda8c1 Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Wed, 9 Jun 2010 14:12:01 -0500 Subject: Kernel spinlock support. --- src/include/kernel/spinlock.H | 20 ++++++++++++++++++++ src/include/util/locked/lock.H | 20 ++++++++++++++++++++ src/kernel/makefile | 2 +- src/kernel/spinlock.C | 12 ++++++++++++ src/libc++/builtins.C | 6 ++++++ 5 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/include/kernel/spinlock.H create mode 100644 src/include/util/locked/lock.H create mode 100644 src/kernel/spinlock.C (limited to 'src') 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 +#include + +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 + +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; -- cgit v1.2.3