Skip to content

Commit b0a7290

Browse files
gdbserver: rework register fields presentation
- add option 'register_fields' to control whether register fields are presented (default: True) - define register fields for CONTROL, xPSR, VPR and FPSCR registers - remove option 'xpsr_control_fields' as it's no longer needed
1 parent 1fc66b0 commit b0a7290

File tree

3 files changed

+74
-31
lines changed

3 files changed

+74
-31
lines changed

docs/options.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -590,11 +590,11 @@ The source letters are:
590590
- <tt>n</tt>=none
591591
</td></tr>
592592

593-
<tr><td>xpsr_control_fields</td>
593+
<tr><td>register_fields</td>
594594
<td>bool</td>
595-
<td>False</td>
595+
<td>True</td>
596596
<td>
597-
When set to True, XPSR and CONTROL registers will have their respective bitfields defined for
597+
When set to True, registers with bitfields will have their respective bitfields defined for
598598
presentation in gdb.
599599
</td></tr>
600600

pyocd/core/options.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# pyOCD debugger
2-
# Copyright (c) 2018-2020 Arm Limited
2+
# Copyright (c) 2018-2020,2025 Arm Limited
33
# Copyright (c) 2020 Patrick Huesmann
44
# Copyright (c) 2022 Chris Reed
55
# SPDX-License-Identifier: Apache-2.0
@@ -193,8 +193,8 @@ class OptionInfo(NamedTuple):
193193
"Base TCP port number for the semihosting telnet server."),
194194
OptionInfo('vector_catch', str, 'h',
195195
"Enable vector catch sources."),
196-
OptionInfo('xpsr_control_fields', bool, False,
197-
"When set to True, XPSR and CONTROL registers will have their respective bitfields defined "
196+
OptionInfo('register_fields', bool, True,
197+
"When set to True, registers with bitfields will have their respective bitfields defined "
198198
"for presentation in gdb."),
199199
OptionInfo('soft_bkpt_as_hard', bool, False,
200200
"Replace software breakpoints with hardware breakpoints."),

pyocd/gdbserver/context_facade.py

Lines changed: 68 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from ..core import exceptions
2525
from ..core.target import Target
2626
from ..core.memory_map import MemoryType
27+
from ..coresight.core_ids import CortexMExtension
2728
from . import signals
2829

2930
LOG = logging.getLogger(__name__)
@@ -249,31 +250,66 @@ def get_memory_map_xml(self):
249250
prop.text = hex(r.blocksize).rstrip("L")
250251
return MAP_XML_HEADER + ElementTree.tostring(root)
251252

252-
def _define_xpsr_control_fields(self, xml_feature):
253-
"""@brief Define XPSR and CONTROL register types with fields."""
253+
def _define_m_profile_types(self, xml_feature):
254+
"""@brief Define 'org.gnu.gdb.arm.m-profile' types."""
255+
xpsr = ElementTree.SubElement(xml_feature, 'flags', id="xpsr", size="4")
256+
# APSR fields
257+
ElementTree.SubElement(xpsr, "field", name="N", start="31", end="31", type="bool")
258+
ElementTree.SubElement(xpsr, "field", name="Z", start="30", end="30", type="bool")
259+
ElementTree.SubElement(xpsr, "field", name="C", start="29", end="29", type="bool")
260+
ElementTree.SubElement(xpsr, "field", name="V", start="28", end="28", type="bool")
261+
ElementTree.SubElement(xpsr, "field", name="Q", start="27", end="27", type="bool")
262+
ElementTree.SubElement(xpsr, "field", name="GE", start="16", end="19", type="int")
263+
#IPSR fields
264+
ElementTree.SubElement(xpsr, "field", name="EXC", start="0", end="8", type="int")
265+
#EPSR fields
266+
ElementTree.SubElement(xpsr, "field", name="T", start="24", end="24", type="bool")
267+
268+
def _define_m_system_types(self, xml_feature):
269+
"""@brief Define 'org.gnu.gdb.arm.m-system' types."""
254270
control = ElementTree.SubElement(xml_feature, 'flags', id="control", size="4")
255271
ElementTree.SubElement(control, "field", name="nPRIV", start="0", end="0", type="bool")
256272
ElementTree.SubElement(control, "field", name="SPSEL", start="1", end="1", type="bool")
257273
if self._context.core.has_fpu:
258274
ElementTree.SubElement(control, "field", name="FPCA", start="2", end="2", type="bool")
259-
if Target.SecurityState.SECURE in self._context.core.supported_security_states:
260-
ElementTree.SubElement(control, "field", name="SFPA", start="3", end="3", type="bool")
261-
262-
apsr = ElementTree.SubElement(xml_feature, 'flags', id="apsr", size="4")
263-
ElementTree.SubElement(apsr, "field", name="N", start="31", end="31", type="bool")
264-
ElementTree.SubElement(apsr, "field", name="Z", start="30", end="30", type="bool")
265-
ElementTree.SubElement(apsr, "field", name="C", start="29", end="29", type="bool")
266-
ElementTree.SubElement(apsr, "field", name="V", start="28", end="28", type="bool")
267-
ElementTree.SubElement(apsr, "field", name="Q", start="27", end="27", type="bool")
268-
ElementTree.SubElement(apsr, "field", name="GE", start="16", end="19", type="int")
269-
270-
ipsr = ElementTree.SubElement(xml_feature, 'struct', id="ipsr", size="4")
271-
ElementTree.SubElement(ipsr, "field", name="EXC", start="0", end="8", type="int")
272-
273-
xpsr = ElementTree.SubElement(xml_feature, 'union', id="xpsr")
274-
ElementTree.SubElement(xpsr, "field", name="xpsr", type="uint32")
275-
ElementTree.SubElement(xpsr, "field", name="apsr", type="apsr")
276-
ElementTree.SubElement(xpsr, "field", name="ipsr", type="ipsr")
275+
if Target.SecurityState.SECURE in self._context.core.supported_security_states:
276+
ElementTree.SubElement(control, "field", name="SFPA", start="3", end="3", type="bool")
277+
if (CortexMExtension.PACBTI in self._context.core.extensions):
278+
ElementTree.SubElement(control, "field", name="BTI_EN", start="4", end="4", type="bool")
279+
ElementTree.SubElement(control, "field", name="UBTI_EN", start="5", end="5", type="bool")
280+
ElementTree.SubElement(control, "field", name="PAC_EN", start="6", end="6", type="bool")
281+
ElementTree.SubElement(control, "field", name="UPAC_EN", start="7", end="7", type="bool")
282+
283+
def _define_m_profile_mve_types(self, xml_feature):
284+
"""@brief Define 'org.gnu.gdb.arm.m-profile-mve' types."""
285+
vpr = ElementTree.SubElement(xml_feature, 'flags', id="vpr", size="4")
286+
ElementTree.SubElement(vpr, "field", name="P0", start="0", end="15", type="int")
287+
ElementTree.SubElement(vpr, "field", name="MASK01", start="16", end="19", type="int")
288+
ElementTree.SubElement(vpr, "field", name="MASK23", start="20", end="23", type="int")
289+
290+
def _define_vfp_types(self, xml_feature):
291+
"""@brief Define 'org.gnu.gdb.arm.vfp' types."""
292+
fpscr = ElementTree.SubElement(xml_feature, 'flags', id="fpscr", size="4")
293+
ElementTree.SubElement(fpscr, "field", name="N", start="31", end="31", type="bool")
294+
ElementTree.SubElement(fpscr, "field", name="Z", start="30", end="30", type="bool")
295+
ElementTree.SubElement(fpscr, "field", name="C", start="29", end="29", type="bool")
296+
ElementTree.SubElement(fpscr, "field", name="V", start="28", end="28", type="bool")
297+
if (CortexMExtension.MVE in self._context.core.extensions):
298+
ElementTree.SubElement(fpscr, "field", name="QC", start="27", end="27", type="bool")
299+
ElementTree.SubElement(fpscr, "field", name="AHP", start="26", end="26", type="bool")
300+
ElementTree.SubElement(fpscr, "field", name="DN", start="25", end="25", type="bool")
301+
ElementTree.SubElement(fpscr, "field", name="FZ", start="24", end="24", type="bool")
302+
ElementTree.SubElement(fpscr, "field", name="RMode", start="22", end="23", type="int")
303+
if (CortexMExtension.FPU_HP in self._context.core.extensions):
304+
ElementTree.SubElement(fpscr, "field", name="FZ16", start="19", end="19", type="bool")
305+
if (self._context.core.architecture_version == (8, 1)):
306+
ElementTree.SubElement(fpscr, "field", name="LTPSIZE", start="16", end="18", type="int")
307+
ElementTree.SubElement(fpscr, "field", name="IDC", start="7", end="7", type="bool")
308+
ElementTree.SubElement(fpscr, "field", name="IXC", start="4", end="4", type="bool")
309+
ElementTree.SubElement(fpscr, "field", name="UFC", start="3", end="3", type="bool")
310+
ElementTree.SubElement(fpscr, "field", name="OFC", start="2", end="2", type="bool")
311+
ElementTree.SubElement(fpscr, "field", name="DZC", start="1", end="1", type="bool")
312+
ElementTree.SubElement(fpscr, "field", name="IOC", start="0", end="0", type="bool")
277313

278314
def _build_target_xml(self):
279315
# Extract list of registers, group into gdb features.
@@ -290,7 +326,7 @@ def _build_target_xml(self):
290326
# Add any remaining features at the end of the feature list.
291327
features += unordered_features
292328

293-
use_xpsr_control_fields = self._context.session.options.get('xpsr_control_fields')
329+
use_register_fields = self._context.session.options.get('register_fields')
294330

295331
xml_root = ElementTree.Element('target')
296332

@@ -299,13 +335,20 @@ def _build_target_xml(self):
299335

300336
xml_feature = ElementTree.SubElement(xml_root, "feature", name=feature_name)
301337

302-
# Special case for XPSR and CONTROL bitfield presentation.
303-
if (feature_name == "org.gnu.gdb.arm.m-profile") and use_xpsr_control_fields:
304-
self._define_xpsr_control_fields(xml_feature)
338+
# Define feature types when option 'register_fields' is enabled.
339+
if use_register_fields:
340+
if feature_name == "org.gnu.gdb.arm.m-profile":
341+
self._define_m_profile_types(xml_feature)
342+
elif feature_name == "org.gnu.gdb.arm.m-system":
343+
self._define_m_system_types(xml_feature)
344+
elif feature_name == "org.gnu.gdb.arm.m-profile-mve":
345+
self._define_m_profile_mve_types(xml_feature)
346+
elif feature_name == "org.gnu.gdb.arm.vfp":
347+
self._define_vfp_types(xml_feature)
305348

306349
# Add XML for the registers in this feature.
307350
for reg in regs:
308-
if use_xpsr_control_fields and (reg.name in ('xpsr', 'control')):
351+
if use_register_fields and (reg.name in ('xpsr', 'control', 'vpr', 'fpscr')):
309352
reg_type = reg.name
310353
else:
311354
reg_type = reg.gdb_type

0 commit comments

Comments
 (0)