From 97f3c5bb933b08c0ea17058df31e14e063b5a9d3 Mon Sep 17 00:00:00 2001 From: Bryan McShea Date: Sat, 10 Feb 2024 22:04:12 -0500 Subject: [PATCH] garbage self made raw spin lock :sunglasses: --- kernel/Cargo.lock | 12 +----------- kernel/Cargo.toml | 1 - kernel/src/arch/riscv64/init.rs | 2 ++ kernel/src/arch/riscv64/qemu.rs | 2 +- kernel/src/arch/x86_64/interrupts.rs | 4 ++-- kernel/src/arch/x86_64/qemu.rs | 1 - kernel/src/main.rs | 4 ++++ kernel/src/util/mutex.rs | 27 +++++++++++++++++++++------ kernel/src/util/spin.rs | 6 +++--- 9 files changed, 34 insertions(+), 25 deletions(-) diff --git a/kernel/Cargo.lock b/kernel/Cargo.lock index 425b0c4..a6a298e 100644 --- a/kernel/Cargo.lock +++ b/kernel/Cargo.lock @@ -86,7 +86,6 @@ dependencies = [ "linked_list_allocator", "pc-keyboard", "pic8259", - "spin 0.9.8", "uart_16550", "x86_64", ] @@ -97,7 +96,7 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" dependencies = [ - "spin 0.5.2", + "spin", ] [[package]] @@ -176,15 +175,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - [[package]] name = "spinning_top" version = "0.2.5" diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index 334f8f8..c4c4207 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -10,7 +10,6 @@ bench = false [dependencies] embedded-graphics = "0.8.1" -spin = "0.9.8" pc-keyboard = "0.5.0" linked_list_allocator = "0.10.5" diff --git a/kernel/src/arch/riscv64/init.rs b/kernel/src/arch/riscv64/init.rs index 183b6dc..f186d4c 100644 --- a/kernel/src/arch/riscv64/init.rs +++ b/kernel/src/arch/riscv64/init.rs @@ -13,6 +13,8 @@ static mut DT_ADDR: *mut FDT = null_mut(); #[naked] unsafe extern "C" fn _start() -> ! { core::arch::asm!( + // disable interrupts + "csrw mie, zero", // set up gp & sp ".option push", ".option norelax", diff --git a/kernel/src/arch/riscv64/qemu.rs b/kernel/src/arch/riscv64/qemu.rs index ea8ade7..1a39c08 100644 --- a/kernel/src/arch/riscv64/qemu.rs +++ b/kernel/src/arch/riscv64/qemu.rs @@ -1,6 +1,6 @@ use core::fmt::{self, Write}; -use spin::Mutex; +use crate::util::mutex::Mutex; // --machine sifive_u // const UART_BASE: u32 = 0x10010000; diff --git a/kernel/src/arch/x86_64/interrupts.rs b/kernel/src/arch/x86_64/interrupts.rs index f3e51f9..2661561 100644 --- a/kernel/src/arch/x86_64/interrupts.rs +++ b/kernel/src/arch/x86_64/interrupts.rs @@ -104,5 +104,5 @@ extern "x86-interrupt" fn keyboard(_stack_frame: InterruptStackFrame) { pub const PIC_1_OFFSET: u8 = 32; pub const PIC_2_OFFSET: u8 = PIC_1_OFFSET + 8; -pub static PICS: spin::Mutex = - spin::Mutex::new(unsafe { ChainedPics::new(PIC_1_OFFSET, PIC_2_OFFSET) }); +pub static PICS: Mutex = + Mutex::new(unsafe { ChainedPics::new(PIC_1_OFFSET, PIC_2_OFFSET) }); diff --git a/kernel/src/arch/x86_64/qemu.rs b/kernel/src/arch/x86_64/qemu.rs index 7816ae4..09f6619 100644 --- a/kernel/src/arch/x86_64/qemu.rs +++ b/kernel/src/arch/x86_64/qemu.rs @@ -1,6 +1,5 @@ use core::fmt::Arguments; -use spin::Mutex; use uart_16550::SerialPort; use x86_64::instructions::{interrupts, port::Port}; diff --git a/kernel/src/main.rs b/kernel/src/main.rs index 43918c7..d1e4c4b 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -21,6 +21,10 @@ pub fn main(dt_addr: *mut FDT) -> ! { let mut test = alloc::vec![1, 2, 3]; test.push(3); println!("{:?}", test); + unsafe { + let x = *(0x3000 as *const u8); + println!("{}", x); + } // for _ in 0..40000000 {} // let x = unsafe { *(0x10000000000 as *mut u8) }; // println!("we got {x}"); diff --git a/kernel/src/util/mutex.rs b/kernel/src/util/mutex.rs index f2e2e7d..a477d91 100644 --- a/kernel/src/util/mutex.rs +++ b/kernel/src/util/mutex.rs @@ -1,29 +1,44 @@ +use core::ops::{Deref, DerefMut}; + use super::spin::SpinLock; -struct Mutex { +pub struct Mutex { lock: SpinLock, val: T, } impl Mutex { - pub fn new(val: T) -> Self { + pub const fn new(val: T) -> Self { Self { lock: SpinLock::new(), val, } } - pub fn lock(&mut self) -> MutexGuard { + pub fn lock(&self) -> MutexGuard { self.lock.lock(); MutexGuard { mutex: self } } } -struct MutexGuard<'a, T> { - mutex: &'a mut Mutex, +pub struct MutexGuard<'a, T> { + mutex: &'a Mutex, } -impl <'a, T> Drop for MutexGuard<'a, T> { +impl<'a, T> Drop for MutexGuard<'a, T> { fn drop(&mut self) { self.mutex.lock.unlock(); } } + +impl<'a, T> Deref for MutexGuard<'a, T> { + type Target = T; + fn deref(&self) -> &Self::Target { + &self.mutex.val + } +} + +impl<'a, T> DerefMut for MutexGuard<'a, T> { + fn deref_mut(&mut self) -> &mut Self::Target { + unsafe {&mut (*(self.mutex as *const Mutex as *mut Mutex)).val} + } +} diff --git a/kernel/src/util/spin.rs b/kernel/src/util/spin.rs index 1fbedd7..f47e0c4 100644 --- a/kernel/src/util/spin.rs +++ b/kernel/src/util/spin.rs @@ -5,15 +5,15 @@ pub struct SpinLock { } impl SpinLock { - pub fn new() -> Self { + pub const fn new() -> Self { Self { locked: AtomicBool::new(false), } } - pub fn lock(&mut self) { + pub fn lock(&self) { while self.locked.swap(true, Ordering::Acquire) {} } - pub fn unlock(&mut self) { + pub fn unlock(&self) { self.locked.store(false, Ordering::Release) } }