Allow page table protectors to flush TLB entries precisely

This commit is contained in:
Zhang Junyang
2024-08-12 08:11:45 +00:00
committed by Tate, Hongliang Tian
parent 9a6e1b03e3
commit 4844e7ca7c
8 changed files with 148 additions and 102 deletions

View File

@ -16,7 +16,6 @@ use super::{
};
pub(crate) use crate::arch::task::{context_switch, TaskContext};
use crate::{
arch::mm::tlb_flush_addr_range,
cpu::CpuSet,
mm::{kspace::KERNEL_PAGE_TABLE, FrameAllocOptions, Paddr, PageFlags, Segment, PAGE_SIZE},
prelude::*,
@ -70,9 +69,8 @@ impl KernelStack {
unsafe {
let vaddr_range = guard_page_vaddr..guard_page_vaddr + PAGE_SIZE;
page_table
.protect(&vaddr_range, |p| p.flags -= PageFlags::RW)
.protect_flush_tlb(&vaddr_range, |p| p.flags -= PageFlags::RW)
.unwrap();
tlb_flush_addr_range(&vaddr_range);
}
Ok(Self {
segment: stack_segment,
@ -98,9 +96,8 @@ impl Drop for KernelStack {
unsafe {
let vaddr_range = guard_page_vaddr..guard_page_vaddr + PAGE_SIZE;
page_table
.protect(&vaddr_range, |p| p.flags |= PageFlags::RW)
.protect_flush_tlb(&vaddr_range, |p| p.flags |= PageFlags::RW)
.unwrap();
tlb_flush_addr_range(&vaddr_range);
}
}
}