blob: 596ecc73870ad6a326f0a13c3a99bbf92a449d2b [file] [log] [blame]
Andrew Walbrandfb73372022-04-21 10:52:27 +00001// Copyright 2022, The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15//! Exception handlers.
16
Andrew Walbrandfb73372022-04-21 10:52:27 +000017use core::arch::asm;
Andrew Walbrandd74b902022-04-14 16:12:50 +000018use vmbase::{console::emergency_write_str, eprintln, power::reboot};
Andrew Walbrandfb73372022-04-21 10:52:27 +000019
20#[no_mangle]
Pierre-Clément Tosi8cbd4b72022-08-11 13:59:31 +010021extern "C" fn sync_exception_current(_elr: u64, _spsr: u64) {
Pierre-Clément Tosi94e9d602022-08-22 17:51:40 +010022 let esr = read_esr();
Andrew Walbrandfb73372022-04-21 10:52:27 +000023 emergency_write_str("sync_exception_current\n");
Pierre-Clément Tosi94e9d602022-08-22 17:51:40 +010024 print_esr(esr);
Andrew Walbrandd74b902022-04-14 16:12:50 +000025 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000026}
27
28#[no_mangle]
Pierre-Clément Tosi8cbd4b72022-08-11 13:59:31 +010029extern "C" fn irq_current(_elr: u64, _spsr: u64) {
Andrew Walbrandfb73372022-04-21 10:52:27 +000030 emergency_write_str("irq_current\n");
Andrew Walbrandd74b902022-04-14 16:12:50 +000031 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000032}
33
34#[no_mangle]
Pierre-Clément Tosi8cbd4b72022-08-11 13:59:31 +010035extern "C" fn fiq_current(_elr: u64, _spsr: u64) {
Andrew Walbrandfb73372022-04-21 10:52:27 +000036 emergency_write_str("fiq_current\n");
Andrew Walbrandd74b902022-04-14 16:12:50 +000037 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000038}
39
40#[no_mangle]
Pierre-Clément Tosi8cbd4b72022-08-11 13:59:31 +010041extern "C" fn serr_current(_elr: u64, _spsr: u64) {
Pierre-Clément Tosi94e9d602022-08-22 17:51:40 +010042 let esr = read_esr();
Andrew Walbrandfb73372022-04-21 10:52:27 +000043 emergency_write_str("serr_current\n");
Pierre-Clément Tosi94e9d602022-08-22 17:51:40 +010044 print_esr(esr);
Andrew Walbrandd74b902022-04-14 16:12:50 +000045 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000046}
47
48#[no_mangle]
Pierre-Clément Tosi8cbd4b72022-08-11 13:59:31 +010049extern "C" fn sync_lower(_elr: u64, _spsr: u64) {
Pierre-Clément Tosi94e9d602022-08-22 17:51:40 +010050 let esr = read_esr();
Andrew Walbrandfb73372022-04-21 10:52:27 +000051 emergency_write_str("sync_lower\n");
Pierre-Clément Tosi94e9d602022-08-22 17:51:40 +010052 print_esr(esr);
Andrew Walbrandd74b902022-04-14 16:12:50 +000053 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000054}
55
56#[no_mangle]
Pierre-Clément Tosi8cbd4b72022-08-11 13:59:31 +010057extern "C" fn irq_lower(_elr: u64, _spsr: u64) {
Andrew Walbrandfb73372022-04-21 10:52:27 +000058 emergency_write_str("irq_lower\n");
Andrew Walbrandd74b902022-04-14 16:12:50 +000059 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000060}
61
62#[no_mangle]
Pierre-Clément Tosi8cbd4b72022-08-11 13:59:31 +010063extern "C" fn fiq_lower(_elr: u64, _spsr: u64) {
Andrew Walbrandfb73372022-04-21 10:52:27 +000064 emergency_write_str("fiq_lower\n");
Andrew Walbrandd74b902022-04-14 16:12:50 +000065 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000066}
67
68#[no_mangle]
Pierre-Clément Tosi8cbd4b72022-08-11 13:59:31 +010069extern "C" fn serr_lower(_elr: u64, _spsr: u64) {
Pierre-Clément Tosi94e9d602022-08-22 17:51:40 +010070 let esr = read_esr();
Andrew Walbrandfb73372022-04-21 10:52:27 +000071 emergency_write_str("serr_lower\n");
Pierre-Clément Tosi94e9d602022-08-22 17:51:40 +010072 print_esr(esr);
Andrew Walbrandd74b902022-04-14 16:12:50 +000073 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000074}
75
76#[inline]
Pierre-Clément Tosi94e9d602022-08-22 17:51:40 +010077fn read_esr() -> u64 {
Andrew Walbrandfb73372022-04-21 10:52:27 +000078 let mut esr: u64;
79 unsafe {
80 asm!("mrs {esr}, esr_el1", esr = out(reg) esr);
81 }
Pierre-Clément Tosi94e9d602022-08-22 17:51:40 +010082 esr
83}
84
85#[inline]
86fn print_esr(esr: u64) {
Andrew Walbrandfb73372022-04-21 10:52:27 +000087 eprintln!("esr={:#08x}", esr);
88}