diff --git a/src/arch/x86_64/interrupt/exception.rs b/src/arch/x86_64/interrupt/exception.rs index 40916a0..8819ea7 100644 --- a/src/arch/x86_64/interrupt/exception.rs +++ b/src/arch/x86_64/interrupt/exception.rs @@ -61,7 +61,7 @@ nmi_handler!(non_maskable, |stack| { // mov rdx, [0xDEADC0DE] // "); - //loop{} + loop{} let time = realtime(); println!("Exiting NMI inner: {}", time); diff --git a/src/arch/x86_64/interrupt/handler.rs b/src/arch/x86_64/interrupt/handler.rs index bd58218..d1ee151 100644 --- a/src/arch/x86_64/interrupt/handler.rs +++ b/src/arch/x86_64/interrupt/handler.rs @@ -452,6 +452,35 @@ macro_rules! interrupt_stack { ($name:ident, |$stack:ident| $code:block) => { interrupt_stack!($name, swapgs_iff_ring3_fast!, nop!, nop!, swapgs_iff_ring3_fast!, is_paranoid: false, |$stack| $code); }; ($name:ident, @paranoid, |$stack:ident| $code:block) => { interrupt_stack!($name, nop!, save_and_set_gsbase_paranoid!, restore_gsbase_paranoid!, nop!, is_paranoid: true, |$stack| $code); } } + +macro_rules! print_stack { + () => { " + mov rdi, [rsp + 8*5] + call {printV} + mov rdi, [rsp + 8*4] + call {printV} + mov rdi, [rsp + 8*3] + call {printV} + mov rdi, [rsp + 8*2] + call {printV} + mov rdi, [rsp + 8] + call {printV} + mov rdi, [rsp] + call {printV} + mov rdi, [rsp - 8] + call {printV} + mov rdi, [rsp - 8*2] + call {printV} + mov rdi, [rsp - 8*3] + call {printV} + mov rdi, [rsp - 8*4] + call {printV} + mov rdi, [rsp - 8*5] + call {printV} + " + } +} + #[macro_export] macro_rules! nmi_handler { ($name:ident, |$stack:ident| $code:block) => { @@ -468,45 +497,19 @@ macro_rules! nmi_handler { fn hnmi(){ println!("-> Handler NMI"); } - fn pstack(){ + unsafe extern "C" fn printV() { unsafe{ - + core::arch::asm!(" + mov rbx, rdi + "); let mut var: usize; - core::arch::asm!("mov {}, [rsp + 6*8]", out(reg) var); - println!("rsp 6*8: {:016x}",var); - core::arch::asm!("mov {}, [rsp + 5*8]", out(reg) var); - println!("rsp 5*8: {:016x}",var); - core::arch::asm!("mov {}, [rsp + 4*8]", out(reg) var); - println!("rsp 4*8: {:016x}",var); - core::arch::asm!("mov {}, [rsp + 3*8]", out(reg) var); - println!("rsp 3*8: {:016x}",var); - core::arch::asm!("mov {}, [rsp + 2*8]", out(reg) var); - println!("rsp 2*8: {:016x}",var); - core::arch::asm!("mov {}, [rsp + 1*8]", out(reg) var); - println!("rsp 1*8: {:016x}",var); - core::arch::asm!("mov {}, [rsp]", out(reg) var); - println!("rsp 0*8: {:016x}",var); - core::arch::asm!("mov {}, [rsp - 1*8]", out(reg) var); - println!("rsp -1*8: {:016x}",var); - core::arch::asm!("mov {}, [rsp - 2*8]", out(reg) var); - println!("rsp -2*8: {:016x}",var); - core::arch::asm!("mov {}, [rsp - 3*8]", out(reg) var); - println!("rsp -3*8: {:016x}",var); - core::arch::asm!("mov {}, [rsp - 4*8]", out(reg) var); - println!("rsp -4*8: {:016x}",var); - core::arch::asm!("mov {}, [rsp - 5*8]", out(reg) var); - println!("rsp -5*8: {:016x}",var); - core::arch::asm!("mov {}, rdx", out(reg) var); - println!("rdx {:016x}",var); - - + core::arch::asm!("mov {}, rbx", out(reg) var); + println!("val: {:016x}",var); } } fn vnmi(){ unsafe{ - let var: usize; - core::arch::asm!("mov {}, [rsp - 1*8]", out(reg) var); - println!("-> Var NMI: {:016x}",var); + println!("-> Var NMI"); } } fn fnmi(){ @@ -520,16 +523,21 @@ macro_rules! nmi_handler { } core::arch::asm!(concat!( " - push rdx call {hnmi} - call {pstack} - call {vnmi} + ", + print_stack!(), + " + push rdx + cmp QWORD PTR [rsp + 8*2], {GDT_KERNEL_CODE} jne first_nmi ", // not from user space " call {vnmi} + mov rdi, [rsp - 8] + call {printV} + cmp QWORD PTR [rsp - 8], $1 je nested_nmi ", @@ -577,6 +585,7 @@ macro_rules! nmi_handler { push $1 call {fnmi} ", + print_stack!(), // first copy (saved) " sub rsp, $(5*8) @@ -624,7 +633,9 @@ macro_rules! nmi_handler { mov QWORD PTR [rsp + 5*8], $0 call {onmi} - call {pstack} + ", + print_stack!(), + " iretq ", @@ -638,7 +649,7 @@ macro_rules! nmi_handler { fnmi = sym fnmi, nnmi = sym nnmi, onmi = sym onmi, - pstack = sym pstack, + printV = sym printV, GDT_KERNEL_CODE = const(crate::gdt::GDT_KERNEL_CODE), GDT_KERNEL_DATA = const(crate::gdt::GDT_KERNEL_DATA),