Ver código fonte

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>
Akihiko Odaki 1 ano atrás
pai
commit
6c2313e83d
2 arquivos alterados com 45 adições e 2 exclusões
  1. 1 0
      include/exec/gdbstub.h
  2. 44 2
      scripts/feature_to_c.py

+ 1 - 0
include/exec/gdbstub.h

@@ -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;
 
 
 
 

+ 44 - 2
scripts/feature_to_c.py

@@ -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 @@ def writeliteral(indent, bytes):
     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')