TLB flush when modifying page table

This commit is contained in:
Yuke Peng
2023-08-22 18:06:42 +08:00
committed by Tate, Hongliang Tian
parent 8aef80f978
commit df7bd65e70
2 changed files with 10 additions and 3 deletions

View File

@ -1,13 +1,13 @@
use alloc::{collections::BTreeMap, fmt}; use alloc::{collections::BTreeMap, fmt};
use pod::Pod; use pod::Pod;
use spin::Mutex; use spin::Mutex;
use x86_64::structures::paging::PhysFrame; use x86_64::{instructions::tlb, structures::paging::PhysFrame, VirtAddr};
use crate::{ use crate::{
config::ENTRY_COUNT, config::ENTRY_COUNT,
vm::{ vm::{
page_table::{table_of, PageTableEntryTrait, PageTableFlagsTrait}, 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)] #[derive(Clone, Copy, Pod)]
#[repr(C)] #[repr(C)]
pub struct PageTableEntry(usize); pub struct PageTableEntry(usize);

View File

@ -3,7 +3,7 @@ use super::{
frame_allocator, paddr_to_vaddr, VmAllocOptions, VmFrameVec, {Paddr, Vaddr}, frame_allocator, paddr_to_vaddr, VmAllocOptions, VmFrameVec, {Paddr, Vaddr},
}; };
use crate::{ use crate::{
arch::mm::PageTableEntry, arch::mm::{tlb_flush, PageTableEntry},
config::{ENTRY_COUNT, PAGE_SIZE}, config::{ENTRY_COUNT, PAGE_SIZE},
vm::VmFrame, vm::VmFrame,
}; };
@ -165,6 +165,7 @@ impl<T: PageTableEntryTrait> PageTable<T> {
return Err(PageTableError::InvalidModification); return Err(PageTableError::InvalidModification);
} }
last_entry.update(paddr, flags); last_entry.update(paddr, flags);
tlb_flush(vaddr);
Ok(()) Ok(())
} }
@ -225,6 +226,7 @@ impl<T: PageTableEntryTrait> PageTable<T> {
return Err(PageTableError::InvalidModification); return Err(PageTableError::InvalidModification);
} }
last_entry.clear(); last_entry.clear();
tlb_flush(vaddr);
Ok(()) Ok(())
} }
@ -235,6 +237,7 @@ impl<T: PageTableEntryTrait> PageTable<T> {
return Err(PageTableError::InvalidModification); return Err(PageTableError::InvalidModification);
} }
last_entry.update(last_entry.paddr(), flags); last_entry.update(last_entry.paddr(), flags);
tlb_flush(vaddr);
Ok(()) Ok(())
} }