Skip to content

Commit

Permalink
gdbstub: Add num_regs member to GDBFeature
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
akihikodaki authored and stsquad committed Nov 8, 2023
1 parent 1195999 commit 6c2313e
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 2 deletions.
1 change: 1 addition & 0 deletions include/exec/gdbstub.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
typedef struct GDBFeature {
const char *xmlname;
const char *xml;
int num_regs;
} GDBFeature;


Expand Down
46 changes: 44 additions & 2 deletions scripts/feature_to_c.py
Original file line number Diff line number Diff line change
@@ -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)
Expand Down Expand Up @@ -39,10 +39,52 @@ def writeliteral(indent, bytes):
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')

0 comments on commit 6c2313e

Please sign in to comment.