From d8a064128a8a06b90ff4c7b87c193518d9572641 Mon Sep 17 00:00:00 2001 From: Gou Ngai <94795048+AlbertSanoe@users.noreply.github.com> Date: Mon, 16 Jan 2023 19:58:50 +0800 Subject: [PATCH] =?UTF-8?q?Raw=20spin=20lock=20=E5=A2=9E=E5=8A=A0lock=5Fir?= =?UTF-8?q?qsave=E3=80=81unlock=5Firqrestore(#151)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Raw spin lock 增加lock_irqsave、unlock_irqrestore --- kernel/src/libs/spinlock.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/kernel/src/libs/spinlock.rs b/kernel/src/libs/spinlock.rs index 5eac2af1..f3e87e98 100644 --- a/kernel/src/libs/spinlock.rs +++ b/kernel/src/libs/spinlock.rs @@ -127,10 +127,19 @@ impl RawSpinlock { self.0.store(value, Ordering::SeqCst); } - // todo: spin_lock_irqsave - // todo: spin_unlock_irqrestore -} + /// @brief 保存中断状态到flags中,关闭中断,并对自旋锁加锁 + pub fn lock_irqsave(&self, flags: &mut u64) { + local_irq_save(flags); + self.lock(); + } + /// @brief 恢复rflags以及中断状态并解锁自旋锁 + pub fn unlock_irqrestore(&self, flags: &u64){ + self.unlock(); + local_irq_restore(flags); + } + +} /// 实现了守卫的SpinLock, 能够支持内部可变性 /// #[derive(Debug)] @@ -171,7 +180,7 @@ impl SpinLock { /// 实现Deref trait,支持通过获取SpinLockGuard来获取临界区数据的不可变引用 impl Deref for SpinLockGuard<'_, T> { type Target = T; - + fn deref(&self) -> &Self::Target { return unsafe { &*self.lock.data.get() }; }