diff --git a/framework/jinux-frame/src/arch/x86/mm/mod.rs b/framework/jinux-frame/src/arch/x86/mm/mod.rs index cee04d1fa..f12cd0fd2 100644 --- a/framework/jinux-frame/src/arch/x86/mm/mod.rs +++ b/framework/jinux-frame/src/arch/x86/mm/mod.rs @@ -1,13 +1,13 @@ use alloc::{collections::BTreeMap, fmt}; use pod::Pod; use spin::Mutex; -use x86_64::structures::paging::PhysFrame; +use x86_64::{instructions::tlb, structures::paging::PhysFrame, VirtAddr}; use crate::{ config::ENTRY_COUNT, vm::{ page_table::{table_of, PageTableEntryTrait, PageTableFlagsTrait}, - Paddr, + Paddr, Vaddr, }, }; @@ -41,6 +41,10 @@ bitflags::bitflags! { } } +pub fn tlb_flush(vaddr: Vaddr) { + tlb::flush(VirtAddr::new(vaddr as u64)); +} + #[derive(Clone, Copy, Pod)] #[repr(C)] pub struct PageTableEntry(usize); diff --git a/framework/jinux-frame/src/vm/page_table.rs b/framework/jinux-frame/src/vm/page_table.rs index be8a509bf..b8d81ce74 100644 --- a/framework/jinux-frame/src/vm/page_table.rs +++ b/framework/jinux-frame/src/vm/page_table.rs @@ -3,7 +3,7 @@ use super::{ frame_allocator, paddr_to_vaddr, VmAllocOptions, VmFrameVec, {Paddr, Vaddr}, }; use crate::{ - arch::mm::PageTableEntry, + arch::mm::{tlb_flush, PageTableEntry}, config::{ENTRY_COUNT, PAGE_SIZE}, vm::VmFrame, }; @@ -165,6 +165,7 @@ impl PageTable { return Err(PageTableError::InvalidModification); } last_entry.update(paddr, flags); + tlb_flush(vaddr); Ok(()) } @@ -225,6 +226,7 @@ impl PageTable { return Err(PageTableError::InvalidModification); } last_entry.clear(); + tlb_flush(vaddr); Ok(()) } @@ -235,6 +237,7 @@ impl PageTable { return Err(PageTableError::InvalidModification); } last_entry.update(last_entry.paddr(), flags); + tlb_flush(vaddr); Ok(()) }