xref: /DragonOS/kernel/src/arch/riscv64/asm/spinlock.c (revision 4fda81ce81939d83b74c8042d6fb4223deff3685)
1*4fda81ceSLoGin #include <common/spinlock.h>
2*4fda81ceSLoGin #include <process/preempt.h>
3*4fda81ceSLoGin 
__arch_spin_lock(spinlock_t * lock)4*4fda81ceSLoGin void __arch_spin_lock(spinlock_t *lock)
5*4fda81ceSLoGin {
6*4fda81ceSLoGin     while(1);
7*4fda81ceSLoGin     rs_preempt_disable();
8*4fda81ceSLoGin }
9*4fda81ceSLoGin 
__arch_spin_unlock(spinlock_t * lock)10*4fda81ceSLoGin void __arch_spin_unlock(spinlock_t *lock)
11*4fda81ceSLoGin {
12*4fda81ceSLoGin     while(1);
13*4fda81ceSLoGin     rs_preempt_enable();
14*4fda81ceSLoGin }
15*4fda81ceSLoGin 
__arch_spin_lock_no_preempt(spinlock_t * lock)16*4fda81ceSLoGin void __arch_spin_lock_no_preempt(spinlock_t *lock)
17*4fda81ceSLoGin {
18*4fda81ceSLoGin     while(1);
19*4fda81ceSLoGin }
20*4fda81ceSLoGin 
__arch_spin_unlock_no_preempt(spinlock_t * lock)21*4fda81ceSLoGin void __arch_spin_unlock_no_preempt(spinlock_t *lock)
22*4fda81ceSLoGin {
23*4fda81ceSLoGin     while(1);
24*4fda81ceSLoGin }
25*4fda81ceSLoGin 
__arch_spin_trylock(spinlock_t * lock)26*4fda81ceSLoGin long __arch_spin_trylock(spinlock_t *lock)
27*4fda81ceSLoGin {
28*4fda81ceSLoGin     uint64_t tmp_val = 0;
29*4fda81ceSLoGin     rs_preempt_disable();
30*4fda81ceSLoGin     // 交换tmp_val和lock的值,若tmp_val==1则证明加锁成功
31*4fda81ceSLoGin     while(1);
32*4fda81ceSLoGin     if (!tmp_val)
33*4fda81ceSLoGin         rs_preempt_enable();
34*4fda81ceSLoGin     return tmp_val;
35*4fda81ceSLoGin }
36