Add spinlocks
This commit is contained in:
parent
be31f2c017
commit
d4a982306f
15
kernel/include/thread/Spinlock.h
Normal file
15
kernel/include/thread/Spinlock.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
struct Spinlock
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void acquire();
|
||||||
|
void release();
|
||||||
|
bool locked();
|
||||||
|
|
||||||
|
private:
|
||||||
|
volatile uint64_t m_lock = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
void lock(Spinlock& lock, void (*action)(void));
|
26
kernel/src/thread/Spinlock.asm
Normal file
26
kernel/src/thread/Spinlock.asm
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
global spinlock_lock_acquire
|
||||||
|
spinlock_lock_acquire:
|
||||||
|
lock bts qword [rdi], 0
|
||||||
|
jc .spin
|
||||||
|
ret
|
||||||
|
.spin:
|
||||||
|
pause
|
||||||
|
test qword [rdi], 1
|
||||||
|
jnz .spin
|
||||||
|
jmp spinlock_lock_acquire
|
||||||
|
|
||||||
|
global spinlock_lock_release
|
||||||
|
spinlock_lock_release:
|
||||||
|
mov qword [rdi], 0
|
||||||
|
ret
|
||||||
|
|
||||||
|
global spinlock_lock_is_locked
|
||||||
|
spinlock_lock_is_locked:
|
||||||
|
cmp qword [rdi], 0
|
||||||
|
je .free
|
||||||
|
.locked:
|
||||||
|
mov rax, 1
|
||||||
|
ret
|
||||||
|
.free:
|
||||||
|
mov rax, 0
|
||||||
|
ret
|
27
kernel/src/thread/Spinlock.cpp
Normal file
27
kernel/src/thread/Spinlock.cpp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#include "thread/Spinlock.h"
|
||||||
|
|
||||||
|
extern "C" void spinlock_lock_acquire(uint64_t* lock);
|
||||||
|
extern "C" void spinlock_lock_release(uint64_t* lock);
|
||||||
|
extern "C" int spinlock_lock_is_locked(uint64_t* lock);
|
||||||
|
|
||||||
|
void Spinlock::acquire()
|
||||||
|
{
|
||||||
|
spinlock_lock_acquire(&m_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Spinlock::release()
|
||||||
|
{
|
||||||
|
spinlock_lock_release(&m_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Spinlock::locked()
|
||||||
|
{
|
||||||
|
return spinlock_lock_is_locked(&m_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lock(Spinlock& lock, void (*action)(void))
|
||||||
|
{
|
||||||
|
lock.acquire();
|
||||||
|
action();
|
||||||
|
lock.release();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user