From f907ca907da5364ea49642d062e0c168b17d6601 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 20 Nov 2022 16:13:19 +0200 Subject: [PATCH] Updated lock --- Architecture/amd64/LockAssembly.S | 70 ------------------------------- Architecture/i686/LockAssembly.S | 70 ------------------------------- Core/Lock.cpp | 27 ------------ include/lock.hpp | 7 ---- 4 files changed, 174 deletions(-) delete mode 100644 Architecture/amd64/LockAssembly.S delete mode 100644 Architecture/i686/LockAssembly.S diff --git a/Architecture/amd64/LockAssembly.S b/Architecture/amd64/LockAssembly.S deleted file mode 100644 index c0bddb7..0000000 --- a/Architecture/amd64/LockAssembly.S +++ /dev/null @@ -1,70 +0,0 @@ -# https://en.wikipedia.org/wiki/Spinlock - -.text - -# void SpinLock_Lock(volatile uint64_t *LockData) -.global SpinLock_Lock - -# void SpinLock_Unlock(volatile uint64_t *LockData) -.global SpinLock_Unlock - -# uint64_t SpinLock_CheckAndLock(volatile uint64_t *LockData) -.global SpinLock_CheckAndLock - -# uint64_t SpinLock_WithTimeout(volatile uint64_t *LockData, volatile uint64_t Iterations) -.global SpinLock_WithTimeout - -# DeadLockHandler(volatile *LockStructure) -.extern DeadLockHandler - -SpinLock_Lock: - xorq %rax,%rax - lock btsl $0,(%rdi) - jc Spin - ret -Spin: - incq %rax - cmpq $0x10000000,%rax - je Deadlock - pause - testl $1,(%rdi) - jnz Spin - jmp SpinLock_Lock - -SpinLock_Unlock: - lock btrl $0,(%rdi) - ret - -Deadlock: - pushq %rdi - pushq %rdi - xorq %rax,%rax - call DeadLockHandler - popq %rdi - popq %rdi - jmp Spin - -SpinLock_CheckAndLock: - xorl %eax,%eax - lock btsl $0,(%rdi) - setcb %al - ret - -SpinLock_WithTimeout: - xorq %rax,%rax -SpinTimeout: - incq %rax - lock btsl $0,(%rdi) - setcb %bl - cmpb $0,%bl - je LockAquired - cmpq %rsi,%rax - je LockTimedOut - pause - jmp SpinTimeout -LockAquired: - movq $1,%rax - ret -LockTimedOut: - xorq %rax,%rax - ret diff --git a/Architecture/i686/LockAssembly.S b/Architecture/i686/LockAssembly.S deleted file mode 100644 index f918193..0000000 --- a/Architecture/i686/LockAssembly.S +++ /dev/null @@ -1,70 +0,0 @@ -# https://en.wikipedia.org/wiki/Spinlock - -.text - -# void SpinLock_Lock(volatile uint32_t *LockData) -.global SpinLock_Lock - -# void SpinLock_Unlock(volatile uint32_t *LockData) -.global SpinLock_Unlock - -# uint32_t SpinLock_CheckAndLock(volatile uint32_t *LockData) -.global SpinLock_CheckAndLock - -# uint32_t SpinLock_WithTimeout(volatile uint32_t *LockData, volatile uint32_t Iterations) -.global SpinLock_WithTimeout - -# DeadLockHandler(volatile *LockStructure) -.extern DeadLockHandler - -SpinLock_Lock: - xor %eax,%eax - lock btsl $0,(%edi) - jc Spin - ret -Spin: - inc %eax - cmp $0x10000000,%eax - je Deadlock - pause - test $1,(%edi) - jnz Spin - jmp SpinLock_Lock - -SpinLock_Unlock: - lock btrl $0,(%edi) - ret - -Deadlock: - push %edi - push %edi - xor %eax,%eax - call DeadLockHandler - pop %edi - pop %edi - jmp Spin - -SpinLock_CheckAndLock: - xor %eax,%eax - lock btsl $0,(%edi) - setc %al - ret - -SpinLock_WithTimeout: - xor %eax,%eax -SpinTimeout: - inc %eax - lock btsl $0,(%edi) - setc %bl - cmp $0,%bl - je LockAquired - cmp %esi,%eax - je LockTimedOut - pause - jmp SpinTimeout -LockAquired: - mov $1,%eax - ret -LockTimedOut: - xor %eax,%eax - ret diff --git a/Core/Lock.cpp b/Core/Lock.cpp index d531f7e..8165425 100644 --- a/Core/Lock.cpp +++ b/Core/Lock.cpp @@ -5,33 +5,6 @@ #include "../kernel.h" -static unsigned long DeadLocks = 0; - -extern "C" void DeadLockHandler(LockClass *Lock) -{ - CPUData *CoreData = GetCurrentCPU(); - long CCore = 0xdead; - if (CoreData != nullptr) - CCore = CoreData->ID; - warn("Potential deadlock in lock '%s' held by '%s' (%ld) [%#lx-%ld] [%ld->%ld]", - Lock->GetLockData()->AttemptingToGet, - Lock->GetLockData()->CurrentHolder, - DeadLocks, - Lock->GetLockData()->LockData, - Lock->GetLockData()->Count, - CCore, - Lock->GetLockData()->Core); - - // warn("Potential deadlock in lock ' ' held by ' ' (%ld) %ld", DeadLocks, CCore); - - // TODO: Print on screen too. - - DeadLocks++; - - if (TaskManager) - TaskManager->Schedule(); -} - void LockClass::DeadLock(SpinLockData Lock) { CPUData *CoreData = GetCurrentCPU(); diff --git a/include/lock.hpp b/include/lock.hpp index b7a513f..afa411b 100644 --- a/include/lock.hpp +++ b/include/lock.hpp @@ -4,13 +4,6 @@ #include #include -#pragma GCC diagnostic ignored "-Wvolatile" - -EXTERNC void SpinLock_Lock(volatile uint64_t *LockData); -EXTERNC void SpinLock_Unlock(volatile uint64_t *LockData); -EXTERNC uint64_t SpinLock_CheckAndLock(volatile uint64_t *LockData); -EXTERNC uint64_t SpinLock_WithTimeout(volatile uint64_t *LockData, volatile uint64_t Iterations); - #ifdef __cplusplus /** @brief Please use this macro to create a new lock. */ class LockClass