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