arch power

This commit is contained in:
Garen Tyler 2023-11-09 18:56:39 -07:00
parent b64809e9b5
commit 1e12ccddb3
Signed by: garentyler
GPG Key ID: D7A048C454CB7054
7 changed files with 25 additions and 11 deletions

View File

@ -2,3 +2,4 @@
pub mod riscv; pub mod riscv;
pub mod interrupt; pub mod interrupt;
pub mod power;

View File

@ -0,0 +1,4 @@
//! Architecture-agnostic power handling.
#[cfg(target_arch = "riscv64")]
pub use super::riscv::power::shutdown;

View File

@ -18,9 +18,6 @@
use super::{MAXVA, PGSIZE}; 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. // QEMU puts UART registers here in physical memory.
pub const UART0: usize = 0x10000000; pub const UART0: usize = 0x10000000;
pub const UART0_IRQ: usize = 10; pub const UART0_IRQ: usize = 10;

View File

@ -2,6 +2,7 @@ pub mod asm;
pub mod clint; pub mod clint;
pub mod memlayout; pub mod memlayout;
pub mod plic; pub mod plic;
pub mod power;
pub mod start; pub mod start;
pub use asm::*; pub use asm::*;

View File

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

View File

@ -1,9 +1,10 @@
use crate::{ use crate::{
arch::riscv::{ arch::riscv::{
asm, make_satp, asm, make_satp,
memlayout::{KERNBASE, PHYSTOP, QEMU_POWER, TRAMPOLINE, UART0, VIRTIO0}, memlayout::{KERNBASE, PHYSTOP, TRAMPOLINE, UART0, VIRTIO0},
pg_round_down, pg_round_up, pg_round_down, pg_round_up,
plic::PLIC, plic::PLIC,
power::QEMU_POWER,
pte2pa, Pagetable, PagetableEntry, MAXVA, PGSIZE, PTE_R, PTE_U, PTE_V, PTE_W, PTE_X, pte2pa, Pagetable, PagetableEntry, MAXVA, PGSIZE, PTE_R, PTE_U, PTE_V, PTE_W, PTE_X,
}, },
mem::{ mem::{
@ -30,7 +31,13 @@ pub unsafe fn kvmmake() -> Pagetable {
memset(pagetable.cast(), 0, PGSIZE as u32); memset(pagetable.cast(), 0, PGSIZE as u32);
// QEMU test interface used for power management. // 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 // UART registers
kvmmap(pagetable, UART0 as u64, UART0 as u64, PGSIZE, PTE_R | PTE_W); kvmmap(pagetable, UART0 as u64, UART0 as u64, PGSIZE, PTE_R | PTE_W);

View File

@ -1,5 +1,5 @@
use crate::{ use crate::{
arch::riscv::memlayout::QEMU_POWER, arch::power::shutdown,
fs::{ fs::{
self, self,
file::{self, File}, file::{self, File},
@ -200,11 +200,7 @@ impl Syscall {
-1i64 as u64 -1i64 as u64
} }
} }
Syscall::Shutdown => { Syscall::Shutdown => unsafe { shutdown() },
let qemu_power = QEMU_POWER as usize as *mut u32;
qemu_power.write_volatile(0x5555u32);
panic!("shutdown");
}
} }
} }
} }