summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2020-10-02 11:36:20 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2020-10-16 06:41:27 +0200
commit3d7da43562d83faf93f9a3827408d2a13a3658d3 (patch)
tree03b3c1ccd4b7c3af91978052b0ffcd0c6c952df3 /cpukit
parenti386/score: fix assembly mnemonic (diff)
downloadrtems-3d7da43562d83faf93f9a3827408d2a13a3658d3.tar.bz2
bsps/arm: Workaround for Errata 845369
Add a workaround for Cortex-A9 Errata 845369: Under Very Rare Timing Circumstances Transition into Streaming Mode Might Create Data Corruption. Update #4114.
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/score/cpu/arm/include/libcpu/arm-cp15.h32
1 files changed, 32 insertions, 0 deletions
diff --git a/cpukit/score/cpu/arm/include/libcpu/arm-cp15.h b/cpukit/score/cpu/arm/include/libcpu/arm-cp15.h
index 8d43ca0ac2..ffe32e4f46 100644
--- a/cpukit/score/cpu/arm/include/libcpu/arm-cp15.h
+++ b/cpukit/score/cpu/arm/include/libcpu/arm-cp15.h
@@ -2292,6 +2292,38 @@ arm_cp15_set_counter_virtual_offset(uint64_t val)
);
}
+/* Diagnostic Control Register */
+ARM_CP15_TEXT_SECTION static inline uint32_t
+arm_cp15_get_diagnostic_control(void)
+{
+ ARM_SWITCH_REGISTERS;
+ uint32_t val;
+
+ __asm__ volatile (
+ ARM_SWITCH_TO_ARM
+ "mrc p15, 0, %[val], c15, c0, 1\n"
+ ARM_SWITCH_BACK
+ : [val] "=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
+ );
+
+ return val;
+}
+
+/* Diagnostic Control Register */
+ARM_CP15_TEXT_SECTION static inline void
+arm_cp15_set_diagnostic_control(uint32_t val)
+{
+ ARM_SWITCH_REGISTERS;
+
+ __asm__ volatile (
+ ARM_SWITCH_TO_ARM
+ "mcr p15, 0, %[val], c15, c0, 1\n"
+ ARM_SWITCH_BACK
+ : ARM_SWITCH_OUTPUT
+ : [val] "r" (val)
+ );
+}
+
/**
* @brief Sets the @a section_flags for the address range [@a begin, @a end).
*