moros 0.6.0

MOROS: Obscure Rust Operating System
Documentation
diff --git a/src/sys/fs/block.rs b/src/sys/fs/block.rs
index b0d4630..7af9882 100644
--- a/src/sys/fs/block.rs
+++ b/src/sys/fs/block.rs
@@ -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
--- a/src/sys/fs/block_device.rs
+++ b/src/sys/fs/block_device.rs
@@ -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
--- a/src/sys/fs/mod.rs
+++ b/src/sys/fs/mod.rs
@@ -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();
 }