gdbstub: Add num_regs member to GDBFeature

Currently the number of registers exposed to GDB is written as magic
numbers in code. Derive the number of registers GDB actually see from
XML files to replace the magic numbers in code later.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20231025093128.33116-2-akihiko.odaki@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20231106185112.2755262-9-alex.bennee@linaro.org>
This commit is contained in:
Akihiko Odaki 2023-11-06 18:50:58 +00:00 committed by Alex Bennée
parent 119599965e
commit 6c2313e83d
2 changed files with 45 additions and 2 deletions
include/exec
scripts

@ -13,6 +13,7 @@
typedef struct GDBFeature {
const char *xmlname;
const char *xml;
int num_regs;
} GDBFeature;

@ -1,7 +1,7 @@
#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0-or-later
import os, sys
import os, sys, xml.etree.ElementTree
def writeliteral(indent, bytes):
sys.stdout.write(' ' * indent)
@ -39,10 +39,52 @@ for input in sys.argv[1:]:
with open(input, 'rb') as file:
read = file.read()
parser = xml.etree.ElementTree.XMLPullParser(['start', 'end'])
parser.feed(read)
events = parser.read_events()
event, element = next(events)
if event != 'start':
sys.stderr.write(f'unexpected event: {event}\n')
exit(1)
if element.tag != 'feature':
sys.stderr.write(f'unexpected start tag: {element.tag}\n')
exit(1)
regnum = 0
regnums = []
tags = ['feature']
for event, element in events:
if event == 'end':
if element.tag != tags[len(tags) - 1]:
sys.stderr.write(f'unexpected end tag: {element.tag}\n')
exit(1)
tags.pop()
if element.tag == 'feature':
break
elif event == 'start':
if len(tags) < 2 and element.tag == 'reg':
if 'regnum' in element.attrib:
regnum = int(element.attrib['regnum'])
regnums.append(regnum)
regnum += 1
tags.append(element.tag)
else:
raise Exception(f'unexpected event: {event}\n')
if len(tags):
sys.stderr.write('unterminated feature tag\n')
exit(1)
base_reg = min(regnums)
num_regs = max(regnums) - base_reg + 1 if len(regnums) else 0
sys.stdout.write(' {\n')
writeliteral(8, bytes(os.path.basename(input), 'utf-8'))
sys.stdout.write(',\n')
writeliteral(8, read)
sys.stdout.write('\n },\n')
sys.stdout.write(f',\n {num_regs},\n }},\n')
sys.stdout.write(' { NULL }\n};\n')