proper stack printing
This commit is contained in:
@@ -61,7 +61,7 @@ nmi_handler!(non_maskable, |stack| {
|
||||
// mov rdx, [0xDEADC0DE]
|
||||
// ");
|
||||
|
||||
//loop{}
|
||||
loop{}
|
||||
|
||||
let time = realtime();
|
||||
println!("Exiting NMI inner: {}", time);
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user