diff options
| author | Aleksa Vuckovic <aleksav013@gmail.com> | 2023-01-28 21:06:31 +0100 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksav013@gmail.com> | 2023-01-28 21:13:50 +0100 |
| commit | d9194d46ef70e7c9f76b876b2439c24649d57d1e (patch) | |
| tree | 80c84763508f0431f3f8dde673615f6b2714a4be /kernel/src/scheduler/atomic.c | |
| parent | c53c696286821ad13ab9ec61ed011cfe90e193c0 (diff) | |
atomic test_and_set; spinlocks
Diffstat (limited to 'kernel/src/scheduler/atomic.c')
| -rw-r--r-- | kernel/src/scheduler/atomic.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/kernel/src/scheduler/atomic.c b/kernel/src/scheduler/atomic.c new file mode 100644 index 0000000..41ce3b9 --- /dev/null +++ b/kernel/src/scheduler/atomic.c @@ -0,0 +1,27 @@ +#include <types.h> +#include <atomic.h> +#include <libk/stdio.h> +#include <heap.h> + +void init_mutex(mutex_t* mutex) +{ + mutex->addr = (uint64_t*)kalloc(sizeof(uint64_t)); + *(mutex->addr) = 0; +} + +bool test_and_set(mutex_t mutex, bool value) +{ + bool rax; + __asm__ volatile ("lock xchg %%rax, (%%rbx);" : "=a"(rax) : "b"(mutex.addr), "a"(value)); + return rax; +} + +void lock(mutex_t mutex) +{ + while (test_and_set(mutex, 1)) ; +} + +void unlock(mutex_t mutex) +{ + test_and_set(mutex, 0); +} |
