mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-28 15:34:33 +00:00
Updated lock
This commit is contained in:
parent
deee2ac8e0
commit
f907ca907d
@ -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
|
@ -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
|
@ -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();
|
||||
|
@ -4,13 +4,6 @@
|
||||
#include <types.h>
|
||||
#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
|
||||
/** @brief Please use this macro to create a new lock. */
|
||||
class LockClass
|
||||
|
Loading…
x
Reference in New Issue
Block a user