From b5a930170627e4d33b9a0eac1c61dd1d44a131e4 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Tue, 26 Apr 2022 12:01:55 -0600
Subject: [PATCH] Map live disk only if not already mapped

---
 src/scheme/live.rs | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/scheme/live.rs b/src/scheme/live.rs
index a88d5c20..6cc69638 100644
--- a/src/scheme/live.rs
+++ b/src/scheme/live.rs
@@ -11,6 +11,10 @@ use syscall::error::*;
 use syscall::flag::{MODE_DIR, MODE_FILE};
 use syscall::scheme::{calc_seek_offset_usize, Scheme};
 
+use crate::memory::Frame;
+use crate::paging::{ActivePageTable, Page, PageFlags, PhysicalAddress, TableKind, VirtualAddress};
+use crate::paging::mapper::PageFlushAll;
+
 static mut LIST: [u8; 2] = [b'0', b'\n'];
 
 struct Handle {
@@ -47,8 +51,23 @@ impl DiskScheme {
         }
 
         if phys > 0 && size > 0 {
-            // Live disk pages already mapped
+            // Ensure live disk pages are mapped
             let virt = phys + crate::PHYS_OFFSET;
+            unsafe {
+                let mut active_table = ActivePageTable::new(TableKind::Kernel);
+                let flush_all = PageFlushAll::new();
+                let start_page = Page::containing_address(VirtualAddress::new(virt));
+                let end_page = Page::containing_address(VirtualAddress::new(virt + size - 1));
+                for page in Page::range_inclusive(start_page, end_page) {
+                    if active_table.translate_page(page).is_none() {
+                        let frame = Frame::containing_address(PhysicalAddress::new(page.start_address().data() - crate::PHYS_OFFSET));
+                        let flags = PageFlags::new().write(true);
+                        let result = active_table.map_to(page, frame, flags);
+                        flush_all.consume(result);
+                    }
+                }
+                flush_all.flush();
+            }
             Some(DiskScheme {
                 next_id: AtomicUsize::new(0),
                 list: Arc::new(RwLock::new(unsafe { &mut LIST })),
-- 
GitLab