correct nmi handler / map page on pagefault (temp sol)
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
use syscall::Scheme;
|
||||
use crate::{
|
||||
interrupt::stack_trace,
|
||||
ptrace,
|
||||
@@ -6,6 +7,7 @@ use crate::{
|
||||
interrupt_stack,
|
||||
interrupt_error,
|
||||
};
|
||||
use crate::scheme::memory::MemoryScheme;
|
||||
|
||||
extern {
|
||||
fn ksignal(signal: usize);
|
||||
@@ -13,6 +15,8 @@ extern {
|
||||
|
||||
interrupt_stack!(divide_by_zero, |stack| {
|
||||
println!("Divide by zero");
|
||||
const ADDR: usize = 0xDEADC0DE;
|
||||
println!("value {}", unsafe { (ADDR as *const u8).read_volatile() });
|
||||
stack.dump();
|
||||
stack_trace();
|
||||
ksignal(SIGFPE);
|
||||
@@ -144,8 +148,17 @@ interrupt_error!(page, |stack| {
|
||||
println!(" Instruction fetch: {}", stack.code & 1 << 4 != 0);
|
||||
stack.dump();
|
||||
stack_trace();
|
||||
ksignal(SIGSEGV);
|
||||
loop{};
|
||||
// ksignal(SIGSEGV);
|
||||
|
||||
use crate::arch::paging::PAGE_SIZE;
|
||||
use crate::syscall::data::Map;
|
||||
|
||||
let aligned_addr: usize = cr2 / PAGE_SIZE * PAGE_SIZE;
|
||||
println!("{:x?}",aligned_addr);
|
||||
let map = Map { offset: 0, address: aligned_addr, size: PAGE_SIZE, flags: MapFlags::MAP_FIXED_NOREPLACE | MapFlags::MAP_PRIVATE | MapFlags::PROT_READ | MapFlags::PROT_WRITE };
|
||||
// let _ = syscall::fmap(!0, &map).expect("failed to re-map address");
|
||||
let _ = MemoryScheme.fmap(!0, &map ).expect("IDK") ;
|
||||
//loop{}
|
||||
});
|
||||
|
||||
interrupt_stack!(fpu_fault, |stack| {
|
||||
|
||||
@@ -443,8 +443,8 @@ macro_rules! interrupt_stack {
|
||||
pop_scratch!(),
|
||||
|
||||
$rstor1!(),
|
||||
"
|
||||
// call {p2}
|
||||
"
|
||||
//call {p2}
|
||||
",
|
||||
"iretq\n",
|
||||
),
|
||||
@@ -489,8 +489,8 @@ macro_rules! nmi_handler {
|
||||
}
|
||||
core::arch::asm!(concat!(
|
||||
"
|
||||
//call {frsp}
|
||||
push rdx
|
||||
// replace test come from kernel
|
||||
cmp QWORD PTR [rsp + 8*2], {GDT_KERNEL_CODE}
|
||||
jne first_nmi
|
||||
",
|
||||
@@ -502,7 +502,7 @@ macro_rules! nmi_handler {
|
||||
// if nmi stack
|
||||
"
|
||||
lea rdx, [rsp + 6*8]
|
||||
cmp 4*8[rsp], rdx
|
||||
cmp [rsp + 4*8], rdx
|
||||
ja first_nmi
|
||||
",
|
||||
// nested nmi
|
||||
@@ -519,9 +519,9 @@ macro_rules! nmi_handler {
|
||||
// prepare
|
||||
"
|
||||
1:
|
||||
lea rdx, -1*8[rsp]
|
||||
lea rdx, [rsp - 8]
|
||||
mov rsp, rdx
|
||||
lea rdx, -10*8[rsp]
|
||||
lea rdx, [rsp - 10*8]
|
||||
push {GDT_KERNEL_DATA}
|
||||
push rdx
|
||||
pushf
|
||||
@@ -567,7 +567,7 @@ macro_rules! nmi_handler {
|
||||
"
|
||||
end_repeat_nmi:
|
||||
",
|
||||
swapgs_iff_ring3_fast!(),
|
||||
swapgs_iff_ring3_fast!(),
|
||||
"
|
||||
push rax
|
||||
",
|
||||
@@ -578,14 +578,15 @@ macro_rules! nmi_handler {
|
||||
mov rdi,rsp
|
||||
call {inner}
|
||||
",
|
||||
// restore_gbase_paranoid!(),
|
||||
// restore_gsbase_paranoid!(),
|
||||
pop_preserved!(),
|
||||
pop_scratch!(),
|
||||
swapgs_iff_ring3_fast!(),
|
||||
// remove extra frames and reset nmi exec var
|
||||
"
|
||||
//call {frsp}
|
||||
7:
|
||||
add rsp,$(6*8)
|
||||
add rsp,$(12*8)
|
||||
|
||||
mov QWORD PTR 5*8[rsp], $0
|
||||
|
||||
@@ -600,6 +601,12 @@ macro_rules! nmi_handler {
|
||||
GDT_KERNEL_CODE = const(crate::gdt::GDT_KERNEL_CODE),
|
||||
GDT_KERNEL_DATA = const(crate::gdt::GDT_KERNEL_DATA),
|
||||
|
||||
// IA32_GS_BASE = const(x86::msr::IA32_GS_BASE),
|
||||
// KERNEL_PERCPU_SHIFT = const(crate::KERNEL_PERCPU_SHIFT),
|
||||
// KERNEL_PERCPU_OFFSET = const(crate::KERNEL_PERCPU_OFFSET),
|
||||
//
|
||||
// gdt_cpu_id_offset = const(crate::gdt::GDT_CPU_ID_CONTAINER * core::mem::size_of::<crate::gdt::GdtEntry>()),
|
||||
|
||||
options(noreturn),
|
||||
|
||||
);
|
||||
@@ -672,8 +679,11 @@ macro_rules! interrupt_error {
|
||||
$code
|
||||
}
|
||||
}
|
||||
|
||||
fn hello(){
|
||||
println!("hello int");
|
||||
}
|
||||
core::arch::asm!(concat!(
|
||||
//"call {hello}\n",
|
||||
swapgs_iff_ring3_fast_errorcode!(),
|
||||
// Move rax into code's place, put code in last instead (to be
|
||||
// compatible with InterruptStack)
|
||||
@@ -711,6 +721,7 @@ macro_rules! interrupt_error {
|
||||
),
|
||||
|
||||
inner = sym inner,
|
||||
hello = sym hello,
|
||||
|
||||
options(noreturn));
|
||||
}
|
||||
|
||||
@@ -62,9 +62,9 @@ pub mod validate;
|
||||
|
||||
fn nmi_t() -> Result<usize>{
|
||||
println!("Yo");
|
||||
// unsafe {
|
||||
// divide_by_zero();
|
||||
// }
|
||||
unsafe {
|
||||
crate::arch::interrupt::exception::divide_by_zero();
|
||||
}
|
||||
Ok(0)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user