From fb08410cb53a17f40078a828173f091ad8d598a6 Mon Sep 17 00:00:00 2001 From: Yuhao Zhou Date: Sat, 6 Apr 2019 02:46:40 +0800 Subject: [PATCH] Fix paging bug. --- kernel/src/arch/mipsel/boot/linker.ld | 2 +- kernel/src/arch/mipsel/interrupt.rs | 7 +++++++ kernel/src/arch/mipsel/paging.rs | 9 ++++++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/kernel/src/arch/mipsel/boot/linker.ld b/kernel/src/arch/mipsel/boot/linker.ld index 7911721..0e4d0bb 100644 --- a/kernel/src/arch/mipsel/boot/linker.ld +++ b/kernel/src/arch/mipsel/boot/linker.ld @@ -15,9 +15,9 @@ SECTIONS .text : { stext = .; *(.text.entry) - *(.text .text.*) . = ALIGN(4K); *(.text.ebase) + *(.text .text.*) . = ALIGN(4K); etext = .; } diff --git a/kernel/src/arch/mipsel/interrupt.rs b/kernel/src/arch/mipsel/interrupt.rs index c87f223..abc0373 100644 --- a/kernel/src/arch/mipsel/interrupt.rs +++ b/kernel/src/arch/mipsel/interrupt.rs @@ -15,6 +15,7 @@ pub fn init() { unsafe { // Set the exception vector address cp0::ebase::write_u32(trap_entry as u32); + println!("Set ebase = {:x}", trap_entry as u32); let mut status = cp0::status::read(); // Enable IPI @@ -127,6 +128,10 @@ fn syscall(tf: &mut TrapFrame) { tf.v0 = ret as usize; } +extern { + static root_page_table_ptr : *mut usize; +} + fn page_fault(tf: &mut TrapFrame) { // TODO: set access/dirty bit let addr = tf.vaddr; @@ -135,4 +140,6 @@ fn page_fault(tf: &mut TrapFrame) { if !crate::memory::handle_page_fault(addr) { crate::trap::error(tf); } + + } diff --git a/kernel/src/arch/mipsel/paging.rs b/kernel/src/arch/mipsel/paging.rs index 3ea5a7a..772cea3 100644 --- a/kernel/src/arch/mipsel/paging.rs +++ b/kernel/src/arch/mipsel/paging.rs @@ -107,9 +107,12 @@ impl InactivePageTable for InactivePageTable0 { fn new_bare() -> Self { let target = alloc_frame().expect("failed to allocate frame"); let frame = Frame::of_addr(PhysAddr::new(target)); - active_table().with_temporary_map(target, |_, table: &mut MIPSPageTable| { - table.zero(); - }); + + let table = unsafe { + &mut *(target as *mut MIPSPageTable) + }; + + table.zero(); InactivePageTable0 { root_frame: frame } }