pw_cpu_exception_cortex_m: Add error flag masks
The Cortex-M Fault register has some reserved bits and some bits that
describe if a fault register is valid or not, all in the same sections
as the error bits. Create a mask for only the error bits which will
allow calculating if there are multiple errors present.
Change-Id: Ic039f317314e1478a858808c804886dc82257bb6
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/210072
Reviewed-by: Armando Montanez <amontanez@google.com>
Pigweed-Auto-Submit: Carlos Chinchilla <cachinchilla@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed-service-accounts.iam.gserviceaccount.com>
Lint: Lint 🤖 <android-build-ayeaye@system.gserviceaccount.com>
diff --git a/pw_cpu_exception_cortex_m/pw_cpu_exception_cortex_m_private/cortex_m_constants.h b/pw_cpu_exception_cortex_m/pw_cpu_exception_cortex_m_private/cortex_m_constants.h
index c6f479e..41edf26 100644
--- a/pw_cpu_exception_cortex_m/pw_cpu_exception_cortex_m_private/cortex_m_constants.h
+++ b/pw_cpu_exception_cortex_m/pw_cpu_exception_cortex_m_private/cortex_m_constants.h
@@ -51,6 +51,11 @@
constexpr uint32_t kCfsrMstkerrMask = (kCfsrMemFaultStart << 4);
constexpr uint32_t kCfsrMlsperrMask = (kCfsrMemFaultStart << 5);
constexpr uint32_t kCfsrMmarvalidMask = (kCfsrMemFaultStart << 7);
+// Mask for all supported memory error flags i.e. bits that indicate a specific
+// error.
+constexpr uint32_t kCfsrMemAllErrorsMask =
+ kCfsrIaccviolMask | kCfsrDaccviolMask | kCfsrMunstkerrMask |
+ kCfsrMstkerrMask | kCfsrMlsperrMask;
// Bus faults (BusFault Status Register)
constexpr uint32_t kCfsrBusFaultStart = (0x1 << 8);
constexpr uint32_t kCfsrIbuserrMask = (kCfsrBusFaultStart << 0);
@@ -60,6 +65,11 @@
constexpr uint32_t kCfsrStkerrMask = (kCfsrBusFaultStart << 4);
constexpr uint32_t kCfsrLsperrMask = (kCfsrBusFaultStart << 5);
constexpr uint32_t kCfsrBfarvalidMask = (kCfsrBusFaultStart << 7);
+// Mask for all supported bus error flags i.e. bits that indicate a specific
+// error.
+constexpr uint32_t kCfsrBusAllErrorsMask =
+ kCfsrIbuserrMask | kCfsrPreciserrMask | kCfsrImpreciserrMask |
+ kCfsrUnstkerrMask | kCfsrStkerrMask | kCfsrLsperrMask;
// Usage faults (UsageFault Status Register)
constexpr uint32_t kCfsrUsageFaultStart = (0x1 << 16);
constexpr uint32_t kCfsrUndefinstrMask = (kCfsrUsageFaultStart << 0);
@@ -71,6 +81,14 @@
#endif // _PW_ARCH_ARM_V8M_MAINLINE
constexpr uint32_t kCfsrUnalignedMask = (kCfsrUsageFaultStart << 8);
constexpr uint32_t kCfsrDivbyzeroMask = (kCfsrUsageFaultStart << 9);
+// Mask for all supported usage error flags i.e. bits that indicate a specific
+// error.
+constexpr uint32_t kCfsrUsageAllErrorsMask =
+ kCfsrUndefinstrMask | kCfsrInvstateMask | kCfsrInvpcMask | kCfsrNocpMask |
+#if _PW_ARCH_ARM_V8M_MAINLINE
+ kCfsrStkofMask |
+#endif // _PW_ARCH_ARM_V8M_MAINLINE
+ kCfsrUnalignedMask | kCfsrDivbyzeroMask;
// Bit masks for an exception return value. (ARMv7-M Section B1.5.8)
constexpr uint32_t kExcReturnStackMask = 0x1u << 2; // 0=MSP, 1=PSP