mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 04:13:53 -06:00
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:
parent
119599965e
commit
6c2313e83d
2 changed files with 45 additions and 2 deletions
|
@ -13,6 +13,7 @@
|
||||||
typedef struct GDBFeature {
|
typedef struct GDBFeature {
|
||||||
const char *xmlname;
|
const char *xmlname;
|
||||||
const char *xml;
|
const char *xml;
|
||||||
|
int num_regs;
|
||||||
} GDBFeature;
|
} GDBFeature;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
import os, sys
|
import os, sys, xml.etree.ElementTree
|
||||||
|
|
||||||
def writeliteral(indent, bytes):
|
def writeliteral(indent, bytes):
|
||||||
sys.stdout.write(' ' * indent)
|
sys.stdout.write(' ' * indent)
|
||||||
|
@ -39,10 +39,52 @@ for input in sys.argv[1:]:
|
||||||
with open(input, 'rb') as file:
|
with open(input, 'rb') as file:
|
||||||
read = file.read()
|
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')
|
sys.stdout.write(' {\n')
|
||||||
writeliteral(8, bytes(os.path.basename(input), 'utf-8'))
|
writeliteral(8, bytes(os.path.basename(input), 'utf-8'))
|
||||||
sys.stdout.write(',\n')
|
sys.stdout.write(',\n')
|
||||||
writeliteral(8, read)
|
writeliteral(8, read)
|
||||||
sys.stdout.write('\n },\n')
|
sys.stdout.write(f',\n {num_regs},\n }},\n')
|
||||||
|
|
||||||
sys.stdout.write(' { NULL }\n};\n')
|
sys.stdout.write(' { NULL }\n};\n')
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue