diff --git a/esp-backtrace/CHANGELOG.md b/esp-backtrace/CHANGELOG.md index 8db4528b8..ba80eba49 100644 --- a/esp-backtrace/CHANGELOG.md +++ b/esp-backtrace/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed +- Print a more helpful message in case of a `Cp0Disabled` exception (#2061) ### Fixed diff --git a/esp-backtrace/src/lib.rs b/esp-backtrace/src/lib.rs index c51c7742d..f023e605a 100644 --- a/esp-backtrace/src/lib.rs +++ b/esp-backtrace/src/lib.rs @@ -100,7 +100,7 @@ unsafe fn __user_exception(cause: arch::ExceptionCause, context: arch::Context) // Unfortunately, a different formatter string is used #[cfg(not(feature = "defmt"))] - esp_println::println!("\n\nException occurred '{:?}'", cause); + esp_println::println!("\n\nException occurred '{}'", cause); #[cfg(feature = "defmt")] defmt::error!("\n\nException occurred '{}'", cause); diff --git a/esp-backtrace/src/xtensa.rs b/esp-backtrace/src/xtensa.rs index e22e1b5a9..eb0c4425c 100644 --- a/esp-backtrace/src/xtensa.rs +++ b/esp-backtrace/src/xtensa.rs @@ -1,4 +1,4 @@ -use core::arch::asm; +use core::{arch::asm, fmt::Display}; use crate::MAX_BACKTRACE_ADDRESSES; @@ -11,7 +11,7 @@ pub(super) const RA_OFFSET: usize = 3; /// Exception Cause #[doc(hidden)] -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq)] #[cfg_attr(feature = "defmt", derive(defmt::Format))] #[repr(C)] pub enum ExceptionCause { @@ -99,6 +99,16 @@ pub enum ExceptionCause { None = 255, } +impl Display for ExceptionCause { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + if *self == Self::Cp0Disabled { + write!(f, "Cp0Disabled (Access to the floating point coprocessor is not allowed. You may want to enable the `float-save-restore` feature of the `xtensa-lx-rt` crate.)") + } else { + write!(f, "{:?}", self) + } + } +} + #[doc(hidden)] #[allow(non_snake_case)] #[derive(Clone, Copy)]