pti file, doesnt work yet
This commit is contained in:
parent
b7855ae56c
commit
1b7ddd12d9
1 changed files with 68 additions and 0 deletions
68
kernel-rs/src/arch/x86/pti.rs
Normal file
68
kernel-rs/src/arch/x86/pti.rs
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
use core::ptr;
|
||||||
|
|
||||||
|
use super::paging::ActivePageTable;
|
||||||
|
// use super::paging::entry::EntryFlags;
|
||||||
|
|
||||||
|
#[thread_local]
|
||||||
|
pub static mut PTI_CPU_STACK: [u8; 256] = [0; 256];
|
||||||
|
|
||||||
|
#[thread_local]
|
||||||
|
pub static mut PTI_CONTEXT_STACK: usize = 0;
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
unsafe fn switch_stack(old: usize, new: usize) {
|
||||||
|
let old_esp: usize;
|
||||||
|
asm!("" : "={esp}"(old_esp) : : : "intel", "volatile");
|
||||||
|
|
||||||
|
let offset_esp = old - old_esp;
|
||||||
|
|
||||||
|
let new_esp = new - offset_esp;
|
||||||
|
|
||||||
|
ptr::copy_nonoverlapping(
|
||||||
|
old_esp as *const u8,
|
||||||
|
new_esp as *mut u8,
|
||||||
|
offset_esp
|
||||||
|
);
|
||||||
|
|
||||||
|
asm!("" : : "{esp}"(new_esp) : : "intel", "volatile");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub unsafe fn map() {
|
||||||
|
// {
|
||||||
|
// let mut active_table = unsafe { ActivePageTable::new() };
|
||||||
|
//
|
||||||
|
// // Map kernel heap
|
||||||
|
// let address = active_table.p4()[::KERNEL_HEAP_PML4].address();
|
||||||
|
// let frame = Frame::containing_address(address);
|
||||||
|
// let mut flags = active_table.p4()[::KERNEL_HEAP_PML4].flags();
|
||||||
|
// flags.remove(EntryFlags::PRESENT);
|
||||||
|
// active_table.p4_mut()[::KERNEL_HEAP_PML4].set(frame, flags);
|
||||||
|
//
|
||||||
|
// // Reload page tables
|
||||||
|
// active_table.flush_all();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Switch to per-context stack
|
||||||
|
switch_stack(PTI_CPU_STACK.as_ptr() as usize + PTI_CPU_STACK.len(), PTI_CONTEXT_STACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub unsafe fn unmap() {
|
||||||
|
// Switch to per-CPU stack
|
||||||
|
switch_stack(PTI_CONTEXT_STACK, PTI_CPU_STACK.as_ptr() as usize + PTI_CPU_STACK.len());
|
||||||
|
|
||||||
|
// {
|
||||||
|
// let mut active_table = unsafe { ActivePageTable::new() };
|
||||||
|
//
|
||||||
|
// // Unmap kernel heap
|
||||||
|
// let address = active_table.p4()[::KERNEL_HEAP_PML4].address();
|
||||||
|
// let frame = Frame::containing_address(address);
|
||||||
|
// let mut flags = active_table.p4()[::KERNEL_HEAP_PML4].flags();
|
||||||
|
// flags.insert(EntryFlags::PRESENT);
|
||||||
|
// active_table.p4_mut()[::KERNEL_HEAP_PML4].set(frame, flags);
|
||||||
|
//
|
||||||
|
// // Reload page tables
|
||||||
|
// active_table.flush_all();
|
||||||
|
// }
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue