Kernel: Implement basic SpinLock
This commit is contained in:
parent
1945b716ad
commit
337569b0ca
|
@ -45,6 +45,7 @@ kernel/PIT.o \
|
||||||
kernel/RTC.o \
|
kernel/RTC.o \
|
||||||
kernel/Serial.o \
|
kernel/Serial.o \
|
||||||
kernel/Shell.o \
|
kernel/Shell.o \
|
||||||
|
kernel/SpinLock.o \
|
||||||
kernel/SSP.o \
|
kernel/SSP.o \
|
||||||
kernel/TTY.o \
|
kernel/TTY.o \
|
||||||
kernel/VesaTerminalDriver.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)/boot.o \
|
||||||
$(ARCHDIR)/IDT.o \
|
$(ARCHDIR)/IDT.o \
|
||||||
$(ARCHDIR)/MMU.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= \
|
KERNEL_ARCH_OBJS= \
|
||||||
$(ARCHDIR)/boot.o \
|
$(ARCHDIR)/boot.o \
|
||||||
$(ARCHDIR)/IDT.o \
|
$(ARCHDIR)/IDT.o \
|
||||||
$(ARCHDIR)/MMU.o \
|
|
||||||
$(ARCHDIR)/interrupts.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