mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-18 03:56:42 +00:00
TLB flush when modifying page table
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
8aef80f978
commit
df7bd65e70
@ -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);
|
||||||
|
@ -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(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user