pub struct Dhcsr(pub u32);
Expand description

Debug Halting Control and Status Register, DHCSR (see armv8-M Architecture Reference Manual D1.2.38)

To write this register successfully, you need to set the debug key via Dhcsr::enable_write first!

Tuple Fields§

§0: u32

Implementations§

Restart sticky status. Indicates the PE has processed a request to clear DHCSR.C_HALT to 0. That is, either a write to DHCSR that clears DHCSR.C_HALT from 1 to 0, or an External Restart Request.

The possible values of this bit are:

0: PE has not left Debug state since the last read of DHCSR.
1: PE has left Debug state since the last read of DHCSR.

If the PE is not halted when C_HALT is cleared to zero, it is UNPREDICTABLE whether this bit is set to 1. If DHCSR.C_DEBUGEN == 0 this bit reads as an UNKNOWN value.

This bit clears to zero when read.

Note

If the request to clear C_HALT is made simultaneously with a request to set C_HALT, for example a restart request and external debug request occur together, then the

Indicates whether the processor has been reset since the last read of DHCSR:

0: No reset since last DHCSR read.
1: At least one reset since last DHCSR read.

This is a sticky bit, that clears to 0 on a read of DHCSR.

When not in Debug state, indicates whether the processor has completed the execution of an instruction since the last read of DHCSR:

0: No instruction has completed since last DHCSR read.
1: At least one instructions has completed since last DHCSR read.

This is a sticky bit, that clears to 0 on a read of DHCSR.

This bit is UNKNOWN:

  • after a Local reset, but is set to 1 as soon as the processor completes execution of an instruction.
  • when S_LOCKUP is set to 1.
  • when S_HALT is set to 1.

When the processor is not in Debug state, a debugger can check this bit to determine if the processor is stalled on a load, store or fetch access.

Floating-point registers Debuggable. Indicates that FPSCR, VPR, and the Floating-point registers are RAZ/WI in the current PE state when accessed via DCRSR. This reflects !CanDebugAccessFP(). The possible values of this bit are:

0: Floating-point registers accessible.
1: Floating-point registers are RAZ/WI.

If version Armv8.1-M of the architecture is not implemented, this bit is RES0

Secure unprivileged halting debug enabled. Indicates whether Secure unprivileged-only halting debug is allowed or active. The possible values of this bit are:

0: Secure invasive halting debug prohibited or not restricted to an unprivileged mode.
1: Unprivileged Secure invasive halting debug enabled.

If the PE is in Non-debug state, this bit reflects the value of UnprivHaltingDebugAllowed(TRUE) && !SecureHaltingDebugAllowed().

The value of this bit does not change whilst the PE remains in Debug state.

If the Security Extension is not implemented, this bit is RES0. If version Armv8.1 of the architecture and UDE are not implemented, this bit is RES0.

Non-secure unprivileged halting debug enabled. Indicates whether Non-secure unprivileged-only halting debug is allowed or active.

The possible values of this bit are:

0: Non-secure invasive halting debug prohibited or not restricted to an unprivileged mode.
1: Unprivileged Non-secure invasive halting debug enabled.

If the PE is in Non-debug state, this bit reflects the value of UnprivHaltingDebugAllowed(FALSE) && !HaltingDebugAllowed().

The value of this bit does not change whilst the PE remains in Debug state. If version Armv8.1 of the architecture and UDE are not implemented, this bit is RES0

Secure debug enabled. Indicates whether Secure invasive debug is allowed. The possible values of this bit are:

0: Secure invasive debug prohibited.
1: Secure invasive debug allowed.

If the PE is in Non-debug state, this bit reflects the value of SecureHaltingDebugAllowed() or UnprivHaltingDebugAllowed(TRUE).

The value of this bit does not change while the PE remains in Debug state.

If the Security Extension is not implemented, this bit is RES0.

Indicates whether the processor is locked up because of an unrecoverable exception:

0 Not locked up.
1 Locked up. See Unrecoverable exception cases on page B1-206 for more information.

This bit can only read as 1 when accessed by a remote debugger using the DAP. The value of 1 indicates that the processor is running but locked up. The bit clears to 0 when the processor enters Debug state.

Indicates whether the processor is sleeping:

0 Not sleeping. 1 Sleeping.

The debugger must set the DHCSR.C_HALT bit to 1 to gain control, or wait for an interrupt or other wakeup event to wakeup the system

Indicates whether the processor is in Debug state:

0: Not in Debug state.
1: In Debug state.

A handshake flag for transfers through the DCRDR:

  • Writing to DCRSR clears the bit to 0.
  • Completion of the DCRDR transfer then sets the bit to 1.

