diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-01-01 18:22:19 -0800 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-01-01 18:42:48 -0800 |
commit | 65409d2312e702a48d3cf5b32479d25266bda3c3 (patch) | |
tree | 62a7262fce61f2302109246da4536ce6f8e9ef80 /tools/iso/kernel.soso/spinlock.c | |
parent | a6da50ad30d2e1825575ffef497ab450a8f26e94 (diff) | |
download | mu-65409d2312e702a48d3cf5b32479d25266bda3c3.tar.gz |
5858
Move script to create a Soso boot image into a sub-directory. I'm trying to streamline newcomer attention to just a couple of use cases.
Diffstat (limited to 'tools/iso/kernel.soso/spinlock.c')
-rw-r--r-- | tools/iso/kernel.soso/spinlock.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/tools/iso/kernel.soso/spinlock.c b/tools/iso/kernel.soso/spinlock.c new file mode 100644 index 00000000..8efbdb20 --- /dev/null +++ b/tools/iso/kernel.soso/spinlock.c @@ -0,0 +1,25 @@ +#include "spinlock.h" + +static inline int32 exchangeAtomic(volatile int32* oldValueAddress, int32 newValue) { + //no need to use lock instruction on xchg + + asm volatile ("xchgl %0, %1" + : "=r"(newValue) + : "m"(*oldValueAddress), "0"(newValue) + : "memory"); + return newValue; +} + +void Spinlock_Init(Spinlock* spinlock) { + *spinlock = 0; +} + +void Spinlock_Lock(Spinlock* spinlock) { + while (exchangeAtomic((int32*)spinlock, 1)) { + halt(); + } +} + +void Spinlock_Unlock(Spinlock* spinlock) { + *spinlock = 0; +} |