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