For more information about DCRDR transfers see Debug Core Register Data Register, DCRDR on page C1-292.

0: There has been a write to the DCRDR, but the transfer is not complete.
1 The transfer to or from the DCRDR is complete.

This bit is only valid when the processor is in Debug state, otherwise the bit is UNKNOWN.

Halt on PMU overflow control. Request entry to Debug state when a PMU counter overflows.

The possible values of this bit are:

0: No action.
1: If C_DEBUGEN is set to 1, then when a PMU counter is configured to generate an interrupt overflows, the PE sets DHCSR.C_HALT to 1 and DFSR.PMU to 1.

PMU_OVSSET and PMU_OVSCLR indicate which counter or counters triggered the halt.

If the Main Extension is not implemented, this bit is RES0.

If version Armv8.1 of the architecture and PMU are not implemented, this bit is RES0.

This bit resets to zero on a Cold reset.

Allow imprecise entry to Debug state. The actions on writing to this bit are:

0: No action.
1: Allow imprecise entry to Debug state, for example by forcing any stalled load or store instruction to complete.

Setting this bit to 1 allows a debugger to request imprecise entry to Debug state.

The effect of setting this bit to 1 is UNPREDICTABLE unless the DHCSR write also sets C_DEBUGEN and C_HALT to 1. This means that if the processor is not already in Debug state it enters Debug state when the stalled instruction completes.

Writing 1 to this bit makes the state of the memory system UNPREDICTABLE. Therefore, if a debugger writes 1 to this bit it must reset the processor before leaving Debug state.

Note

  • A debugger can write to the DHCSR to clear this bit to 0. However, this does not remove the UNPREDICTABLE state of the memory system caused by setting C_SNAPSTALL to 1.
  • The architecture does not guarantee that setting this bit to 1 will force entry to Debug state.
  • Arm strongly recommends that a value of 1 is never written to C_SNAPSTALL when the processor is in Debug state.

A power-on reset sets this bit to 0.

When debug is enabled, the debugger can write to this bit to mask PendSV, SysTick and external configurable interrupts:

0: Do not mask.
1 Mask PendSV, SysTick and external configurable interrupts. The effect of any attempt to change the value of this bit is UNPREDICTABLE unless both:

  • before the write to DHCSR, the value of the C_HALT bit is 1.
  • the write to the DHCSR that changes the C_MASKINTS bit also writes 1 to the C_HALT bit.

This means that a single write to DHCSR cannot set the C_HALT to 0 and change the value of the C_MASKINTS bit.

The bit does not affect NMI. When DHCSR.C_DEBUGEN is set to 0, the value of this bit is UNKNOWN.

For more information about the use of this bit see Table C1-9 on page C1-282.

This bit is UNKNOWN after a power-on reset.

Processor step bit. The effects of writes to this bit are:

0: Single-stepping disabled.
1: Single-stepping enabled.

For more information about the use of this bit see Table C1-9 on page C1-282.

This bit is UNKNOWN after a power-on reset.

Processor halt bit. The effects of writes to this bit are:

0: Request a halted processor to run.
1: Request a running processor to halt.

Table C1-9 on page C1-282 shows the effect of writes to this bit when the processor is in Debug state.

This bit is 0 after a System reset

Halting debug enable bit: 0: Halting debug disabled.
1: Halting debug enabled.

If a debugger writes to DHCSR to change the value of this bit from 0 to 1, it must also write 0 to the C_MASKINTS bit, otherwise behavior is UNPREDICTABLE.

This bit can only be written from the DAP. Access to the DHCSR from software running on the processor is IMPLEMENTATION DEFINED.

However, writes to this bit from software running on the processor are ignored.

This bit is 0 after a power-on reset.

Halt on PMU overflow control. Request entry to Debug state when a PMU counter overflows.

The possible values of this bit are:

0: No action.
1: If C_DEBUGEN is set to 1, then when a PMU counter is configured to generate an interrupt overflows, the PE sets DHCSR.C_HALT to 1 and DFSR.PMU to 1.

PMU_OVSSET and PMU_OVSCLR indicate which counter or counters triggered the halt.

If the Main Extension is not implemented, this bit is RES0.

If version Armv8.1 of the architecture and PMU are not implemented, this bit is RES0.

This bit resets to zero on a Cold reset.

Allow imprecise entry to Debug state. The actions on writing to this bit are:

0: No action.
1: Allow imprecise entry to Debug state, for example by forcing any stalled load or store instruction to complete.

Setting this bit to 1 allows a debugger to request imprecise entry to Debug state.

The effect of setting this bit to 1 is UNPREDICTABLE unless the DHCSR write also sets C_DEBUGEN and C_HALT to 1. This means that if the processor is not already in Debug state it enters Debug state when the stalled instruction completes.

