Kernel/Architecture/i686/LockAssembly.S
2022-10-28 09:06:09 +03:00

71 lines
1.2 KiB
ArmAsm

# 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