From 4e3a92cdbb76083b0dee481fa05fb21a7ed65787 Mon Sep 17 00:00:00 2001 From: Masato Imai Date: Sun, 27 Apr 2025 09:19:38 +0000 Subject: [PATCH] fix address translation --- src/vmm/ept.rs | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/vmm/ept.rs b/src/vmm/ept.rs index 9710570..472fdb6 100644 --- a/src/vmm/ept.rs +++ b/src/vmm/ept.rs @@ -1,9 +1,8 @@ -use core::sync::atomic::Ordering; - use bitfield::bitfield; -use x86_64::PhysAddr; - -use crate::memory; +use x86_64::{ + structures::paging::{OffsetPageTable, Translate}, + PhysAddr, VirtAddr, +}; pub enum Assert {} @@ -16,7 +15,10 @@ pub struct TableEntry { } impl TableEntry { - pub fn new_map_table(table: TableEntry) -> Self + pub fn new_map_table( + table: TableEntry, + mapper: OffsetPageTable<'static>, + ) -> Self where Assert<{ LEVEL > L }>: IsTrue, Assert<{ L > 0 }>: IsTrue, @@ -26,14 +28,17 @@ impl TableEntry { entry.set_map_memory(false); entry.set_typ(0); entry.set_phys( - (&table as *const _ as u64 + memory::PHYSICAL_MEMORY_OFFSET.load(Ordering::Relaxed)) + (mapper + .translate_addr(VirtAddr::from_ptr(&table)) + .unwrap() + .as_u64()) >> 12, ); Self { entry } } - pub fn new_map_page(phys: u64) -> Self + pub fn new_map_page(phys: u64, mapper: OffsetPageTable<'static>) -> Self where Assert<{ L < 4 }>: IsTrue, Assert<{ L > 0 }>: IsTrue, @@ -45,7 +50,12 @@ impl TableEntry { entry.set_exec_user(true); entry.set_map_memory(true); entry.set_typ(0); - entry.set_phys((phys + memory::PHYSICAL_MEMORY_OFFSET.load(Ordering::Relaxed)) >> 12); + entry.set_phys( + (mapper.translate_addr(VirtAddr::new(phys))) + .unwrap() + .as_u64() + >> 12, + ); Self { entry } }