proper stack printing

This commit is contained in:
vandechat96
2023-05-24 22:40:25 +02:00
parent 217844a180
commit 42bee30d5b
2 changed files with 50 additions and 39 deletions

View File

@@ -61,7 +61,7 @@ nmi_handler!(non_maskable, |stack| {
// mov rdx, [0xDEADC0DE]
// ");
//loop{}
loop{}
let time = realtime();
println!("Exiting NMI inner: {}", time);

View File

@@ -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),