correct nmi handler / map page on pagefault (temp sol)

This commit is contained in:
vandechat96
2023-05-10 23:28:02 +02:00
parent 2f6e3c1187
commit db916dd9d5
3 changed files with 39 additions and 15 deletions

View File

@@ -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| {

View File

@@ -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));
}

View File

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