diff options
| -rw-r--r-- | flake.nix | 40 | ||||
| -rw-r--r-- | src/focaccia/tools/_qemu_tool.py | 4 | ||||
| -rwxr-xr-x | src/focaccia/tools/validate_qemu.py | 26 |
3 files changed, 44 insertions, 26 deletions
diff --git a/flake.nix b/flake.nix index b199e83..83bb5a1 100644 --- a/flake.nix +++ b/flake.nix @@ -129,6 +129,7 @@ focaccia = super.focaccia.overrideAttrs (old: { nativeBuildInputs = (old.nativeBuildInputs or []) ++ + [ pkgs.lldb ] ++ self.resolveBuildSystem { editables = []; }; src = pkgs.lib.fileset.toSource { @@ -198,11 +199,22 @@ export REPO_ROOT=$(git rev-parse --show-toplevel) ''; + + gdbInternal = pkgs.gdb.override { python3 = python; }; in rec { # Default package just builds Focaccia packages = rec { - focaccia = pythonEnv; - dev = pythonDevEnv; + focaccia = pythonEnv.overrideAttrs (old: { + propagatedBuildInputs = (old.propagatedBuildInputs or []) ++ [ pkgs.lldb ]; + }); + + dev = pythonDevEnv.overrideAttrs (old: { + propagatedBuildInputs = (old.propagatedBuildInputs or []) ++ [ + pkgs.uv + pkgs.lldb + gdbInternal # TODO keep this internal somehow + ]; + }); default = focaccia; }; @@ -211,22 +223,27 @@ apps = { default = { type = "app"; - program = "${packages.default}/bin/focaccia"; + program = "${packages.focaccia}/bin/focaccia"; }; convert-log = { type = "app"; - program = "${packages.default}/bin/convert"; + program = "${packages.focaccia}/bin/convert"; }; capture-transforms = { type = "app"; - program = "${packages.default}/bin/capture-transforms"; + program = "${packages.focaccia}/bin/capture-transforms"; }; validate-qemu = { type = "app"; - program = "${packages.default}/bin/validate-qemu"; + # program = "${packages.focaccia}/bin/validate-qemu"; + program = let + wrapper = pkgs.writeShellScriptBin "validate-qemu" '' + exec ${packages.focaccia}/bin/validate-qemu --gdb "${gdbInternal}/bin/gdb" "$@" + ''; + in "${wrapper}/bin/validate-qemu"; }; # Useful for synchronize the uv lockfile @@ -242,12 +259,7 @@ # Developer shell that includes Focaccia and QEMU devShells = { default = pkgs.mkShell { - packages = [ - packages.dev - pkgs.uv - pkgs.gdb - pkgs.git - ]; + packages = [ packages.dev ]; env = uvEnv; shellHook = uvShellHook; @@ -256,8 +268,6 @@ glibc = pkgs.mkShell { packages = [ packages.dev - pkgs.uv - pkgs.gdb pkgs.gcc pkgs.glibc.all ]; @@ -269,8 +279,6 @@ musl = pkgs.mkShell { packages = [ packages.dev - pkgs.uv - pkgs.gdb musl-pkgs.gcc musl-pkgs.pkg-config ]; diff --git a/src/focaccia/tools/_qemu_tool.py b/src/focaccia/tools/_qemu_tool.py index b365d39..fb23844 100644 --- a/src/focaccia/tools/_qemu_tool.py +++ b/src/focaccia/tools/_qemu_tool.py @@ -2,7 +2,7 @@ gdb -n --batch -x qemu_tool.py -But please use `tools/verify_qemu.py` instead because we have some more setup +But please use `tools/validate_qemu.py` instead because we have some more setup work to do. """ @@ -18,7 +18,7 @@ from focaccia.symbolic import SymbolicTransform, eval_symbol, ExprMem from focaccia.trace import Trace, TraceEnvironment from focaccia.utils import print_result -from verify_qemu import make_argparser, verbosity +from validate_qemu import make_argparser, verbosity class GDBProgramState(ReadableProgramState): from focaccia.arch import aarch64, x86 diff --git a/src/focaccia/tools/validate_qemu.py b/src/focaccia/tools/validate_qemu.py index f5d0bb2..b59809e 100755 --- a/src/focaccia/tools/validate_qemu.py +++ b/src/focaccia/tools/validate_qemu.py @@ -6,20 +6,20 @@ Spawn GDB, connect to QEMU's GDB server, and read test states from that. We need two scripts (this one and the primary `qemu_tool.py`) because we can't pass arguments to scripts executed via `gdb -x <script>`. -This script (`verify_qemu.py`) is the one the user interfaces with. It +This script (`validate_qemu.py`) is the one the user interfaces with. It eventually calls `execv` to spawn a GDB process that calls the main -`qemu_tool.py` script; `python verify_qemu.py` essentially behaves as if +`qemu_tool.py` script; `python validate_qemu.py` essentially behaves as if something like `gdb --batch -x qemu_tool.py` were executed instead. Before it starts GDB, though, it parses command line arguments and applies some weird but necessary logic to pass them to `qemu_tool.py`. """ -import argparse import os -import subprocess import sys +import argparse +import sysconfig +import subprocess -import focaccia from focaccia.compare import ErrorTypes verbosity = { @@ -77,8 +77,8 @@ def main(): help='GDB binary to invoke.') args = prog.parse_args() - filepath = focaccia.__file__ - qemu_tool_path = os.path.join(os.path.dirname(filepath), '_qemu_tool.py') + script_dirname = os.path.dirname(__file__) + qemu_tool_path = os.path.join(script_dirname, '_qemu_tool.py') # We have to remove all arguments we don't want to pass to the qemu tool # manually here. Not nice, but what can you do.. @@ -92,6 +92,14 @@ def main(): argv_str = f'[{", ".join(quoted(a) for a in argv)}]' path_str = f'[{", ".join(quoted(s) for s in sys.path)}]' + paths = sysconfig.get_paths() + candidates = [paths["purelib"], paths["platlib"]] + entries = [p for p in candidates if p and os.path.isdir(p)] + venv_site = entries[0] + env = os.environ.copy() + env["PYTHONPATH"] = ','.join([script_dirname, venv_site]) + + print(f"GDB started with Python Path: {env['PYTHONPATH']}") gdb_cmd = [ args.gdb, '-nx', # Don't parse any .gdbinits @@ -99,9 +107,11 @@ def main(): '-ex', f'py import sys', '-ex', f'py sys.argv = {argv_str}', '-ex', f'py sys.path = {path_str}', + "-ex", f"py import site; site.addsitedir({venv_site!r})", + "-ex", f"py import site; site.addsitedir({script_dirname!r})", '-x', qemu_tool_path ] - proc = subprocess.Popen(gdb_cmd) + proc = subprocess.Popen(gdb_cmd, env=env) ret = proc.wait() exit(ret) |