mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-07-11 15:29:18 +00:00
Fixed compilation failing on i386
This commit is contained in:
70
Architecture/i686/LockAssembly.S
Normal file
70
Architecture/i686/LockAssembly.S
Normal file
@ -0,0 +1,70 @@
|
||||
# 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
|
Reference in New Issue
Block a user