blob: 42f4c3b396b7eb89a39230b4a45899cee5481f96 [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
Jakob Vukalovicc9afb512023-03-30 16:04:32 +000017use crate::{helpers::page_4kb_of, read_sysreg};
Pierre-Clément Tosida4440a2022-08-22 18:06:32 +010018use vmbase::console;
Andrew Walbrandd74b902022-04-14 16:12:50 +000019use vmbase::{console::emergency_write_str, eprintln, power::reboot};
Andrew Walbrandfb73372022-04-21 10:52:27 +000020
Jakob Vukalovicc9afb512023-03-30 16:04:32 +000021const ESR_32BIT_EXT_DABT: usize = 0x96000010;
Pierre-Clément Tosi446136e2022-10-19 10:10:42 +010022const UART_PAGE: usize = page_4kb_of(console::BASE_ADDRESS);
Pierre-Clément Tosida4440a2022-08-22 18:06:32 +010023
Andrew Walbrandfb73372022-04-21 10:52:27 +000024#[no_mangle]
Pierre-Clément Tosi8cbd4b72022-08-11 13:59:31 +010025extern "C" fn sync_exception_current(_elr: u64, _spsr: u64) {
Jakob Vukalovicc9afb512023-03-30 16:04:32 +000026 let esr = read_sysreg!("esr_el1");
27 let far = read_sysreg!("far_el1");
Pierre-Clément Tosida4440a2022-08-22 18:06:32 +010028 // Don't print to the UART if we're handling the exception it could raise.
Jakob Vukalovicc9afb512023-03-30 16:04:32 +000029 if esr != ESR_32BIT_EXT_DABT || page_4kb_of(far) != UART_PAGE {
Pierre-Clément Tosida4440a2022-08-22 18:06:32 +010030 emergency_write_str("sync_exception_current\n");
Jakob Vukalovicc9afb512023-03-30 16:04:32 +000031 eprintln!("esr={esr:#08x}");
Pierre-Clément Tosida4440a2022-08-22 18:06:32 +010032 }
Andrew Walbrandd74b902022-04-14 16:12:50 +000033 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000034}
35
36#[no_mangle]
Pierre-Clément Tosi8cbd4b72022-08-11 13:59:31 +010037extern "C" fn irq_current(_elr: u64, _spsr: u64) {
Andrew Walbrandfb73372022-04-21 10:52:27 +000038 emergency_write_str("irq_current\n");
Andrew Walbrandd74b902022-04-14 16:12:50 +000039 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000040}
41
42#[no_mangle]
Pierre-Clément Tosi8cbd4b72022-08-11 13:59:31 +010043extern "C" fn fiq_current(_elr: u64, _spsr: u64) {
Andrew Walbrandfb73372022-04-21 10:52:27 +000044 emergency_write_str("fiq_current\n");
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 serr_current(_elr: u64, _spsr: u64) {
Jakob Vukalovicc9afb512023-03-30 16:04:32 +000050 let esr = read_sysreg!("esr_el1");
Andrew Walbrandfb73372022-04-21 10:52:27 +000051 emergency_write_str("serr_current\n");
Jakob Vukalovicc9afb512023-03-30 16:04:32 +000052 eprintln!("esr={esr:#08x}");
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 sync_lower(_elr: u64, _spsr: u64) {
Jakob Vukalovicc9afb512023-03-30 16:04:32 +000058 let esr = read_sysreg!("esr_el1");
Andrew Walbrandfb73372022-04-21 10:52:27 +000059 emergency_write_str("sync_lower\n");
Jakob Vukalovicc9afb512023-03-30 16:04:32 +000060 eprintln!("esr={esr:#08x}");
Andrew Walbrandd74b902022-04-14 16:12:50 +000061 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000062}
63
64#[no_mangle]
Pierre-Clément Tosi8cbd4b72022-08-11 13:59:31 +010065extern "C" fn irq_lower(_elr: u64, _spsr: u64) {
Andrew Walbrandfb73372022-04-21 10:52:27 +000066 emergency_write_str("irq_lower\n");
Andrew Walbrandd74b902022-04-14 16:12:50 +000067 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000068}
69
70#[no_mangle]
Pierre-Clément Tosi8cbd4b72022-08-11 13:59:31 +010071extern "C" fn fiq_lower(_elr: u64, _spsr: u64) {
Andrew Walbrandfb73372022-04-21 10:52:27 +000072 emergency_write_str("fiq_lower\n");
Andrew Walbrandd74b902022-04-14 16:12:50 +000073 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000074}
75
76#[no_mangle]
Pierre-Clément Tosi8cbd4b72022-08-11 13:59:31 +010077extern "C" fn serr_lower(_elr: u64, _spsr: u64) {
Jakob Vukalovicc9afb512023-03-30 16:04:32 +000078 let esr = read_sysreg!("esr_el1");
Andrew Walbrandfb73372022-04-21 10:52:27 +000079 emergency_write_str("serr_lower\n");
Jakob Vukalovicc9afb512023-03-30 16:04:32 +000080 eprintln!("esr={esr:#08x}");
Andrew Walbrandd74b902022-04-14 16:12:50 +000081 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000082}