spinlock: fix locking

Fixes locking mechanism of spinlocks.
Current implementation hasn't worked at all,
so there wasn't any synchronization between cores.
I myself have broken it a long time ago.

Signed-off-by: Tomasz Lauda <tomasz.lauda@linux.intel.com>
This commit is contained in:
Tomasz Lauda 2019-08-03 16:29:33 +02:00 committed by Tomasz Lauda
parent f7abaf7b33
commit ff02f2f008
1 changed files with 14 additions and 15 deletions

View File

@ -22,35 +22,34 @@ typedef struct {
static inline void arch_spin_lock(spinlock_t *lock)
{
uint32_t result, current;
uint32_t result;
__asm__ __volatile__(
"1: l32i %1, %2, 0\n"
" wsr %1, scompare1\n"
" movi %0, 1\n"
" s32c1i %0, %2, 0\n"
" bne %0, %1, 1b\n"
: "=&a" (result), "=&a" (current)
" movi %0, 0\n"
" wsr %0, scompare1\n"
"1: movi %0, 1\n"
" s32c1i %0, %1, 0\n"
" bnez %0, 1b\n"
: "=&a" (result)
: "a" (&lock->lock)
: "memory");
}
static inline int arch_try_lock(spinlock_t *lock)
{
uint32_t result, current;
uint32_t result;
__asm__ __volatile__(
" l32i %1, %2, 0\n"
" wsr %1, scompare1\n"
" movi %0, 0\n"
" wsr %0, scompare1\n"
" movi %0, 1\n"
" s32c1i %0, %2, 0\n"
: "=&a" (result), "=&a" (current)
" s32c1i %0, %1, 0\n"
: "=&a" (result)
: "a" (&lock->lock)
: "memory");
if (result)
return 0; /* lock failed */
return 1; /* lock acquired */
/* return 0 for failed lock, 1 otherwise */
return result ? 0 : 1;
}
static inline void arch_spin_unlock(spinlock_t *lock)