diff --git a/src/sys/fs/block.rs b/src/sys/fs/block.rs
index b0d4630..7af9882 100644
@@ -1,5 +1,6 @@
use super::block_size;
use super::block_bitmap::BlockBitmap;
+use super::block_device::StorageIO;
use core::convert::TryInto;
@@ -42,14 +43,14 @@ impl Block {
pub fn read(addr: u32) -> Self {
let mut buf = [0; block_size()];
- if let Some(ref block_device) = *super::block_device::BLOCK_DEVICE.lock() {
+ if let Some(ref block_device) = *super::block_device::STORAGE.lock() {
block_device.read(addr, &mut buf);
}
Self { addr, buf }
}
pub fn write(&self) {
- if let Some(ref block_device) = *super::block_device::BLOCK_DEVICE.lock() {
+ if let Some(ref block_device) = *super::block_device::STORAGE.lock() {
block_device.write(self.addr, &self.buf);
}
}
diff --git a/src/sys/fs/block_device.rs b/src/sys/fs/block_device.rs
index a24756f..2a22dd6 100644
@@ -4,49 +4,86 @@ use super::superblock_addr;
use crate::sys;
+use alloc::string::String;
use lazy_static::lazy_static;
use spin::Mutex;
pub const MAGIC: &str = "MOROS FS";
lazy_static! {
- pub static ref BLOCK_DEVICE: Mutex<Option<BlockDevice>> = Mutex::new(None);
+ pub static ref STORAGE: Mutex<Option<Storage>> = Mutex::new(None);
}
-pub struct BlockDevice {
+pub enum Storage {
+ Memory,
+ BlockDevice(Disk),
+}
+
+pub trait StorageIO {
+ fn read(&self, addr: u32, buf: &mut [u8]);
+ fn write(&self, addr: u32, buf: &[u8]);
+}
+
+impl StorageIO for Storage {
+ fn read(&self, addr: u32, buf: &mut [u8]) {
+ match self {
+ Storage::Memory => {
+ todo!();
+ },
+ Storage::BlockDevice(dev) => {
+ dev.read(addr, buf)
+ },
+ }
+ }
+
+ fn write(&self, addr: u32, buf: &[u8]) {
+ match self {
+ Storage::Memory => {
+ todo!();
+ },
+ Storage::BlockDevice(dev) => {
+ dev.write(addr, buf)
+ },
+ }
+ }
+}
+
+pub struct Disk {
bus: u8,
dsk: u8,
}
-impl BlockDevice {
+impl Disk {
pub fn new(bus: u8, dsk: u8) -> Self {
Self { bus, dsk }
}
+}
- pub fn read(&self, block: u32, mut buf: &mut [u8]) {
- sys::ata::read(self.bus, self.dsk, block, &mut buf);
+impl StorageIO for Disk {
+ fn read(&self, block_addr: u32, mut buf: &mut [u8]) {
+ sys::ata::read(self.bus, self.dsk, block_addr, &mut buf);
}
- pub fn write(&self, block: u32, buf: &[u8]) {
- sys::ata::write(self.bus, self.dsk, block, buf);
+ fn write(&self, block_addr: u32, buf: &[u8]) {
+ sys::ata::write(self.bus, self.dsk, block_addr, buf);
}
}
pub fn is_mounted() -> bool {
- BLOCK_DEVICE.lock().is_some()
+ STORAGE.lock().is_some()
}
pub fn mount(bus: u8, dsk: u8) {
- let block_device = BlockDevice::new(bus, dsk);
- *BLOCK_DEVICE.lock() = Some(block_device);
+ let dev = Disk::new(bus, dsk);
+ *STORAGE.lock() = Some(Storage::BlockDevice(dev));
}
pub fn format(bus: u8, dsk: u8) {
// Write superblock
let mut buf = MAGIC.as_bytes().to_vec();
buf.resize(512, 0);
- let block_device = BlockDevice::new(bus, dsk);
- block_device.write(superblock_addr(), &buf);
+ let dev = Disk::new(bus, dsk);
+ dev.write(superblock_addr(), &buf);
mount(bus, dsk);
@@ -54,3 +91,16 @@ pub fn format(bus: u8, dsk: u8) {
let root = Dir::root();
BlockBitmap::alloc(root.addr());
}
+
+pub fn init() {
+ for bus in 0..2 {
+ for dsk in 0..2 {
+ let mut buf = [0u8; 512];
+ sys::ata::read(bus, dsk, superblock_addr(), &mut buf);
+ if String::from_utf8_lossy(&buf[0..8]) == MAGIC {
+ log!("MFS Superblock found in ATA {}:{}\n", bus, dsk);
+ mount(bus, dsk);
+ }
+ }
+ }
+}
diff --git a/src/sys/fs/mod.rs b/src/sys/fs/mod.rs
index 6b46f24..3420170 100644
@@ -85,16 +85,5 @@ pub const fn bitmap_addr() -> u32 {
*/
pub fn init() {
- for bus in 0..2 {
- for dsk in 0..2 {
- let mut buf = [0u8; 512];
- sys::ata::read(bus, dsk, superblock_addr(), &mut buf);
- if let Ok(header) = String::from_utf8(buf[0..8].to_vec()) {
- if header == block_device::MAGIC {
- log!("MFS Superblock found in ATA {}:{}\n", bus, dsk);
- mount(bus, dsk);
- }
- }
- }
- }
+ block_device::init();
}