From 2f6e3c118742426da643687f0448a2b0ff4cadc9 Mon Sep 17 00:00:00 2001 From: jika Date: Fri, 5 May 2023 18:32:22 +0200 Subject: [PATCH] print rsp in nmi / loop end fault page --- src/arch/x86_64/interrupt/exception.rs | 4 ++++ src/arch/x86_64/interrupt/handler.rs | 13 +++++++++++-- src/syscall/mod.rs | 1 - 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/arch/x86_64/interrupt/exception.rs b/src/arch/x86_64/interrupt/exception.rs index cf35828..2cf1fdc 100644 --- a/src/arch/x86_64/interrupt/exception.rs +++ b/src/arch/x86_64/interrupt/exception.rs @@ -43,6 +43,9 @@ 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(); }); @@ -142,6 +145,7 @@ interrupt_error!(page, |stack| { stack.dump(); stack_trace(); ksignal(SIGSEGV); + 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 9604770..27991be 100644 --- a/src/arch/x86_64/interrupt/handler.rs +++ b/src/arch/x86_64/interrupt/handler.rs @@ -480,7 +480,13 @@ macro_rules! nmi_handler { $ code } } - + fn frsp(){ + unsafe { + let rsp: usize; + core::arch::asm!("mov {}, rsp", out(reg) rsp); + println!("FRSP: {:>016X}", rsp); + } + } core::arch::asm!(concat!( " push rdx @@ -577,17 +583,20 @@ macro_rules! nmi_handler { pop_scratch!(), swapgs_iff_ring3_fast!(), " + //call {frsp} 7: - add rsp,$6*8 + add rsp,$(6*8) mov QWORD PTR 5*8[rsp], $0 + //call {frsp} iretq ", ), inner = sym inner, + frsp = sym frsp, GDT_KERNEL_CODE = const(crate::gdt::GDT_KERNEL_CODE), GDT_KERNEL_DATA = const(crate::gdt::GDT_KERNEL_DATA), diff --git a/src/syscall/mod.rs b/src/syscall/mod.rs index 3f4df68..e43a060 100644 --- a/src/syscall/mod.rs +++ b/src/syscall/mod.rs @@ -33,7 +33,6 @@ use self::flag::{MapFlags, PhysmapFlags, WaitFlags}; use self::number::*; use crate::context::ContextId; -use crate::interrupt::exception::divide_by_zero; use crate::interrupt::InterruptStack; use crate::scheme::{FileHandle, SchemeNamespace, memory::MemoryScheme};