Skip to content

Commit

Permalink
ITM: don't test reserved bits in is_fifo_ready
Browse files Browse the repository at this point in the history
On ARMv7-M, bits 31:1 of the value read from STIMx are reserved, so
comparing them against zero is a bad idea.

On ARMv8-M, bit 1 has been repurposed to indicate DISABLED. This means
that the is_fifo_ready impl hangs forever when ITM is disabled on a
Cortex-M33 (for example).

Changed to test only the FIFOREADY bit on ARMv7-M, and to test either
FIFOREADY or DISABLED on ARMv8-M.
  • Loading branch information
cbiffle authored and adamgreig committed Jul 20, 2020
1 parent c7fa03e commit f58e5e1
Showing 1 changed file with 12 additions and 1 deletion.
13 changes: 12 additions & 1 deletion src/peripheral/itm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,19 @@ impl Stim {
}

/// Returns `true` if the stimulus port is ready to accept more data
#[cfg(not(armv8m))]
#[inline]
pub fn is_fifo_ready(&self) -> bool {
unsafe { ptr::read_volatile(self.register.get()) & 1 == 1 }
unsafe { ptr::read_volatile(self.register.get()) & 0b1 == 1 }
}

/// Returns `true` if the stimulus port is ready to accept more data
#[cfg(armv8m)]
#[inline]
pub fn is_fifo_ready(&self) -> bool {
// ARMv8-M adds a disabled bit; we indicate that we are ready to
// proceed with a stimulus write if the port is either ready (bit 0) or
// disabled (bit 1).
unsafe { ptr::read_volatile(self.register.get()) & 0b11 != 0 }
}
}

0 comments on commit f58e5e1

Please sign in to comment.