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"
|
#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();
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user