Updated lock

This commit is contained in:
Alex 2022-11-20 16:13:19 +02:00
parent deee2ac8e0
commit f907ca907d
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD
4 changed files with 0 additions and 174 deletions

View File

@ -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 <struct> *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

View File

@ -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 <struct> *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

View File

@ -5,33 +5,6 @@
#include "../kernel.h" #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) void LockClass::DeadLock(SpinLockData Lock)
{ {
CPUData *CoreData = GetCurrentCPU(); CPUData *CoreData = GetCurrentCPU();

View File

@ -4,13 +4,6 @@
#include <types.h> #include <types.h>
#include <cpu.hpp> #include <cpu.hpp>
#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 #ifdef __cplusplus
/** @brief Please use this macro to create a new lock. */ /** @brief Please use this macro to create a new lock. */
class LockClass class LockClass