forked from Bananymous/banan-os
Kernel: Implement basic SpinLock
This commit is contained in:
@@ -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 \
|
||||||
|
|||||||
17
kernel/arch/i386/SpinLock.S
Normal file
17
kernel/arch/i386/SpinLock.S
Normal file
@@ -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 \
|
||||||
|
|
||||||
17
kernel/arch/x86_64/SpinLock.S
Normal file
17
kernel/arch/x86_64/SpinLock.S
Normal file
@@ -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 \
|
||||||
|
|
||||||
30
kernel/include/kernel/LockGuard.h
Normal file
30
kernel/include/kernel/LockGuard.h
Normal file
@@ -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;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
22
kernel/include/kernel/SpinLock.h
Normal file
22
kernel/include/kernel/SpinLock.h
Normal file
@@ -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;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
19
kernel/kernel/SpinLock.cpp
Normal file
19
kernel/kernel/SpinLock.cpp
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user