1
0
mirror of https://github.com/rcore-os/rCore.git synced 2024-11-22 16:16:16 +04:00

mutex added.

This commit is contained in:
NagiNikaido 2019-05-13 13:47:33 +08:00
parent edf9cf1225
commit 8c3323c4d4

View File

@ -8,6 +8,7 @@ use crate::arch::driver::ide;
#[cfg(target_arch = "aarch64")] #[cfg(target_arch = "aarch64")]
use crate::arch::board::emmc; use crate::arch::board::emmc;
use crate::sync::SpinNoIrqLock as Mutex;
pub struct MemBuf(RwLock<&'static mut [u8]>); pub struct MemBuf(RwLock<&'static mut [u8]>);
@ -63,20 +64,25 @@ impl BlockDevice for ide::IDE {
} }
#[cfg(target_arch = "aarch64")] #[cfg(target_arch = "aarch64")]
impl BlockDevice for emmc::EmmcCtl { pub struct EmmcDriver(Mutex<emmc::EmmcCtl>);
#[cfg(target_arch = "aarch64")]
impl BlockDevice for EmmcDriver {
const BLOCK_SIZE_LOG2: u8 = 9; const BLOCK_SIZE_LOG2: u8 = 9;
fn read_at(&self, block_id: usize, buf: &mut [u8]) -> Result<()> { fn read_at(&self, block_id: usize, buf: &mut [u8]) -> Result<()> {
use core::slice; use core::slice;
assert!(buf.len() >= emmc::BLOCK_SIZE); assert!(buf.len() >= emmc::BLOCK_SIZE);
let buf = unsafe { slice::from_raw_parts_mut(buf.as_ptr() as *mut u32, emmc::BLOCK_SIZE / 4) }; let buf = unsafe { slice::from_raw_parts_mut(buf.as_ptr() as *mut u32, emmc::BLOCK_SIZE / 4) };
self.read(block_id as u32, 1, buf).map_err(|_| DevError)?; let mut ctrl = self.0.lock();
ctrl.read(block_id as u32, 1, buf).map_err(|_| DevError)?;
Ok(()) Ok(())
} }
fn write_at(&self, block_id: usize, buf: &[u8]) -> Result<()> { fn write_at(&self, block_id: usize, buf: &[u8]) -> Result<()> {
use core::slice; use core::slice;
assert!(buf.len() >= emmc::BLOCK_SIZE); assert!(buf.len() >= emmc::BLOCK_SIZE);
let buf = unsafe { slice::from_raw_parts(buf.as_ptr() as *mut u32, emmc::BLOCK_SIZE / 4) }; let buf = unsafe { slice::from_raw_parts(buf.as_ptr() as *mut u32, emmc::BLOCK_SIZE / 4) };
self.write(block_id as u32, 1, buf).map_err(|_| DevError)?; let mut ctrl = self.0.lock();
ctrl.write(block_id as u32, 1, buf).map_err(|_| DevError)?;
Ok(()) Ok(())
} }
fn sync(&self) -> Result<()> { fn sync(&self) -> Result<()> {