123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- //! Exception handlers.
- use core::arch::asm;
- use log::error;
- use psci::system_off;
- #[no_mangle]
- extern "C" fn sync_exception_current(_elr: u64, _spsr: u64) {
- error!("sync_exception_current");
- print_esr();
- system_off().unwrap();
- }
- #[no_mangle]
- extern "C" fn irq_current(_elr: u64, _spsr: u64) {
- error!("irq_current");
- system_off().unwrap();
- }
- #[no_mangle]
- extern "C" fn fiq_current(_elr: u64, _spsr: u64) {
- error!("fiq_current");
- system_off().unwrap();
- }
- #[no_mangle]
- extern "C" fn serr_current(_elr: u64, _spsr: u64) {
- error!("serr_current");
- print_esr();
- system_off().unwrap();
- }
- #[no_mangle]
- extern "C" fn sync_lower(_elr: u64, _spsr: u64) {
- error!("sync_lower");
- print_esr();
- system_off().unwrap();
- }
- #[no_mangle]
- extern "C" fn irq_lower(_elr: u64, _spsr: u64) {
- error!("irq_lower");
- system_off().unwrap();
- }
- #[no_mangle]
- extern "C" fn fiq_lower(_elr: u64, _spsr: u64) {
- error!("fiq_lower");
- system_off().unwrap();
- }
- #[no_mangle]
- extern "C" fn serr_lower(_elr: u64, _spsr: u64) {
- error!("serr_lower");
- print_esr();
- system_off().unwrap();
- }
- #[inline]
- fn print_esr() {
- let mut esr: u64;
- unsafe {
- asm!("mrs {esr}, esr_el1", esr = out(reg) esr);
- }
- log::error!("esr={:#08x}", esr);
- }
|