diff options
author | 2017-06-05 13:53:29 +0100 | |
---|---|---|
committer | 2017-06-05 13:53:29 +0100 | |
commit | c4d897ec4bb47bc8f2768d2b33864ddf4c251da2 (patch) | |
tree | e1a626d2af155018b0c18a3879a445f9b2f20847 /src/asm.rs | |
parent | 14851f2ad78b5675cb253915ce21e58dfb75a020 (diff) | |
download | cortex-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.rs | 50 |
1 files changed, 50 insertions, 0 deletions
@@ -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"))] + () => {} + } +} |