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