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 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);

View File

@ -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<T: PageTableEntryTrait> PageTable<T> {
return Err(PageTableError::InvalidModification);
}
last_entry.update(paddr, flags);
tlb_flush(vaddr);
Ok(())
}
@ -225,6 +226,7 @@ impl<T: PageTableEntryTrait> PageTable<T> {
return Err(PageTableError::InvalidModification);
}
last_entry.clear();
tlb_flush(vaddr);
Ok(())
}
@ -235,6 +237,7 @@ impl<T: PageTableEntryTrait> PageTable<T> {
return Err(PageTableError::InvalidModification);
}
last_entry.update(last_entry.paddr(), flags);
tlb_flush(vaddr);
Ok(())
}