Fix stack trace, WIP usermode
This commit is contained in:
parent
eab03299be
commit
f45958f449
5 changed files with 59 additions and 10 deletions
|
@ -1,7 +1,8 @@
|
|||
use super::halt;
|
||||
use super::{halt, stack_trace};
|
||||
|
||||
interrupt!(divide_by_zero, {
|
||||
print!("Divide by zero fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
|
@ -23,75 +24,90 @@ interrupt!(overflow, {
|
|||
|
||||
interrupt!(bound_range, {
|
||||
print!("Bound range exceeded fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
interrupt!(invalid_opcode, {
|
||||
print!("Invalid opcode fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
interrupt!(device_not_available, {
|
||||
print!("Device not available fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
interrupt_error!(double_fault, {
|
||||
print!("Double fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
interrupt_error!(invalid_tss, {
|
||||
print!("Invalid TSS fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
interrupt_error!(segment_not_present, {
|
||||
print!("Segment not present fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
interrupt_error!(stack_segment, {
|
||||
print!("Stack segment fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
interrupt_error!(protection, {
|
||||
print!("Protection fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
interrupt_error!(page, {
|
||||
print!("Page fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
interrupt!(fpu, {
|
||||
print!("FPU floating point fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
interrupt_error!(alignment_check, {
|
||||
print!("Alignment check fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
interrupt!(machine_check, {
|
||||
print!("Machine check fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
interrupt!(simd, {
|
||||
print!("SIMD floating point fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
interrupt!(virtualization, {
|
||||
print!("Virtualization fault\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
||||
interrupt_error!(security, {
|
||||
print!("Security exception\n");
|
||||
stack_trace();
|
||||
loop { halt(); }
|
||||
});
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
//! Interrupt instructions
|
||||
|
||||
use core::mem;
|
||||
|
||||
use paging::{ActivePageTable, VirtualAddress};
|
||||
|
||||
pub mod exception;
|
||||
pub mod irq;
|
||||
pub mod syscall;
|
||||
|
@ -46,12 +50,15 @@ pub unsafe fn stack_trace() {
|
|||
|
||||
println!("TRACE: {:>016X}", rbp);
|
||||
//Maximum 64 frames
|
||||
let active_table = ActivePageTable::new();
|
||||
for _frame in 0..64 {
|
||||
let rip = *(rbp as *const usize).offset(1);
|
||||
println!(" {:>016X}: {:>016X}", rbp, rip);
|
||||
if rip == 0 {
|
||||
if active_table.translate(VirtualAddress::new(rbp)).is_some() && active_table.translate(VirtualAddress::new(rbp + mem::size_of::<usize>())).is_some() {
|
||||
let rip = *(rbp as *const usize).offset(1);
|
||||
println!(" {:>016X}: {:>016X}", rbp, rip);
|
||||
rbp = *(rbp as *const usize);
|
||||
} else {
|
||||
println!(" {:>016X}: GUARD PAGE", rbp);
|
||||
break;
|
||||
}
|
||||
rbp = *(rbp as *const usize);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue