4 debug state entry – ARM Cortex R4F User Manual

Page 330

Advertising
background image

Debug

ARM DDI 0363E

Copyright © 2009 ARM Limited. All rights reserved.

11-61

ID013010

Non-Confidential, Unrestricted Access

Example 11-10 shows the code for single-stepping off an instruction.

Example 11-10 Single-stepping off an instruction

SingleStepOff(uint32 address)
{

bkpt := FindUnusedBreakpointWithMismatchCapability();
SetComplexBreakpoint(bkpt, address, 4 << 20);

}

Note

In Example 11-10, the third parameter of

SetComplexBreakpoint()

indicates the value to set

BCR[22:20].

This method of single-stepping steps off the instruction that might not necessarily be the same
as stepping to the next instruction executed. In certain circumstances, the next instruction
executed might be the same instruction being stepped off.

The simplest example of this is a branch to a self instruction such as

(B .)

. In this case, the

wanted behavior is most likely to step off the branch to self because this is often used as a means
of waiting for an interrupt.

A more complex example is a return from function that returns to the same point. For example,
a simple recursive function might terminate with:

BL

ThisFunction

POP

{saved_registers, pc}

In this case, the

POP

instruction loads a link register that is saved at the start of the function, and

if that is the link register created by the

BL

instruction shown, it points back at the

POP

instruction.

Therefore, this single step code unwinds the entire call stack to the point of the original caller,
rather than stepping out a level at a time. It is not possible to single step this piece of code using
either the high-level or low-level stepping methods.

11.11.4 Debug state entry

On entry to debug state, the debugger can read the processor state, including all registers and
the PC, and determine the cause of the exception from the DSCR method-of-entry bits.

Example 11-11 shows the code for entry to debug state.

Example 11-11 Entering debug state

OnEntryToDebugState(PROCESSOR_STATE *state)
{

// Step 1. Read the DSCR to determine the cause of debug entry.
state->dscr := ReadDebugRegister(34);
// Step 2. Issue a DataSynchronizationBarrier instruction if required;
// this is not required by Cortex-R4 but is required for ARMv7
// debug.
if ((state->dscr & (1<<19)) == 0)
{

ExecuteARMInstruction(0xEE070F9A)
// Step 3. Poll the DSCR for DSCR[19] to be set.
repeat
{

Advertising
This manual is related to the following products: