mirror of
https://github.com/panpaul/tiny_os
synced 2024-09-20 09:45:19 +08:00
fix: virt: lowlevel: test_device should translate address
This commit is contained in:
parent
32759ef037
commit
3b02a14aeb
@ -1,16 +1,26 @@
|
|||||||
use super::super::lowlevel::{ArchLL, ArchLLOps};
|
use super::super::lowlevel::{ArchLL, ArchLLOps};
|
||||||
use super::TEST_DEVICE;
|
use super::TEST_DEVICE;
|
||||||
|
use crate::arch::layout::mmap_phys_to_virt;
|
||||||
|
use crate::arch::vspace::is_kernel_pagetable_installed;
|
||||||
|
|
||||||
|
unsafe fn get_qemu_test_device() -> *mut u32 {
|
||||||
|
if is_kernel_pagetable_installed() {
|
||||||
|
return mmap_phys_to_virt(TEST_DEVICE.into()).into();
|
||||||
|
} else {
|
||||||
|
return TEST_DEVICE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl ArchLLOps for ArchLL {
|
impl ArchLLOps for ArchLL {
|
||||||
fn board_shutdown(failure: bool) {
|
fn board_shutdown(failure: bool) {
|
||||||
if failure {
|
if failure {
|
||||||
unsafe { TEST_DEVICE.write_volatile(0x0001_3333) }
|
unsafe { get_qemu_test_device().write_volatile(0x0001_3333) }
|
||||||
} else {
|
} else {
|
||||||
unsafe { TEST_DEVICE.write_volatile(0x0000_5555) }
|
unsafe { get_qemu_test_device().write_volatile(0x0000_5555) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn board_reset(_failure: bool) {
|
fn board_reset(_failure: bool) {
|
||||||
unsafe { TEST_DEVICE.write_volatile(0x0042_7777) }
|
unsafe { get_qemu_test_device().write_volatile(0x0042_7777) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -130,8 +130,14 @@ pub unsafe fn map(from: VirtAddr, to: PhysAddr, size: usize, attr: MapAttr) {
|
|||||||
map_range(pt, from, to, size, attr).expect("Failed to map memory");
|
map_range(pt, from, to, size, attr).expect("Failed to map memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn is_kernel_pagetable_installed() -> bool {
|
||||||
|
KERNEL_PAGETABLE.lock().is_some()
|
||||||
|
}
|
||||||
|
|
||||||
pub unsafe fn setup_kernel_paging() {
|
pub unsafe fn setup_kernel_paging() {
|
||||||
info!("Setting up kernel paging");
|
info!("Setting up kernel paging");
|
||||||
|
assert!(!is_kernel_pagetable_installed(), "Kernel pagetable already installed");
|
||||||
|
|
||||||
let root_pt = alloc_page();
|
let root_pt = alloc_page();
|
||||||
let kernel_pt = Table::new(root_pt.as_usize().into());
|
let kernel_pt = Table::new(root_pt.as_usize().into());
|
||||||
|
Loading…
Reference in New Issue
Block a user