Memory transfer attributes

By default, pyOCD (and most other debuggers) will show the current memory contents regardless of the presence of a data and/or instruction cache. Yet, sometimes it is desirable to view the cache contents in the debugger. That is, to see the CPU’s view of memory through the cache. Other memory transfer attributes can also be useful to control is certain, complex debugging scenarios.

Memory transfer attributes

For Arm devices, the MEM-AP used to perform memory transfers is responsible for specifying what attributes are set when the transfer is performed. The AHB and AXI bus protocol standards define the set of possible transfer attributes. Then, which attributes are actually implemented varies greatly depending on the CPU type and MEM-AP type and variant.

The AHB-AP HPROT bits used with Cortex-M devices are shown here. “HPROT” is the name of the AHB protocol bus that carries the attributes along with the memory transfer request.

HPROT (1) Enabled (0) Disabled
HPROT[0] data access instr fetch
HPROT[1] privileged user
HPROT[2] bufferable non bufferable
HPROT[3] cacheable/modifable non cacheable
HPROT[4] lookup in cache no cache
HPROT[5] allocate in cache no allocate in cache
HPROT[6] shareable non shareable

Not all bits are implemented on all core/MEM-AP variants; each MEM-AP version implements slightly different sets of these options. For instance, the standard CM3 and CM4 MEM-AP only implements HPROT[1] (privileged/user). Check the documentation for your target and CPU(s) to verify available attributes.

AXI-AP attributes are much more complex and are not documented here.

Note that Cortex-M7 and other M-profile cores that use an AXI bus use an AHB-AP as the debugger interface, so the table above still applies. The core converts AHB attributes to AXI attributes internally if the debugger’s memory transfer request needs to be sent on the downstream AXI bus.

Controlling attributes

In pyOCD, the HPROT value for memory transactions is set using the set hprot <value> command, and show hprot to view the current setting. These modify/view the currently selected MEM-AP (set/show mem-ap), which is independent of the gdbserver’s core (not something to worry about if you are only debugging core #0).

As a reminder, these commands can be executed from gdb by prefixing them with the gdb monitor command. For example, to enable cacheable transfers from gdb, you’d run monitor set hprot 0xb. This can be placed in a connect script if you want cacheable transfers all the time.

To configure the used attributes in a pyOCD user script, a snippet such as this is can be used:

def did_connect():
    target.aps[0].hprot = 0xb

And if using pyOCD via a Python script, mirror the statement inside did_connect() above using your target object.

In the above commands, 0xb == data (hprot[0]) privileged (hprot[1]) cacheable (hprot[3]).