blob: f67a52462add582ea6a6f254985c34af1f0108a7 [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
17use crate::console::emergency_write_str;
18use crate::eprintln;
Andrew Walbrandfb73372022-04-21 10:52:27 +000019use core::arch::asm;
Andrew Walbran115b8e92022-04-07 17:10:17 +000020use psci::system_reset;
Andrew Walbrandfb73372022-04-21 10:52:27 +000021
22#[no_mangle]
23extern "C" fn sync_exception_current() {
24 emergency_write_str("sync_exception_current\n");
25 print_esr();
Andrew Walbran115b8e92022-04-07 17:10:17 +000026 system_reset().unwrap();
Andrew Walbrandfb73372022-04-21 10:52:27 +000027}
28
29#[no_mangle]
30extern "C" fn irq_current() {
31 emergency_write_str("irq_current\n");
Andrew Walbran115b8e92022-04-07 17:10:17 +000032 system_reset().unwrap();
Andrew Walbrandfb73372022-04-21 10:52:27 +000033}
34
35#[no_mangle]
36extern "C" fn fiq_current() {
37 emergency_write_str("fiq_current\n");
Andrew Walbran115b8e92022-04-07 17:10:17 +000038 system_reset().unwrap();
Andrew Walbrandfb73372022-04-21 10:52:27 +000039}
40
41#[no_mangle]
42extern "C" fn serr_current() {
43 emergency_write_str("serr_current\n");
44 print_esr();
Andrew Walbran115b8e92022-04-07 17:10:17 +000045 system_reset().unwrap();
Andrew Walbrandfb73372022-04-21 10:52:27 +000046}
47
48#[no_mangle]
49extern "C" fn sync_lower() {
50 emergency_write_str("sync_lower\n");
51 print_esr();
Andrew Walbran115b8e92022-04-07 17:10:17 +000052 system_reset().unwrap();
Andrew Walbrandfb73372022-04-21 10:52:27 +000053}
54
55#[no_mangle]
56extern "C" fn irq_lower() {
57 emergency_write_str("irq_lower\n");
Andrew Walbran115b8e92022-04-07 17:10:17 +000058 system_reset().unwrap();
Andrew Walbrandfb73372022-04-21 10:52:27 +000059}
60
61#[no_mangle]
62extern "C" fn fiq_lower() {
63 emergency_write_str("fiq_lower\n");
Andrew Walbran115b8e92022-04-07 17:10:17 +000064 system_reset().unwrap();
Andrew Walbrandfb73372022-04-21 10:52:27 +000065}
66
67#[no_mangle]
68extern "C" fn serr_lower() {
69 emergency_write_str("serr_lower\n");
70 print_esr();
Andrew Walbran115b8e92022-04-07 17:10:17 +000071 system_reset().unwrap();
Andrew Walbrandfb73372022-04-21 10:52:27 +000072}
73
74#[inline]
75fn print_esr() {
76 let mut esr: u64;
77 unsafe {
78 asm!("mrs {esr}, esr_el1", esr = out(reg) esr);
79 }
80 eprintln!("esr={:#08x}", esr);
81}