blob: 61f7846394e71e305c66e4346b46483f32ebb7be [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]
21extern "C" fn sync_exception_current() {
22 emergency_write_str("sync_exception_current\n");
23 print_esr();
Andrew Walbrandd74b902022-04-14 16:12:50 +000024 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000025}
26
27#[no_mangle]
28extern "C" fn irq_current() {
29 emergency_write_str("irq_current\n");
Andrew Walbrandd74b902022-04-14 16:12:50 +000030 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000031}
32
33#[no_mangle]
34extern "C" fn fiq_current() {
35 emergency_write_str("fiq_current\n");
Andrew Walbrandd74b902022-04-14 16:12:50 +000036 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000037}
38
39#[no_mangle]
40extern "C" fn serr_current() {
41 emergency_write_str("serr_current\n");
42 print_esr();
Andrew Walbrandd74b902022-04-14 16:12:50 +000043 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000044}
45
46#[no_mangle]
47extern "C" fn sync_lower() {
48 emergency_write_str("sync_lower\n");
49 print_esr();
Andrew Walbrandd74b902022-04-14 16:12:50 +000050 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000051}
52
53#[no_mangle]
54extern "C" fn irq_lower() {
55 emergency_write_str("irq_lower\n");
Andrew Walbrandd74b902022-04-14 16:12:50 +000056 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000057}
58
59#[no_mangle]
60extern "C" fn fiq_lower() {
61 emergency_write_str("fiq_lower\n");
Andrew Walbrandd74b902022-04-14 16:12:50 +000062 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000063}
64
65#[no_mangle]
66extern "C" fn serr_lower() {
67 emergency_write_str("serr_lower\n");
68 print_esr();
Andrew Walbrandd74b902022-04-14 16:12:50 +000069 reboot();
Andrew Walbrandfb73372022-04-21 10:52:27 +000070}
71
72#[inline]
73fn print_esr() {
74 let mut esr: u64;
75 unsafe {
76 asm!("mrs {esr}, esr_el1", esr = out(reg) esr);
77 }
78 eprintln!("esr={:#08x}", esr);
79}