From d60bafbf05f1ee84b1f70a1136701f1d729d1ca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Quentin?= Date: Mon, 2 Sep 2024 15:38:10 +0200 Subject: [PATCH] Improve CP0-disabled error message (#2061) * Improve CP0-disabled error message * CHANGELOG.md --- esp-backtrace/CHANGELOG.md | 1 + esp-backtrace/src/lib.rs | 2 +- esp-backtrace/src/xtensa.rs | 14 ++++++++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) 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)]