Writing 1 to this bit makes the state of the memory system UNPREDICTABLE. Therefore, if a debugger writes 1 to this bit it must reset the processor before leaving Debug state.

Note

  • A debugger can write to the DHCSR to clear this bit to 0. However, this does not remove the UNPREDICTABLE state of the memory system caused by setting C_SNAPSTALL to 1.
  • The architecture does not guarantee that setting this bit to 1 will force entry to Debug state.
  • Arm strongly recommends that a value of 1 is never written to C_SNAPSTALL when the processor is in Debug state.

A power-on reset sets this bit to 0.

When debug is enabled, the debugger can write to this bit to mask PendSV, SysTick and external configurable interrupts:

0: Do not mask.
1 Mask PendSV, SysTick and external configurable interrupts. The effect of any attempt to change the value of this bit is UNPREDICTABLE unless both:

  • before the write to DHCSR, the value of the C_HALT bit is 1.
  • the write to the DHCSR that changes the C_MASKINTS bit also writes 1 to the C_HALT bit.

This means that a single write to DHCSR cannot set the C_HALT to 0 and change the value of the C_MASKINTS bit.

The bit does not affect NMI. When DHCSR.C_DEBUGEN is set to 0, the value of this bit is UNKNOWN.

For more information about the use of this bit see Table C1-9 on page C1-282.

This bit is UNKNOWN after a power-on reset.

Processor step bit. The effects of writes to this bit are:

0: Single-stepping disabled.
1: Single-stepping enabled.

For more information about the use of this bit see Table C1-9 on page C1-282.

This bit is UNKNOWN after a power-on reset.

Processor halt bit. The effects of writes to this bit are:

0: Request a halted processor to run.
1: Request a running processor to halt.

Table C1-9 on page C1-282 shows the effect of writes to this bit when the processor is in Debug state.

This bit is 0 after a System reset

Halting debug enable bit: 0: Halting debug disabled.
1: Halting debug enabled.

If a debugger writes to DHCSR to change the value of this bit from 0 to 1, it must also write 0 to the C_MASKINTS bit, otherwise behavior is UNPREDICTABLE.

This bit can only be written from the DAP. Access to the DHCSR from software running on the processor is IMPLEMENTATION DEFINED.

However, writes to this bit from software running on the processor are ignored.

This bit is 0 after a power-on reset.

Trait Implementations§

Get a range of bits.
Set a range of bits.
Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
Converts to this type from the input type.
Converts to this type from the input type.
The register’s address in the target memory.
The register’s name.

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Get a single bit.
Set a single bit.
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more
Converts self into T using Into<T>. Read more
Causes self to use its Binary implementation when Debug-formatted.
Causes self to use its Display implementation when Debug-formatted.
Causes self to use its LowerExp implementation when Debug-formatted.
Causes self to use its LowerHex implementation when Debug-formatted.
Causes self to use its Octal implementation when Debug-formatted.
Causes self to use its Pointer implementation when Debug-formatted.
Causes self to use its UpperExp implementation when Debug-formatted.
Causes self to use its UpperHex implementation when Debug-formatted.
Formats each item in a sequence. Read more

Returns the argument unchanged.

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Pipes by value. This is generally the method you want to use. Read more
Borrows self and passes that borrow into the pipe function. Read more
Mutably borrows self and passes that borrow into the pipe function. Read more
Borrows self, then passes self.borrow() into the pipe function. Read more
Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Borrows self, then passes self.as_ref() into the pipe function.
Mutably borrows self, then passes self.as_mut() into the pipe function.
Borrows self, then passes self.deref() into the pipe function.
Mutably borrows self, then passes self.deref_mut() into the pipe function.
Immutable access to a value. Read more
Mutable access to a value. Read more
Immutable access to the Borrow<B> of a value. Read more
Mutable access to the BorrowMut<B> of a value. Read more
Immutable access to the AsRef<R> view of a value. Read more
Mutable access to the AsMut<R> view of a value. Read more
Immutable access to the Deref::Target of a value. Read more
Mutable access to the Deref::Target of a value. Read more
Calls .tap() only in debug builds, and is erased in release builds.
Calls .tap_mut() only in debug builds, and is erased in release builds.
Calls .tap_borrow() only in debug builds, and is erased in release builds.
Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Calls .tap_ref() only in debug builds, and is erased in release builds.
Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Calls .tap_deref() only in debug builds, and is erased in release builds.
Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
The resulting type after obtaining ownership.
Creates owned data from borrowed data, usually by cloning. Read more
Uses borrowed data to replace owned data, usually by cloning. Read more
Attempts to convert self into T using TryInto<T>. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.
Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more