Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion cortex-m/src/critical_section.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ unsafe impl Impl for SingleCoreCriticalSection {
// u32 instead of using the primask::read() function to minimize the number of processor
// cycles during which interrupts are disabled.
let restore_state = primask::read_raw();
// NOTE: Fence guarantees are provided by interrupt::disable(), which performs a `compiler_fence(SeqCst)`.
// NOTE: Fence guarantees are provided by interrupt::disable(),
// which performs a `compiler_fence(SeqCst)` fore and aft.
interrupt::disable();
restore_state
}
Expand Down
10 changes: 8 additions & 2 deletions cortex-m/src/interrupt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,10 @@ unsafe impl<T: Nr + Copy> InterruptNumber for T {
#[inline]
#[asm_cfg(cortex_m)]
pub fn disable() {
unsafe { asm!("cpsid i", options(nomem, nostack, preserves_flags)) };
// Ensure no preceeding memory accesses are reordered to after interrupts are disabled.
compiler_fence(Ordering::SeqCst);

unsafe { asm!("cpsid i", options(nostack, preserves_flags)) };

// Ensure no subsequent memory accesses are reordered to before interrupts are disabled.
compiler_fence(Ordering::SeqCst);
Expand All @@ -58,7 +61,10 @@ pub unsafe fn enable() {
// Ensure no preceeding memory accesses are reordered to after interrupts are enabled.
compiler_fence(Ordering::SeqCst);

unsafe { asm!("cpsie i", options(nomem, nostack, preserves_flags)) };
unsafe { asm!("cpsie i", options(nostack, preserves_flags)) };

// Ensure no subsequent memory accesses are reordered to before interrupts are disabled.
compiler_fence(Ordering::SeqCst);
}

/// Execute closure `f` in an interrupt-free context.
Expand Down
4 changes: 3 additions & 1 deletion cortex-m/src/register/primask.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,9 @@ pub fn read_raw() -> u32 {
pub unsafe fn write_raw(r: u32) {
// Ensure no preceeding memory accesses are reordered to after interrupts are possibly enabled.
compiler_fence(Ordering::SeqCst);
unsafe { asm!("msr PRIMASK, {}", in(reg) r, options(nomem, nostack, preserves_flags)) };

unsafe { asm!("msr PRIMASK, {}", in(reg) r, options(nostack, preserves_flags)) };

// Ensure no subsequent memory accesses are reordered to before interrupts are possibly disabled.
compiler_fence(Ordering::SeqCst);
}
Loading