mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-17 12:47:16 +00:00
TLB flush when modifying page table
This commit is contained in:
parent
8aef80f978
commit
df7bd65e70
@ -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);
|
||||
|
@ -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(())
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user