From db916dd9d597b1af38de1a87cd4e8b0f07cc227c Mon Sep 17 00:00:00 2001 From: vandechat96 Date: Wed, 10 May 2023 23:28:02 +0200 Subject: [PATCH] correct nmi handler / map page on pagefault (temp sol) --- src/arch/x86_64/interrupt/exception.rs | 17 ++++++++++++-- src/arch/x86_64/interrupt/handler.rs | 31 +++++++++++++++++--------- src/syscall/mod.rs | 6 ++--- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/arch/x86_64/interrupt/exception.rs b/src/arch/x86_64/interrupt/exception.rs index 2cf1fdc..7462d76 100644 --- a/src/arch/x86_64/interrupt/exception.rs +++ b/src/arch/x86_64/interrupt/exception.rs @@ -1,3 +1,4 @@ +use syscall::Scheme; use crate::{ interrupt::stack_trace, ptrace, @@ -6,6 +7,7 @@ use crate::{ interrupt_stack, interrupt_error, }; +use crate::scheme::memory::MemoryScheme; extern { fn ksignal(signal: usize); @@ -13,6 +15,8 @@ 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); @@ -144,8 +148,17 @@ interrupt_error!(page, |stack| { println!(" Instruction fetch: {}", stack.code & 1 << 4 != 0); stack.dump(); stack_trace(); - ksignal(SIGSEGV); - loop{}; + // ksignal(SIGSEGV); + + use crate::arch::paging::PAGE_SIZE; + use crate::syscall::data::Map; + + 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{} }); interrupt_stack!(fpu_fault, |stack| { diff --git a/src/arch/x86_64/interrupt/handler.rs b/src/arch/x86_64/interrupt/handler.rs index 27991be..af157a8 100644 --- a/src/arch/x86_64/interrupt/handler.rs +++ b/src/arch/x86_64/interrupt/handler.rs @@ -443,8 +443,8 @@ macro_rules! interrupt_stack { pop_scratch!(), $rstor1!(), - " - // call {p2} + " + //call {p2} ", "iretq\n", ), @@ -489,8 +489,8 @@ macro_rules! nmi_handler { } core::arch::asm!(concat!( " + //call {frsp} push rdx - // replace test come from kernel cmp QWORD PTR [rsp + 8*2], {GDT_KERNEL_CODE} jne first_nmi ", @@ -502,7 +502,7 @@ macro_rules! nmi_handler { // if nmi stack " lea rdx, [rsp + 6*8] - cmp 4*8[rsp], rdx + cmp [rsp + 4*8], rdx ja first_nmi ", // nested nmi @@ -519,9 +519,9 @@ macro_rules! nmi_handler { // prepare " 1: - lea rdx, -1*8[rsp] + lea rdx, [rsp - 8] mov rsp, rdx - lea rdx, -10*8[rsp] + lea rdx, [rsp - 10*8] push {GDT_KERNEL_DATA} push rdx pushf @@ -567,7 +567,7 @@ macro_rules! nmi_handler { " end_repeat_nmi: ", - swapgs_iff_ring3_fast!(), + swapgs_iff_ring3_fast!(), " push rax ", @@ -578,14 +578,15 @@ macro_rules! nmi_handler { mov rdi,rsp call {inner} ", - // restore_gbase_paranoid!(), + // restore_gsbase_paranoid!(), pop_preserved!(), pop_scratch!(), swapgs_iff_ring3_fast!(), + // remove extra frames and reset nmi exec var " //call {frsp} 7: - add rsp,$(6*8) + add rsp,$(12*8) mov QWORD PTR 5*8[rsp], $0 @@ -600,6 +601,12 @@ macro_rules! nmi_handler { GDT_KERNEL_CODE = const(crate::gdt::GDT_KERNEL_CODE), GDT_KERNEL_DATA = const(crate::gdt::GDT_KERNEL_DATA), + // IA32_GS_BASE = const(x86::msr::IA32_GS_BASE), + // KERNEL_PERCPU_SHIFT = const(crate::KERNEL_PERCPU_SHIFT), + // KERNEL_PERCPU_OFFSET = const(crate::KERNEL_PERCPU_OFFSET), + // + // gdt_cpu_id_offset = const(crate::gdt::GDT_CPU_ID_CONTAINER * core::mem::size_of::()), + options(noreturn), ); @@ -672,8 +679,11 @@ macro_rules! interrupt_error { $code } } - + fn hello(){ + 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) @@ -711,6 +721,7 @@ macro_rules! interrupt_error { ), inner = sym inner, + hello = sym hello, options(noreturn)); } diff --git a/src/syscall/mod.rs b/src/syscall/mod.rs index e43a060..6d21158 100644 --- a/src/syscall/mod.rs +++ b/src/syscall/mod.rs @@ -62,9 +62,9 @@ pub mod validate; fn nmi_t() -> Result{ println!("Yo"); - // unsafe { - // divide_by_zero(); - // } + unsafe { + crate::arch::interrupt::exception::divide_by_zero(); + } Ok(0) }