From 77f28d029d4893079643e3cf522df1b47c559682 Mon Sep 17 00:00:00 2001 From: Moysan Gabriel Date: Wed, 15 Mar 2023 00:32:58 +0100 Subject: [PATCH] impl translate --- src/simulator/machine.rs | 2 +- src/simulator/mmu.rs | 43 +++++++++++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/simulator/machine.rs b/src/simulator/machine.rs index 447ce1e..62624a3 100644 --- a/src/simulator/machine.rs +++ b/src/simulator/machine.rs @@ -15,7 +15,7 @@ pub enum ExceptionType { //SYSCALL_EXCEPTION,//A program executed a system call. PAGEFAULT_EXCEPTION,//Page fault exception READONLY_EXCEPTION,//Write attempted to a page marked "read-only" */ - //BUSERROR_EXCEPTION, + BUSERROR_EXCEPTION, /* translation resulted in an invalid physical address (mis-aligned or diff --git a/src/simulator/mmu.rs b/src/simulator/mmu.rs index 40ee0b1..a19f149 100644 --- a/src/simulator/mmu.rs +++ b/src/simulator/mmu.rs @@ -1,8 +1,6 @@ use crate::simulator::translationtable::*; use crate::simulator::machine::*; -use super::machine::ExceptionType; - pub struct MMU <'a>{ /* Un MMU possède une seule référence vers une table des pages à un instant donné * Cette table est associée au processus courant @@ -20,14 +18,35 @@ impl <'a>MMU <'_>{ } } - fn translate(mmu : &mut MMU, virtAddr : u64, physAddr : &mut u64, size : usize, writing : bool) -> ExceptionType { + pub fn mmu_read_mem(mmu : &mut MMU, machine : &Machine, virt_addr : u64, value : &mut u64) -> bool { + //Pour plus tard eventuellement considerer le boutisme de notre mémoire + //Peut etre pas si on fixe cela en BIG ENDIAN (octects poids fort au debut) + let mut phy_addr : u64 = 0; + let mut phy_addr_double_check : u64 = 0; + let exc = MMU::translate(mmu, virt_addr, &mut phy_addr, false); + MMU::translate(mmu, virt_addr, &mut phy_addr_double_check, false); + + //PB ICI car double appel a translate et on doit a chaque appel passer mmu en param + true + } + + pub fn mmu_write_mem(&mut self, machine : &mut Machine, virt_addr : u64, value : &mut u64) -> bool { + //Pour plus tard eventuellement considerer le boutisme de notre mémoire + //Peut etre pas si on fixe cela en BIG ENDIAN (octects poids fort au debut) + + + + true + } + + pub fn translate(mmu : &mut MMU, virtAddr : u64, physAddr : &mut u64, writing : bool) -> ExceptionType { let vpn : u64 = virtAddr/PAGE_SIZE; //virtual page index let offset : u64 = virtAddr%PAGE_SIZE; //adresse intra page - match &mmu.translationTable { + match &mut mmu.translationTable { None => { println!("Error from translate : MMU refers to None (No page Table)"); return ExceptionType::ADDRESSERROR_EXCEPTION; @@ -67,7 +86,21 @@ impl <'a>MMU <'_>{ } //Make sure that the physical adress is correct - let num_phy_page = (MEM_SIZE as u64)/PAGE_SIZE; + if table_ref.get_physical_page(vpn) < 0 || table_ref.get_physical_page(vpn) >= (NUM_PHY_PAGE as i32) { + println!("Error from translate :: no valid correspondance"); + return ExceptionType::BUSERROR_EXCEPTION; + } + + //Set U/M bits to 1 + if writing { + table_ref.set_bit_M(vpn); + } + + table_ref.set_bit_U(vpn); + + //on se permet ici la conversion du champs physical_page de i32 vers u64 + //si cette valeur avait été signée, cela aurait été detecté juste au dessus, renvoyant une BUSERROR_EXCEPTION + *physAddr = (table_ref.get_physical_page(vpn) as u64)*PAGE_SIZE + offset; } }