From 1e12ccddb38ef9d2ed57659d897b5225b237dd90 Mon Sep 17 00:00:00 2001 From: Garen Tyler Date: Thu, 9 Nov 2023 18:56:39 -0700 Subject: [PATCH] arch power --- kernel/rustkernel/src/arch/mod.rs | 1 + kernel/rustkernel/src/arch/power.rs | 4 ++++ kernel/rustkernel/src/arch/riscv/memlayout.rs | 3 --- kernel/rustkernel/src/arch/riscv/mod.rs | 1 + kernel/rustkernel/src/arch/riscv/power.rs | 8 ++++++++ kernel/rustkernel/src/mem/virtual_memory.rs | 11 +++++++++-- kernel/rustkernel/src/syscall.rs | 8 ++------ 7 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 kernel/rustkernel/src/arch/power.rs create mode 100644 kernel/rustkernel/src/arch/riscv/power.rs diff --git a/kernel/rustkernel/src/arch/mod.rs b/kernel/rustkernel/src/arch/mod.rs index 632c9a7..862ad7a 100644 --- a/kernel/rustkernel/src/arch/mod.rs +++ b/kernel/rustkernel/src/arch/mod.rs @@ -2,3 +2,4 @@ pub mod riscv; pub mod interrupt; +pub mod power; diff --git a/kernel/rustkernel/src/arch/power.rs b/kernel/rustkernel/src/arch/power.rs new file mode 100644 index 0000000..a4eeaef --- /dev/null +++ b/kernel/rustkernel/src/arch/power.rs @@ -0,0 +1,4 @@ +//! Architecture-agnostic power handling. + +#[cfg(target_arch = "riscv64")] +pub use super::riscv::power::shutdown; diff --git a/kernel/rustkernel/src/arch/riscv/memlayout.rs b/kernel/rustkernel/src/arch/riscv/memlayout.rs index 64901fb..8758457 100644 --- a/kernel/rustkernel/src/arch/riscv/memlayout.rs +++ b/kernel/rustkernel/src/arch/riscv/memlayout.rs @@ -18,9 +18,6 @@ use super::{MAXVA, PGSIZE}; -// QEMU test interface. Used for power off and on. -pub const QEMU_POWER: u64 = 0x100000u64; - // QEMU puts UART registers here in physical memory. pub const UART0: usize = 0x10000000; pub const UART0_IRQ: usize = 10; diff --git a/kernel/rustkernel/src/arch/riscv/mod.rs b/kernel/rustkernel/src/arch/riscv/mod.rs index c982135..d5866eb 100644 --- a/kernel/rustkernel/src/arch/riscv/mod.rs +++ b/kernel/rustkernel/src/arch/riscv/mod.rs @@ -2,6 +2,7 @@ pub mod asm; pub mod clint; pub mod memlayout; pub mod plic; +pub mod power; pub mod start; pub use asm::*; diff --git a/kernel/rustkernel/src/arch/riscv/power.rs b/kernel/rustkernel/src/arch/riscv/power.rs new file mode 100644 index 0000000..116a141 --- /dev/null +++ b/kernel/rustkernel/src/arch/riscv/power.rs @@ -0,0 +1,8 @@ +/// QEMU test interface. Used for power off and on. +pub const QEMU_POWER: usize = 0x100000; + +pub unsafe fn shutdown() -> ! { + let qemu_power = QEMU_POWER as *mut u32; + qemu_power.write_volatile(0x5555u32); + unreachable!(); +} diff --git a/kernel/rustkernel/src/mem/virtual_memory.rs b/kernel/rustkernel/src/mem/virtual_memory.rs index 18450ec..255d71b 100644 --- a/kernel/rustkernel/src/mem/virtual_memory.rs +++ b/kernel/rustkernel/src/mem/virtual_memory.rs @@ -1,9 +1,10 @@ use crate::{ arch::riscv::{ asm, make_satp, - memlayout::{KERNBASE, PHYSTOP, QEMU_POWER, TRAMPOLINE, UART0, VIRTIO0}, + memlayout::{KERNBASE, PHYSTOP, TRAMPOLINE, UART0, VIRTIO0}, pg_round_down, pg_round_up, plic::PLIC, + power::QEMU_POWER, pte2pa, Pagetable, PagetableEntry, MAXVA, PGSIZE, PTE_R, PTE_U, PTE_V, PTE_W, PTE_X, }, mem::{ @@ -30,7 +31,13 @@ pub unsafe fn kvmmake() -> Pagetable { memset(pagetable.cast(), 0, PGSIZE as u32); // QEMU test interface used for power management. - kvmmap(pagetable, QEMU_POWER, QEMU_POWER, PGSIZE, PTE_R | PTE_W); + kvmmap( + pagetable, + QEMU_POWER as u64, + QEMU_POWER as u64, + PGSIZE, + PTE_R | PTE_W, + ); // UART registers kvmmap(pagetable, UART0 as u64, UART0 as u64, PGSIZE, PTE_R | PTE_W); diff --git a/kernel/rustkernel/src/syscall.rs b/kernel/rustkernel/src/syscall.rs index 73a313f..ecae1de 100644 --- a/kernel/rustkernel/src/syscall.rs +++ b/kernel/rustkernel/src/syscall.rs @@ -1,5 +1,5 @@ use crate::{ - arch::riscv::memlayout::QEMU_POWER, + arch::power::shutdown, fs::{ self, file::{self, File}, @@ -200,11 +200,7 @@ impl Syscall { -1i64 as u64 } } - Syscall::Shutdown => { - let qemu_power = QEMU_POWER as usize as *mut u32; - qemu_power.write_volatile(0x5555u32); - panic!("shutdown"); - } + Syscall::Shutdown => unsafe { shutdown() }, } } }