mirror of
https://github.com/rcore-os/rCore.git
synced 2024-11-23 08:26:17 +04:00
Add Invalid Opcode handler. Set rsp when going to user.
This commit is contained in:
parent
40b02c33cb
commit
9723d7c1a3
@ -14,6 +14,7 @@ pub fn init() {
|
||||
idt[T_BRKPT].set_handler_fn(breakpoint);
|
||||
idt[T_PGFLT].set_handler_fn(page_fault);
|
||||
idt[T_GPFLT].set_handler_fn(general_protection_fault);
|
||||
idt[T_ILLOP].set_handler_fn(invalid_opcode);
|
||||
idt[T_IRQ0 + IRQ_COM1].set_handler_fn(com1);
|
||||
idt[T_IRQ0 + IRQ_COM2].set_handler_fn(com2);
|
||||
idt[T_IRQ0 + IRQ_KBD].set_handler_fn(keyboard);
|
||||
|
@ -28,6 +28,12 @@ interrupt_error_p!(general_protection_fault, stack, {
|
||||
loop {}
|
||||
});
|
||||
|
||||
interrupt_stack_p!(invalid_opcode, stack, {
|
||||
println!("\nEXCEPTION: Invalid Opcode");
|
||||
stack.dump();
|
||||
loop {}
|
||||
});
|
||||
|
||||
#[cfg(feature = "use_apic")]
|
||||
use arch::driver::apic::ack;
|
||||
#[cfg(not(feature = "use_apic"))]
|
||||
|
@ -336,16 +336,18 @@ macro_rules! interrupt_switch {
|
||||
let mut rsp: usize;
|
||||
asm!("" : "={rsp}"(rsp) : : : "intel", "volatile");
|
||||
|
||||
// Map kernel
|
||||
// $crate::arch::x86_64::pti::map();
|
||||
|
||||
// Call inner rust function
|
||||
inner(&mut rsp);
|
||||
|
||||
asm!("" : : "{rsp}"(rsp) : : "intel", "volatile");
|
||||
// Set return rsp if to user
|
||||
use arch::gdt;
|
||||
use core::mem::size_of;
|
||||
let tf = &mut *(rsp as *mut TrapFrame);
|
||||
if tf.iret.cs == gdt::UCODE_SELECTOR.0 as usize {
|
||||
gdt::set_ring0_rsp(rsp + size_of::<TrapFrame>());
|
||||
}
|
||||
|
||||
// Unmap kernel
|
||||
// $crate::arch::x86_64::pti::unmap();
|
||||
asm!("" : : "{rsp}"(rsp) : : "intel", "volatile");
|
||||
|
||||
// Pop scratch registers and return
|
||||
fs_pop!();
|
||||
|
Loading…
Reference in New Issue
Block a user