Use psci crate for PSCI calls.
Bug: 223166344
Test: Ran as unprotected VM bootloader under crosvm.
Change-Id: I8619f1b12fa63bcff581eeeb3ce3223b21cd793d
diff --git a/pvmfw/Android.bp b/pvmfw/Android.bp
index 5dbd4ec..3d77b2c 100644
--- a/pvmfw/Android.bp
+++ b/pvmfw/Android.bp
@@ -13,6 +13,7 @@
"libcore.rust_sysroot",
],
rustlibs: [
+ "libpsci",
"libspin_nostd",
],
enabled: false,
diff --git a/pvmfw/src/exceptions.rs b/pvmfw/src/exceptions.rs
index 2bdcf9c..f67a524 100644
--- a/pvmfw/src/exceptions.rs
+++ b/pvmfw/src/exceptions.rs
@@ -16,59 +16,59 @@
use crate::console::emergency_write_str;
use crate::eprintln;
-use crate::psci::system_reset;
use core::arch::asm;
+use psci::system_reset;
#[no_mangle]
extern "C" fn sync_exception_current() {
emergency_write_str("sync_exception_current\n");
print_esr();
- system_reset();
+ system_reset().unwrap();
}
#[no_mangle]
extern "C" fn irq_current() {
emergency_write_str("irq_current\n");
- system_reset();
+ system_reset().unwrap();
}
#[no_mangle]
extern "C" fn fiq_current() {
emergency_write_str("fiq_current\n");
- system_reset();
+ system_reset().unwrap();
}
#[no_mangle]
extern "C" fn serr_current() {
emergency_write_str("serr_current\n");
print_esr();
- system_reset();
+ system_reset().unwrap();
}
#[no_mangle]
extern "C" fn sync_lower() {
emergency_write_str("sync_lower\n");
print_esr();
- system_reset();
+ system_reset().unwrap();
}
#[no_mangle]
extern "C" fn irq_lower() {
emergency_write_str("irq_lower\n");
- system_reset();
+ system_reset().unwrap();
}
#[no_mangle]
extern "C" fn fiq_lower() {
emergency_write_str("fiq_lower\n");
- system_reset();
+ system_reset().unwrap();
}
#[no_mangle]
extern "C" fn serr_lower() {
emergency_write_str("serr_lower\n");
print_esr();
- system_reset();
+ system_reset().unwrap();
}
#[inline]
diff --git a/pvmfw/src/main.rs b/pvmfw/src/main.rs
index d38b1e3..395c252 100644
--- a/pvmfw/src/main.rs
+++ b/pvmfw/src/main.rs
@@ -19,7 +19,6 @@
mod console;
mod exceptions;
-mod psci;
mod uart;
use core::panic::PanicInfo;
@@ -31,7 +30,7 @@
console::init();
println!("Hello world");
- system_off();
+ system_off().unwrap();
#[allow(clippy::empty_loop)]
loop {}
}
@@ -39,6 +38,6 @@
#[panic_handler]
fn panic(info: &PanicInfo) -> ! {
eprintln!("{}", info);
- system_reset();
+ system_reset().unwrap();
loop {}
}
diff --git a/pvmfw/src/psci.rs b/pvmfw/src/psci.rs
deleted file mode 100644
index 8dcbcaa..0000000
--- a/pvmfw/src/psci.rs
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2022, The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//! PSCI calls.
-
-const PSCI_SYSTEM_OFF: u32 = 0x84000008;
-const PSCI_SYSTEM_RESET: u32 = 0x84000009;
-const PSCI_SYSTEM_RESET2: u32 = 0x84000012;
-
-pub fn system_off() -> u32 {
- hvc32(PSCI_SYSTEM_OFF, 0, 0, 0, 0, 0, 0, 0)[0]
-}
-
-pub fn system_reset() -> u32 {
- hvc32(PSCI_SYSTEM_RESET, 0, 0, 0, 0, 0, 0, 0)[0]
-}
-
-#[allow(unused)]
-pub fn system_reset2(reset_type: u32, cookie: u32) -> u32 {
- hvc32(PSCI_SYSTEM_RESET2, reset_type, cookie, 0, 0, 0, 0, 0)[0]
-}
-
-/// Make an HVC32 call to the hypervisor, following the SMC Calling Convention version 1.3.
-#[inline(always)]
-#[allow(clippy::too_many_arguments)]
-fn hvc32(
- function: u32,
- arg1: u32,
- arg2: u32,
- arg3: u32,
- arg4: u32,
- arg5: u32,
- arg6: u32,
- arg7: u32,
-) -> [u32; 8] {
- let mut ret = [0; 8];
-
- #[cfg(target_arch = "aarch64")]
- unsafe {
- core::arch::asm!(
- "hvc #0",
- inout("w0") function => ret[0],
- inout("w1") arg1 => ret[1],
- inout("w2") arg2 => ret[2],
- inout("w3") arg3 => ret[3],
- inout("w4") arg4 => ret[4],
- inout("w5") arg5 => ret[5],
- inout("w6") arg6 => ret[6],
- inout("w7") arg7 => ret[7],
- options(nomem, nostack)
- )
- }
-
- #[cfg(not(target_arch = "aarch64"))]
- unimplemented!();
-
- ret
-}