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