xref: /DragonOS/kernel/src/libs/spinlock.rs (revision 66f67c6a95b8aad85cfd2146a86e5e3e6a3568e7)
1*66f67c6aSlogin #![allow(dead_code)]
2*66f67c6aSlogin use core::ptr::read_volatile;
3*66f67c6aSlogin 
4*66f67c6aSlogin use crate::arch::x86_64::asm::irqflags::{local_irq_restore, local_irq_save};
5*66f67c6aSlogin use crate::include::bindings::bindings::{spin_lock, spin_unlock, spinlock_t};
6*66f67c6aSlogin 
7*66f67c6aSlogin /// @brief 保存中断状态到flags中,关闭中断,并对自旋锁加锁
8*66f67c6aSlogin pub fn spin_lock_irqsave(lock: *mut spinlock_t, flags: &mut u64) {
9*66f67c6aSlogin     local_irq_save(flags);
10*66f67c6aSlogin     unsafe {
11*66f67c6aSlogin         spin_lock(lock);
12*66f67c6aSlogin     }
13*66f67c6aSlogin }
14*66f67c6aSlogin 
15*66f67c6aSlogin /// @brief 恢复rflags以及中断状态并解锁自旋锁
16*66f67c6aSlogin #[no_mangle]
17*66f67c6aSlogin pub fn spin_unlock_irqrestore(lock: *mut spinlock_t, flags: &u64) {
18*66f67c6aSlogin     unsafe {
19*66f67c6aSlogin         spin_unlock(lock);
20*66f67c6aSlogin     }
21*66f67c6aSlogin     // kdebug!("123");
22*66f67c6aSlogin     local_irq_restore(flags);
23*66f67c6aSlogin }
24*66f67c6aSlogin 
25*66f67c6aSlogin /// 判断一个自旋锁是否已经被加锁
26*66f67c6aSlogin pub fn spin_is_locked(lock: &spinlock_t) -> bool {
27*66f67c6aSlogin     let val = unsafe { read_volatile(&lock.lock as *const i8) };
28*66f67c6aSlogin 
29*66f67c6aSlogin     return if val == 0 { true } else { false };
30*66f67c6aSlogin }
31