Kernel: Implement basic SpinLock
This commit is contained in:
parent
1945b716ad
commit
337569b0ca
|
@ -45,6 +45,7 @@ kernel/PIT.o \
|
|||
kernel/RTC.o \
|
||||
kernel/Serial.o \
|
||||
kernel/Shell.o \
|
||||
kernel/SpinLock.o \
|
||||
kernel/SSP.o \
|
||||
kernel/TTY.o \
|
||||
kernel/VesaTerminalDriver.o \
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
.global spinlock_lock_asm
|
||||
spinlock_lock_asm:
|
||||
lock; btsl $0, (%edi)
|
||||
jnc .done
|
||||
.retry:
|
||||
pause
|
||||
testl $1, (%edi)
|
||||
jne .retry
|
||||
lock; btsl $0, (%edi)
|
||||
jc .retry
|
||||
.done:
|
||||
ret
|
||||
|
||||
.global spinlock_unlock_asm
|
||||
spinlock_unlock_asm:
|
||||
movl $0, (%edi)
|
||||
ret
|
|
@ -7,4 +7,5 @@ KERNEL_ARCH_OBJS= \
|
|||
$(ARCHDIR)/boot.o \
|
||||
$(ARCHDIR)/IDT.o \
|
||||
$(ARCHDIR)/MMU.o \
|
||||
$(ARCHDIR)/SpinLock.o \
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
.global spinlock_lock_asm
|
||||
spinlock_lock_asm:
|
||||
lock; btsq $0, (%rdi)
|
||||
jnc .done
|
||||
.retry:
|
||||
pause
|
||||
testq $1, (%rdi)
|
||||
jne .retry
|
||||
lock; btsq $0, (%rdi)
|
||||
jc .retry
|
||||
.done:
|
||||
ret
|
||||
|
||||
.global spinlock_unlock_asm
|
||||
spinlock_unlock_asm:
|
||||
movq $0, (%rdi)
|
||||
ret
|
|
@ -6,6 +6,7 @@ KERNEL_ARCH_LIBS=
|
|||
KERNEL_ARCH_OBJS= \
|
||||
$(ARCHDIR)/boot.o \
|
||||
$(ARCHDIR)/IDT.o \
|
||||
$(ARCHDIR)/MMU.o \
|
||||
$(ARCHDIR)/interrupts.o \
|
||||
$(ARCHDIR)/MMU.o \
|
||||
$(ARCHDIR)/SpinLock.o \
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
#pragma once
|
||||
|
||||
#include <BAN/NoCopyMove.h>
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
template<typename Lock>
|
||||
class LockGuard
|
||||
{
|
||||
BAN_NON_COPYABLE(LockGuard<Lock>);
|
||||
BAN_NON_MOVABLE(LockGuard<Lock>);
|
||||
|
||||
public:
|
||||
LockGuard(Lock& lock)
|
||||
: m_lock(lock)
|
||||
{
|
||||
m_lock.lock();
|
||||
}
|
||||
|
||||
~LockGuard()
|
||||
{
|
||||
m_lock.unlock();
|
||||
}
|
||||
|
||||
private:
|
||||
Lock& m_lock;
|
||||
};
|
||||
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
#pragma once
|
||||
|
||||
#include <BAN/NoCopyMove.h>
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
class SpinLock
|
||||
{
|
||||
BAN_NON_COPYABLE(SpinLock);
|
||||
BAN_NON_MOVABLE(SpinLock);
|
||||
|
||||
public:
|
||||
SpinLock() = default;
|
||||
void lock();
|
||||
void unlock();
|
||||
|
||||
private:
|
||||
int m_lock = 0;
|
||||
};
|
||||
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
#include <kernel/SpinLock.h>
|
||||
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
extern "C" void spinlock_lock_asm(int*);
|
||||
extern "C" void spinlock_unlock_asm(int*);
|
||||
|
||||
void SpinLock::lock()
|
||||
{
|
||||
spinlock_lock_asm(&m_lock);
|
||||
}
|
||||
|
||||
void SpinLock::unlock()
|
||||
{
|
||||
spinlock_unlock_asm(&m_lock);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue