Updated lock

This commit is contained in:
Alex
2022-11-20 16:13:19 +02:00
parent deee2ac8e0
commit f907ca907d
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