exceptions.rs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. //! Exception handlers.
  2. use core::arch::asm;
  3. use log::error;
  4. use psci::system_off;
  5. #[no_mangle]
  6. extern "C" fn sync_exception_current(_elr: u64, _spsr: u64) {
  7. error!("sync_exception_current");
  8. print_esr();
  9. system_off().unwrap();
  10. }
  11. #[no_mangle]
  12. extern "C" fn irq_current(_elr: u64, _spsr: u64) {
  13. error!("irq_current");
  14. system_off().unwrap();
  15. }
  16. #[no_mangle]
  17. extern "C" fn fiq_current(_elr: u64, _spsr: u64) {
  18. error!("fiq_current");
  19. system_off().unwrap();
  20. }
  21. #[no_mangle]
  22. extern "C" fn serr_current(_elr: u64, _spsr: u64) {
  23. error!("serr_current");
  24. print_esr();
  25. system_off().unwrap();
  26. }
  27. #[no_mangle]
  28. extern "C" fn sync_lower(_elr: u64, _spsr: u64) {
  29. error!("sync_lower");
  30. print_esr();
  31. system_off().unwrap();
  32. }
  33. #[no_mangle]
  34. extern "C" fn irq_lower(_elr: u64, _spsr: u64) {
  35. error!("irq_lower");
  36. system_off().unwrap();
  37. }
  38. #[no_mangle]
  39. extern "C" fn fiq_lower(_elr: u64, _spsr: u64) {
  40. error!("fiq_lower");
  41. system_off().unwrap();
  42. }
  43. #[no_mangle]
  44. extern "C" fn serr_lower(_elr: u64, _spsr: u64) {
  45. error!("serr_lower");
  46. print_esr();
  47. system_off().unwrap();
  48. }
  49. #[inline]
  50. fn print_esr() {
  51. let mut esr: u64;
  52. unsafe {
  53. asm!("mrs {esr}, esr_el1", esr = out(reg) esr);
  54. }
  55. log::error!("esr={:#08x}", esr);
  56. }