Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * ARM64 Spinlock support
0004  */
0005 #include <stdint.h>
0006 
0007 #include "spinlock.h"
0008 
0009 void spin_lock(struct spinlock *lock)
0010 {
0011     int val, res;
0012 
0013     asm volatile(
0014     "1: ldaxr   %w0, [%2]\n"
0015     "   cbnz    %w0, 1b\n"
0016     "   mov %w0, #1\n"
0017     "   stxr    %w1, %w0, [%2]\n"
0018     "   cbnz    %w1, 1b\n"
0019     : "=&r" (val), "=&r" (res)
0020     : "r" (&lock->v)
0021     : "memory");
0022 }
0023 
0024 void spin_unlock(struct spinlock *lock)
0025 {
0026     asm volatile("stlr wzr, [%0]\n" : : "r" (&lock->v) : "memory");
0027 }