Some page fault handling / NMI nesting procedure

This commit is contained in:
2023-05-16 18:20:51 +02:00
parent db916dd9d5
commit eb1ae07e2b
2 changed files with 79 additions and 16 deletions

View File

@@ -15,8 +15,6 @@ extern {
interrupt_stack!(divide_by_zero, |stack| {
println!("Divide by zero");
const ADDR: usize = 0xDEADC0DE;
println!("value {}", unsafe { (ADDR as *const u8).read_volatile() });
stack.dump();
stack_trace();
ksignal(SIGFPE);
@@ -47,10 +45,38 @@ interrupt_stack!(debug, @paranoid, |stack| {
nmi_handler!(non_maskable, |stack| {
println!("Non-maskable interrupt");
let rsp: usize;
core::arch::asm!("mov {}, rsp", out(reg) rsp);
println!("RSP: {:>016X}", rsp);
stack.dump();
// let rsp: usize;
// core::arch::asm!("mov {}, rsp", out(reg) rsp);
// println!("RSP: {:>016X}", rsp);
use crate::info;
use crate::time::realtime;
let req = syscall::TimeSpec {
tv_sec: 0,
tv_nsec: 0,
};
let time = realtime();
info!("{} : Entering NMI", time);
// let mut rem = syscall::TimeSpec::default();
// let _ = crate::syscall::time::nanosleep(&req, Some(&mut rem));
// Page Fault
let addr = 0xDEADC0DE as *const u8;
let n = core::ptr::read(addr);
println!("{}",n);
// core::arch::asm!(
// "
// mov rdx, [0xDEADC0DE]
// ");
// let mut rem = syscall::TimeSpec::default();
// let _ = crate::syscall::time::nanosleep(&req, Some(&mut rem));
let time = realtime();
info!("{} : Exiting NMI", time);
});
interrupt_stack!(breakpoint, |stack| {
@@ -146,19 +172,57 @@ interrupt_error!(page, |stack| {
println!(" User: {}", stack.code & 1 << 2 != 0);
println!(" Reserved write: {}", stack.code & 1 << 3 != 0);
println!(" Instruction fetch: {}", stack.code & 1 << 4 != 0);
stack.dump();
// stack.dump();
stack_trace();
// ksignal(SIGSEGV);
// use crate::paging::entry::Entry;
// use crate::paging::Page;
use crate::arch::paging::PAGE_SIZE;
use crate::syscall::data::Map;
// use crate::syscall::data::Map;
use crate::rmm::KernelMapper;
// use crate::context::memory::Grant;
use rmm::{PageEntry, VirtualAddress};
// use bitfield::Bit;
use rmm::PageFlags;
let aligned_addr: usize = cr2 / PAGE_SIZE * PAGE_SIZE;
println!("{:x?}",aligned_addr);
let map = Map { offset: 0, address: aligned_addr, size: PAGE_SIZE, flags: MapFlags::MAP_FIXED_NOREPLACE | MapFlags::MAP_PRIVATE | MapFlags::PROT_READ | MapFlags::PROT_WRITE };
// let _ = syscall::fmap(!0, &map).expect("failed to re-map address");
let _ = MemoryScheme.fmap(!0, &map ).expect("IDK") ;
//loop{}
// let page = Page::containing_address(VirtualAddress::new(aligned_addr));
// println!("{:x?}",page);
let mut km = KernelMapper::lock();
let mut km = km.get_mut().expect("pls");
// let mut pt = km.table();
let mut flags = PageFlags::new();
//flags = flags.custom_flag(MapFlags::MAP_FIXED_NOREPLACE.bits(),true);
//flags = flags.custom_flag(MapFlags::MAP_PRIVATE.bits(),true);
//flags = flags.custom_flag(MapFlags::PROT_READ.bits(),true);
//flags = flags.custom_flag(MapFlags::PROT_WRITE.bits(),true);
//flags.set_bit(0,true);
println!("{:?}",flags);
let r = km.map(VirtualAddress::new(aligned_addr),flags);
//println!("{:?}",r);
// let mut entry = PageEntry::new(0);
// entry.set_flags(flags);
// println!("{:?}",entry);
// let i = pt.index_of(addr).expect("qqch");
// println!("{:?}",pt.entry_base(0));
// println!("{:?}",pt.entry_virt(0));
// println!("{:?}",pt.entry(0));
//let a = pt.set_entry(aligned_addr>>12,entry);
// let map = Map { offset: 0, address: aligned_addr, size: PAGE_SIZE, flags: MapFlags::MAP_FIXED_NOREPLACE | MapFlags::MAP_PRIVATE | MapFlags::PROT_READ | MapFlags::PROT_WRITE };
// let page = Page::containing_address(VirtualAddress::new(map.address));
// let page_count = map.size/PAGE_SIZE;
// let p = context::current().expect("ha").read().addr_space().expect("hb").write()
// .mmap((map.address != 0).then_some(page), page_count, map.flags, |page, flags, mapper, flusher| {
// Ok(Grant::zeroed(page, page_count, flags, mapper, flusher)?)
// }).expect("hc");
//let _ = MemoryScheme.fmap(!0, &map ).expect("IDK") ;
});
interrupt_stack!(fpu_fault, |stack| {

View File

@@ -419,7 +419,7 @@ macro_rules! interrupt_stack {
push_scratch!(),
push_preserved!(),
"
//call {p}
// call {p}
",
$save2!(),
@@ -567,7 +567,7 @@ macro_rules! nmi_handler {
"
end_repeat_nmi:
",
swapgs_iff_ring3_fast!(),
swapgs_iff_ring3_fast!(),
"
push rax
",
@@ -683,7 +683,6 @@ macro_rules! interrupt_error {
println!("hello int");
}
core::arch::asm!(concat!(
//"call {hello}\n",
swapgs_iff_ring3_fast_errorcode!(),
// Move rax into code's place, put code in last instead (to be
// compatible with InterruptStack)
@@ -695,7 +694,7 @@ macro_rules! interrupt_error {
// Put code in, it's now in rax
"push rax\n",
//"call {hello}\n",
// TODO: Map PTI
// $crate::arch::x86_64::pti::map();
@@ -721,7 +720,7 @@ macro_rules! interrupt_error {
),
inner = sym inner,
hello = sym hello,
// hello = sym hello,
options(noreturn));
}