aboutsummaryrefslogtreecommitdiff
path: root/gdb/syscalls
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/syscalls')
-rwxr-xr-xgdb/syscalls/riscv-canonicalize-syscall-gen.py136
1 files changed, 72 insertions, 64 deletions
diff --git a/gdb/syscalls/riscv-canonicalize-syscall-gen.py b/gdb/syscalls/riscv-canonicalize-syscall-gen.py
index 30e52b7..c7dda93 100755
--- a/gdb/syscalls/riscv-canonicalize-syscall-gen.py
+++ b/gdb/syscalls/riscv-canonicalize-syscall-gen.py
@@ -82,51 +82,59 @@ tail = """\
class Generator:
- def _get_gdb_syscalls(self, gdb_syscalls_path: _Path) -> list[str]:
- gdb_syscalls: list[str] = []
- with open(gdb_syscalls_path, "r", encoding="UTF-8") as file:
- lines = file.readlines()
- for line in lines:
- match = re.search(r"\s*(?P<name>gdb_sys_[^S]+)\S*=", line)
- if match:
- gdb_syscalls.append(match.group("name").strip())
- return gdb_syscalls
-
- def _get_canon_syscalls_lines(self, syscalls_path: _Path, gdb_syscalls: list[str]) -> list[str]:
- canon_syscalls: dict[int, str] = {}
- with open(syscalls_path, "r", encoding="UTF-8") as file:
- lines = file.readlines()
- for line in lines:
- match = re.match(r"#define\s+__NR_(?P<name>[^\s]+)\s+(?P<number>\d+)", line)
- if match:
- syscall_name = match.group("name")
- syscall_num = int(match.group("number"))
- gdb_syscall_name = f"gdb_sys_{syscall_name}"
- if gdb_syscall_name in gdb_syscalls:
- value = f" case {syscall_num}: return {gdb_syscall_name};\n"
- canon_syscalls[syscall_num] = value
- # this is a place for corner cases
- elif syscall_name == "mmap":
- gdb_old_syscall_name = "gdb_old_mmap"
- value = f" case {syscall_num}: return {gdb_old_syscall_name};\n"
- canon_syscalls[syscall_num] = value
- else:
- value = f" /* case {syscall_num}: return {gdb_syscall_name}; */\n"
- canon_syscalls[syscall_num] = value
- return [canon_syscalls[syscall_num] for syscall_num in sorted(canon_syscalls)]
-
- def generate(self, syscalls_path: _Path) -> None:
- repo_path = _Path(__file__).parent.parent.parent
- gdb_syscalls_path = repo_path / "gdb" / "linux-record.h"
- canon_syscalls_path = repo_path / "gdb" / "riscv-canonicalize-syscall-gen.c"
-
- gdb_syscalls = self._get_gdb_syscalls(gdb_syscalls_path)
- canon_syscalls_lines = self._get_canon_syscalls_lines(syscalls_path, gdb_syscalls)
-
- with open(canon_syscalls_path, "w", encoding="UTF-8") as file:
- file.writelines(head)
- file.writelines(canon_syscalls_lines)
- file.writelines(tail)
+ def _get_gdb_syscalls(self, gdb_syscalls_path: _Path) -> list[str]:
+ gdb_syscalls: list[str] = []
+ with open(gdb_syscalls_path, "r", encoding="UTF-8") as file:
+ lines = file.readlines()
+ for line in lines:
+ match = re.search(r"\s*(?P<name>gdb_sys_[^S]+)\S*=", line)
+ if match:
+ gdb_syscalls.append(match.group("name").strip())
+ return gdb_syscalls
+
+ def _get_canon_syscalls_lines(
+ self, syscalls_path: _Path, gdb_syscalls: list[str]
+ ) -> list[str]:
+ canon_syscalls: dict[int, str] = {}
+ with open(syscalls_path, "r", encoding="UTF-8") as file:
+ lines = file.readlines()
+ for line in lines:
+ match = re.match(
+ r"#define\s+__NR_(?P<name>[^\s]+)\s+(?P<number>\d+)", line
+ )
+ if match:
+ syscall_name = match.group("name")
+ syscall_num = int(match.group("number"))
+ gdb_syscall_name = f"gdb_sys_{syscall_name}"
+ if gdb_syscall_name in gdb_syscalls:
+ value = f" case {syscall_num}: return {gdb_syscall_name};\n"
+ canon_syscalls[syscall_num] = value
+ # this is a place for corner cases
+ elif syscall_name == "mmap":
+ gdb_old_syscall_name = "gdb_old_mmap"
+ value = (
+ f" case {syscall_num}: return {gdb_old_syscall_name};\n"
+ )
+ canon_syscalls[syscall_num] = value
+ else:
+ value = f" /* case {syscall_num}: return {gdb_syscall_name}; */\n"
+ canon_syscalls[syscall_num] = value
+ return [canon_syscalls[syscall_num] for syscall_num in sorted(canon_syscalls)]
+
+ def generate(self, syscalls_path: _Path) -> None:
+ repo_path = _Path(__file__).parent.parent.parent
+ gdb_syscalls_path = repo_path / "gdb" / "linux-record.h"
+ canon_syscalls_path = repo_path / "gdb" / "riscv-canonicalize-syscall-gen.c"
+
+ gdb_syscalls = self._get_gdb_syscalls(gdb_syscalls_path)
+ canon_syscalls_lines = self._get_canon_syscalls_lines(
+ syscalls_path, gdb_syscalls
+ )
+
+ with open(canon_syscalls_path, "w", encoding="UTF-8") as file:
+ file.writelines(head)
+ file.writelines(canon_syscalls_lines)
+ file.writelines(tail)
help_message = """\
@@ -136,28 +144,28 @@ from path to riscv linux syscalls.
def setup_parser() -> argparse.ArgumentParser:
- parser = argparse.ArgumentParser(description=help_message)
- parser.add_argument(
- "-i",
- "--input",
- type=_Path,
- required=True,
- help="path to riscv linux syscalls (glibc/sysdeps/unix/sysv/linux/riscv/rv64/arch-syscall.h)",
- )
- return parser
+ parser = argparse.ArgumentParser(description=help_message)
+ parser.add_argument(
+ "-i",
+ "--input",
+ type=_Path,
+ required=True,
+ help="path to riscv linux syscalls (glibc/sysdeps/unix/sysv/linux/riscv/rv64/arch-syscall.h)",
+ )
+ return parser
def main(argv: list[str]) -> int:
- try:
- parser = setup_parser()
- args = parser.parse_args(argv)
- generator = Generator()
- generator.generate(args.input)
- return 0
- except RuntimeError as e:
- print(str(e))
- return -1
+ try:
+ parser = setup_parser()
+ args = parser.parse_args(argv)
+ generator = Generator()
+ generator.generate(args.input)
+ return 0
+ except RuntimeError as e:
+ print(str(e))
+ return -1
if __name__ == "__main__":
- sys.exit(main(sys.argv[1:]))
+ sys.exit(main(sys.argv[1:]))