aboutsummaryrefslogtreecommitdiff
path: root/src/asm.rs
diff options
context:
space:
mode:
authorGravatar Adam Greig <adam@adamgreig.com> 2017-06-05 13:53:29 +0100
committerGravatar Adam Greig <adam@adamgreig.com> 2017-06-05 13:53:29 +0100
commitc4d897ec4bb47bc8f2768d2b33864ddf4c251da2 (patch)
treee1a626d2af155018b0c18a3879a445f9b2f20847 /src/asm.rs
parent14851f2ad78b5675cb253915ce21e58dfb75a020 (diff)
downloadcortex-m-c4d897ec4bb47bc8f2768d2b33864ddf4c251da2.tar.gz
cortex-m-c4d897ec4bb47bc8f2768d2b33864ddf4c251da2.tar.zst
cortex-m-c4d897ec4bb47bc8f2768d2b33864ddf4c251da2.zip
Add barrier instructions
Diffstat (limited to 'src/asm.rs')
-rw-r--r--src/asm.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/asm.rs b/src/asm.rs
index c82d45d..cb4254e 100644
--- a/src/asm.rs
+++ b/src/asm.rs
@@ -58,3 +58,53 @@ pub fn wfi() {
() => {}
}
}
+
+/// Instruction Synchronization Barrier
+///
+/// Flushes the pipeline in the processor, so that all instructions following the `ISB` are fetched
+/// from cache or memory, after the instruction has been completed.
+pub fn isb() {
+ match () {
+ #[cfg(target_arch = "arm")]
+ () => unsafe {
+ asm!("isb 0xF" : : : "memory" : "volatile");
+ },
+ #[cfg(not(target_arch = "arm"))]
+ () => {}
+ }
+}
+
+/// Data Synchronization Barrier
+///
+/// Acts as a special kind of memory barrier. No instruction in program order after this
+/// instruction can execute until this instruction completes. This instruction completes only when
+/// both:
+///
+/// * any explicit memory access made before this instruction is complete
+/// * all cache and branch predictor maintenance operations before this instruction complete
+pub fn dsb() {
+ match () {
+ #[cfg(target_arch = "arm")]
+ () => unsafe {
+ asm!("dsb 0xF" : : : "memory" : "volatile");
+ },
+ #[cfg(not(target_arch = "arm"))]
+ () => {}
+ }
+}
+
+/// Data Memory Barrier
+///
+/// Ensures that all explicit memory accesses that appear in program order before the `DMB`
+/// instruction are observed before any explicit memory accesses that appear in program order
+/// after the `DMB` instruction.
+pub fn dmb() {
+ match () {
+ #[cfg(target_arch = "arm")]
+ () => unsafe {
+ asm!("dmb 0xF" : : : "memory" : "volatile");
+ },
+ #[cfg(not(target_arch = "arm"))]
+ () => {}
+ }
+}