diff options
| -rw-r--r-- | .gitignore | 8 | ||||
| -rw-r--r-- | .gitmodules | 7 | ||||
| m--------- | cpuid | 0 | ||||
| -rw-r--r-- | flake.lock | 150 | ||||
| -rw-r--r-- | flake.nix | 198 | ||||
| m--------- | miasm | 0 | ||||
| -rw-r--r-- | nix.shell | 12 | ||||
| -rw-r--r-- | pyproject.toml | 64 | ||||
| -rw-r--r-- | reproducers/issue-508.c | 13 | ||||
| -rw-r--r-- | requirements.txt | 1 | ||||
| -rw-r--r-- | src/focaccia/__init__.py (renamed from focaccia/__init__.py) | 0 | ||||
| -rw-r--r-- | src/focaccia/arch/__init__.py (renamed from focaccia/arch/__init__.py) | 0 | ||||
| -rw-r--r-- | src/focaccia/arch/aarch64.py (renamed from focaccia/arch/aarch64.py) | 0 | ||||
| -rw-r--r-- | src/focaccia/arch/arch.py (renamed from focaccia/arch/arch.py) | 0 | ||||
| -rw-r--r-- | src/focaccia/arch/x86.py (renamed from focaccia/arch/x86.py) | 0 | ||||
| -rwxr-xr-x | src/focaccia/cli.py (renamed from focaccia.py) | 0 | ||||
| -rw-r--r-- | src/focaccia/compare.py (renamed from focaccia/compare.py) | 0 | ||||
| -rw-r--r-- | src/focaccia/lldb_target.py (renamed from focaccia/lldb_target.py) | 0 | ||||
| -rw-r--r-- | src/focaccia/match.py (renamed from focaccia/match.py) | 0 | ||||
| -rw-r--r-- | src/focaccia/miasm_util.py (renamed from focaccia/miasm_util.py) | 0 | ||||
| -rw-r--r-- | src/focaccia/parser.py (renamed from focaccia/parser.py) | 0 | ||||
| -rw-r--r-- | src/focaccia/reproducer.py (renamed from focaccia/reproducer.py) | 0 | ||||
| -rw-r--r-- | src/focaccia/snapshot.py (renamed from focaccia/snapshot.py) | 0 | ||||
| -rw-r--r-- | src/focaccia/symbolic.py (renamed from focaccia/symbolic.py) | 0 | ||||
| -rw-r--r-- | src/focaccia/trace.py (renamed from focaccia/trace.py) | 0 | ||||
| -rw-r--r-- | src/focaccia/utils.py (renamed from focaccia/utils.py) | 0 | ||||
| -rw-r--r-- | tests/test_snapshot.py (renamed from test/test_snapshot.py) | 0 | ||||
| -rw-r--r-- | tests/test_sparse_memory.py (renamed from test/test_sparse_memory.py) | 0 | ||||
| -rwxr-xr-x | tools/verify_qemu.py | 2 | ||||
| -rw-r--r-- | uv.lock | 227 |
30 files changed, 663 insertions, 19 deletions
diff --git a/.gitignore b/.gitignore index ea2880a..29bd485 100644 --- a/.gitignore +++ b/.gitignore @@ -14,5 +14,9 @@ __pycache__/ .gdbinit # Focaccia files -qemu.sym -qemu.trace +*.sym +*.trace + +# Nix +result + diff --git a/.gitmodules b/.gitmodules index a6d7f14..d74c6a5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ -[submodule "cpuid"] - path = cpuid - url = https://github.com/flababah/cpuid.py.git +[submodule "miasm"] + path = miasm + url = git@github.com:taugoust/miasm.git + diff --git a/cpuid b/cpuid deleted file mode 160000 -Subproject 335f97a08af46dda14a09f2e825dddbbe7e8177 diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..0343a0a --- /dev/null +++ b/flake.lock @@ -0,0 +1,150 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1749285348, + "narHash": "sha256-frdhQvPbmDYaScPFiCnfdh3B/Vh81Uuoo0w5TkWmmjU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3e3afe5174c561dee0df6f2c2b2236990146329f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-qemu-60": { + "locked": { + "lastModified": 1632168163, + "narHash": "sha256-iS3pBopSl0a2jAXuK/o0L+S86B9v9rnErsJHkNSdZRs=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "f8f124009497b3f9908f395d2533a990feee1de8", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "f8f124009497b3f9908f395d2533a990feee1de8", + "type": "github" + } + }, + "pyproject-build-systems": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "pyproject-nix": [ + "pyproject-nix" + ], + "uv2nix": [ + "uv2nix" + ] + }, + "locked": { + "lastModified": 1749519371, + "narHash": "sha256-UJONN7mA2stweZCoRcry2aa1XTTBL0AfUOY84Lmqhos=", + "owner": "pyproject-nix", + "repo": "build-system-pkgs", + "rev": "7c06967eca687f3482624250428cc12f43c92523", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "build-system-pkgs", + "type": "github" + } + }, + "pyproject-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1746540146, + "narHash": "sha256-QxdHGNpbicIrw5t6U3x+ZxeY/7IEJ6lYbvsjXmcxFIM=", + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "rev": "e09c10c24ebb955125fda449939bfba664c467fd", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "nixpkgs-qemu-60": "nixpkgs-qemu-60", + "pyproject-build-systems": "pyproject-build-systems", + "pyproject-nix": "pyproject-nix", + "uv2nix": "uv2nix" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "uv2nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "pyproject-nix": [ + "pyproject-nix" + ] + }, + "locked": { + "lastModified": 1749170547, + "narHash": "sha256-zOptuFhTr9P0A+unFaOBFx5E5T6yx0qE8VrUGVrM96U=", + "owner": "pyproject-nix", + "repo": "uv2nix", + "rev": "7ae60727d4fc2e41aefd30da665e4f92ba8298f1", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "uv2nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..836a49e --- /dev/null +++ b/flake.nix @@ -0,0 +1,198 @@ +{ + description = "Focaccia: A Symbolic Tester for QEMU"; + + inputs = { + self.submodules = true; + + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + nixpkgs-qemu-60.url = "github:nixos/nixpkgs/f8f124009497b3f9908f395d2533a990feee1de8"; + + flake-utils.url = "github:numtide/flake-utils"; + + pyproject-nix = { + url = "github:pyproject-nix/pyproject.nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + uv2nix = { + url = "github:pyproject-nix/uv2nix"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.pyproject-nix.follows = "pyproject-nix"; + }; + + pyproject-build-systems = { + url = "github:pyproject-nix/build-system-pkgs"; + inputs.uv2nix.follows = "uv2nix"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.pyproject-nix.follows = "pyproject-nix"; + }; + }; + + outputs = inputs@{ + self, + uv2nix, + nixpkgs, + flake-utils, + pyproject-nix, + pyproject-build-systems, + ... + }: + flake-utils.lib.eachDefaultSystem (system: + let + qemu-60 = inputs.nixpkgs-qemu-60.qemu; + + # Refine nixpkgs used in flake to system arch + pkgs = import nixpkgs { + inherit system; + }; + + musl-pkgs = import nixpkgs { + inherit system; + crossSystem = { + config = "x86_64-unknown-linux-musl"; + }; + }; + + # Pin Python version + python = pkgs.python312; + + # Define workspace root and load uv workspace metadata + workspace = uv2nix.lib.workspace.loadWorkspace { workspaceRoot = ./.; }; + + # Create an overlay for Nix that includes extracted Python packages declared as dependencies + # in uv + overlay = workspace.mkPyprojectOverlay { sourcePreference = "wheel"; }; + + editableOverlay = workspace.mkEditablePyprojectOverlay { + # Use environment variable + root = "$REPO_ROOT"; + + members = [ "focaccia" "miasm" ]; + }; + + # Another overlay layer for flake-specific overloads + # This might be needed because uv does not have sufficient metadata + # Here, uv does include metadata about build systems used by each dependency + # Ergo we need to add a nativeBuildInput to miasm because it depends on setuptools for its + # installation + pyprojectOverrides = self: super: { + miasm = super.miasm.overrideAttrs (old: { + nativeBuildInputs = (old.nativeBuildInputs or []) ++ [ self.setuptools ]; + }); + cpuid = super.cpuid.overrideAttrs (old: { + nativeBuildInputs = (old.nativeBuildInputs or []) ++ [ self.setuptools ]; + }); + }; + + pyprojectOverridesEditable = self: super: { + miasm = super.miasm.overrideAttrs (old: { + nativeBuildInputs = (old.nativeBuildInputs or []) ++ [ self.setuptools ]; + + src = pkgs.lib.fileset.toSource { + root = old.src; + fileset = pkgs.lib.fileset.unions [ + (old.src + "/pyproject.toml") + (old.src + "/README.md") + (old.src + "/miasm/__init__.py") + ]; + }; + }); + + cpuid = super.cpuid.overrideAttrs (old: { + nativeBuildInputs = (old.nativeBuildInputs or []) ++ [ self.setuptools ]; + }); + + focaccia = super.focaccia.overrideAttrs (old: { + nativeBuildInputs = (old.nativeBuildInputs or []) ++ + self.resolveBuildSystem { editables = []; }; + + src = pkgs.lib.fileset.toSource { + root = old.src; + fileset = pkgs.lib.fileset.unions [ + (old.src + "/pyproject.toml") + (old.src + "/README.md") + (old.src + "/src/focaccia/__init__.py") + ]; + }; + }); + }; + + # Build a set of Python packages + # The call to callPackage here uses the base package set from pyproject.nix + # We inherit the Python version to ensure that the packages have the same version + # + # The overrideScope here customizes the Python package set with an overlay defined by the + # composition of three overlay functions + pythonSet = (pkgs.callPackage pyproject-nix.build.packages { inherit python; }). + overrideScope (pkgs.lib.composeManyExtensions [ + pyproject-build-systems.overlays.default + overlay + pyprojectOverrides + ]); + + pythonSetEditable = pythonSet.overrideScope ( + pkgs.lib.composeManyExtensions [ + editableOverlay + pyprojectOverridesEditable + ] + ); + + # Create a Python venv with the default dependency group + pythonEnv = pythonSet.mkVirtualEnv "focaccia-env" workspace.deps.default; + + # Create a Python venv with the default dependency group + pythonDevEnv = pythonSetEditable.mkVirtualEnv "focaccia-env" workspace.deps.all; + in { + # Default package just builds Focaccia + packages.default = pythonDevEnv; + + # Default app is just Focaccia + apps.default = { + type = "app"; + program = "${self.packages.default}/bin/focaccia"; + }; + + # Developer shell that includes Focaccia and QEMU + devShells = { + default = pkgs.mkShell { + packages = [ + pythonDevEnv + pkgs.gdb + pkgs.git + ]; + + env = { + UV_NO_SYNC = "1"; + UV_PYTHON = python.interpreter; + UV_PYTHON_DOWNLOADS = "never"; + }; + + shellHook = '' + unset PYTHONPATH + + export REPO_ROOT=$(git rev-parse --show-toplevel) + ''; + }; + + glibc = pkgs.mkShell { + packages = [ + pythonEnv + pkgs.gdb + pkgs.gcc + pkgs.glibc.all + ]; + }; + + musl = pkgs.mkShell { + packages = [ + pythonDevEnv + pkgs.gdb + musl-pkgs.gcc + musl-pkgs.pkg-config + ]; + }; + }; + }); +} + diff --git a/miasm b/miasm new file mode 160000 +Subproject 13f9661aabe44ea4e4f147c32a344a1db128ab1 diff --git a/nix.shell b/nix.shell deleted file mode 100644 index 00fef51..0000000 --- a/nix.shell +++ /dev/null @@ -1,12 +0,0 @@ -{ pkgs ? import <nixpkgs> {} }: -pkgs.mkShell { - nativeBuildInputs = with pkgs; [ - python311 - python311Packages.pip - virtualenv - - gcc gnumake binutils cmake ninja pkg-config - musl qemu swig4 - gdb - ]; -} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..5e16767 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,64 @@ +[project] +name = "focaccia" +version = "0.1.0" +requires-python = "==3.12.*" +description = "Symbolic Tester for QEMU" +readme = {file = "README.md", content-type = "text/markdown"} +authors = [ + {name = "Theofilos Augoustis", email = "theofilos.augoustis@gmail.com"}, + {name = "Christian Krinitsin", email="christian.krinitsin@tum.de"}, + {name = "Sebastian Reimers", email="sebastian.reimers@in.tum.de"}, + {name = "Nicola Crivellin", email="nicola.crivellin98@gmail.com"}, + {name = "Alp Berkman", email="alpberkman@gmail.com"} +] +dependencies = [ + "miasm", + "setuptools", + "lldb-python", + "cpuid @ git+https://github.com/taugoust/cpuid.py.git@master", +] + +[project.optional-dependencies] +dev = [ + "ruff", + "black", + "pyright", +] + +[project.scripts] +focaccia = "focaccia:cli.main" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv.sources] +miasm = { path = "./miasm" } + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.envs.default] +dependencies = [ + "ruff", + "black", + "pyright", +] + +# Formatter +[tool.black] +line-length = 100 +target-version = ["py312"] + +[tool.ruff] +line-length = 100 +exclude = ["__pycache__", "result"] +src = ["src"] + +[tool.pyright] +typeCheckingMode = "standard" +reportMissingImports = true +reportMissingTypeStubs = false +useLibraryCodeForTypes = true +executionEnvironments = [ {root = "src"} ] + diff --git a/reproducers/issue-508.c b/reproducers/issue-508.c new file mode 100644 index 0000000..e143183 --- /dev/null +++ b/reproducers/issue-508.c @@ -0,0 +1,13 @@ +#include <stdio.h> + +int main() { + int mem = 0x12345678; + register long rax asm("rax") = 0x1234567812345678; + register int edi asm("edi") = 0x77777777; + asm("cmpxchg %[edi],%[mem]" + : [ mem ] "+m"(mem), [ rax ] "+r"(rax) + : [ edi ] "r"(edi)); + long rax2 = rax; + printf("rax2 = %lx\n", rax2); +} + diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 220ba8b..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -miasm diff --git a/focaccia/__init__.py b/src/focaccia/__init__.py index e69de29..e69de29 100644 --- a/focaccia/__init__.py +++ b/src/focaccia/__init__.py diff --git a/focaccia/arch/__init__.py b/src/focaccia/arch/__init__.py index 1797176..1797176 100644 --- a/focaccia/arch/__init__.py +++ b/src/focaccia/arch/__init__.py diff --git a/focaccia/arch/aarch64.py b/src/focaccia/arch/aarch64.py index 2e510b9..2e510b9 100644 --- a/focaccia/arch/aarch64.py +++ b/src/focaccia/arch/aarch64.py diff --git a/focaccia/arch/arch.py b/src/focaccia/arch/arch.py index ce5e532..ce5e532 100644 --- a/focaccia/arch/arch.py +++ b/src/focaccia/arch/arch.py diff --git a/focaccia/arch/x86.py b/src/focaccia/arch/x86.py index fefab37..fefab37 100644 --- a/focaccia/arch/x86.py +++ b/src/focaccia/arch/x86.py diff --git a/focaccia.py b/src/focaccia/cli.py index f0c6efe..f0c6efe 100755 --- a/focaccia.py +++ b/src/focaccia/cli.py diff --git a/focaccia/compare.py b/src/focaccia/compare.py index 13f965c..13f965c 100644 --- a/focaccia/compare.py +++ b/src/focaccia/compare.py diff --git a/focaccia/lldb_target.py b/src/focaccia/lldb_target.py index 1f31337..1f31337 100644 --- a/focaccia/lldb_target.py +++ b/src/focaccia/lldb_target.py diff --git a/focaccia/match.py b/src/focaccia/match.py index be88176..be88176 100644 --- a/focaccia/match.py +++ b/src/focaccia/match.py diff --git a/focaccia/miasm_util.py b/src/focaccia/miasm_util.py index a2cd025..a2cd025 100644 --- a/focaccia/miasm_util.py +++ b/src/focaccia/miasm_util.py diff --git a/focaccia/parser.py b/src/focaccia/parser.py index c37c07a..c37c07a 100644 --- a/focaccia/parser.py +++ b/src/focaccia/parser.py diff --git a/focaccia/reproducer.py b/src/focaccia/reproducer.py index 90e1378..90e1378 100644 --- a/focaccia/reproducer.py +++ b/src/focaccia/reproducer.py diff --git a/focaccia/snapshot.py b/src/focaccia/snapshot.py index 1945d71..1945d71 100644 --- a/focaccia/snapshot.py +++ b/src/focaccia/snapshot.py diff --git a/focaccia/symbolic.py b/src/focaccia/symbolic.py index 9aeff56..9aeff56 100644 --- a/focaccia/symbolic.py +++ b/src/focaccia/symbolic.py diff --git a/focaccia/trace.py b/src/focaccia/trace.py index 094358f..094358f 100644 --- a/focaccia/trace.py +++ b/src/focaccia/trace.py diff --git a/focaccia/utils.py b/src/focaccia/utils.py index c4f6a74..c4f6a74 100644 --- a/focaccia/utils.py +++ b/src/focaccia/utils.py diff --git a/test/test_snapshot.py b/tests/test_snapshot.py index ddad410..ddad410 100644 --- a/test/test_snapshot.py +++ b/tests/test_snapshot.py diff --git a/test/test_sparse_memory.py b/tests/test_sparse_memory.py index 4fd9cba..4fd9cba 100644 --- a/test/test_sparse_memory.py +++ b/tests/test_sparse_memory.py diff --git a/tools/verify_qemu.py b/tools/verify_qemu.py index df9f83d..7402852 100755 --- a/tools/verify_qemu.py +++ b/tools/verify_qemu.py @@ -72,7 +72,7 @@ def try_remove(l: list, v): if __name__ == "__main__": prog = make_argparser() - prog.add_argument('--gdb', default='/bin/gdb', + prog.add_argument('--gdb', default='gdb', help='GDB binary to invoke.') args = prog.parse_args() diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..5f752bf --- /dev/null +++ b/uv.lock @@ -0,0 +1,227 @@ +version = 1 +revision = 2 +requires-python = "==3.12.*" + +[[package]] +name = "black" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449, upload-time = "2025-01-29T04:15:40.373Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988, upload-time = "2025-01-29T05:37:16.707Z" }, + { url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985, upload-time = "2025-01-29T05:37:18.273Z" }, + { url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816, upload-time = "2025-01-29T04:18:33.823Z" }, + { url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860, upload-time = "2025-01-29T04:19:12.944Z" }, + { url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646, upload-time = "2025-01-29T04:15:38.082Z" }, +] + +[[package]] +name = "click" +version = "8.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "cpuid" +version = "1.0.0" +source = { git = "https://github.com/taugoust/cpuid.py.git?rev=master#2e616fa20a9eea8506259abc4be7dce7fe92f754" } +dependencies = [ + { name = "setuptools" }, +] + +[[package]] +name = "focaccia" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "cpuid" }, + { name = "lldb-python" }, + { name = "miasm" }, + { name = "setuptools" }, +] + +[package.optional-dependencies] +dev = [ + { name = "black" }, + { name = "pyright" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "black", marker = "extra == 'dev'" }, + { name = "cpuid", git = "https://github.com/taugoust/cpuid.py.git?rev=master" }, + { name = "lldb-python" }, + { name = "miasm", directory = "miasm" }, + { name = "pyright", marker = "extra == 'dev'" }, + { name = "ruff", marker = "extra == 'dev'" }, + { name = "setuptools" }, +] +provides-extras = ["dev"] + +[[package]] +name = "future" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/b2/4140c69c6a66432916b26158687e821ba631a4c9273c474343badf84d3ba/future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05", size = 1228490, upload-time = "2024-02-21T11:52:38.461Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216", size = 491326, upload-time = "2024-02-21T11:52:35.956Z" }, +] + +[[package]] +name = "lldb-python" +version = "19.0.0.dev1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/c2/072fb4010fe1007b12759170469a1511aa5eeb0e8748531d7c7e6bb56e20/lldb_python-19.0.0.dev1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d52209a57d4fed341fac63ca137a0c52fead1d5a48fd88e412643ea616b94b9b", size = 38533603, upload-time = "2024-04-24T10:35:47.259Z" }, + { url = "https://files.pythonhosted.org/packages/67/c7/3b273318f362a850e0aaefa03996901307e0f520196874dba6164b7df65f/lldb_python-19.0.0.dev1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:5ee902f27544cd67eb12c135e65b9a11b4c1d59a0ce156fb1480e90a2f621ac4", size = 52213200, upload-time = "2024-04-24T10:35:51.163Z" }, +] + +[[package]] +name = "miasm" +version = "0.1.4" +source = { directory = "miasm" } +dependencies = [ + { name = "future" }, + { name = "pyparsing" }, + { name = "setuptools" }, +] + +[package.metadata] +requires-dist = [ + { name = "future" }, + { name = "pyparsing" }, + { name = "setuptools" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload-time = "2025-03-25T05:01:28.114Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload-time = "2025-03-25T05:01:24.908Z" }, +] + +[[package]] +name = "pyright" +version = "1.1.402" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nodeenv" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/04/ce0c132d00e20f2d2fb3b3e7c125264ca8b909e693841210534b1ea1752f/pyright-1.1.402.tar.gz", hash = "sha256:85a33c2d40cd4439c66aa946fd4ce71ab2f3f5b8c22ce36a623f59ac22937683", size = 3888207, upload-time = "2025-06-11T08:48:35.759Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/37/1a1c62d955e82adae588be8e374c7f77b165b6cb4203f7d581269959abbc/pyright-1.1.402-py3-none-any.whl", hash = "sha256:2c721f11869baac1884e846232800fe021c33f1b4acb3929cff321f7ea4e2982", size = 5624004, upload-time = "2025-06-11T08:48:33.998Z" }, +] + +[[package]] +name = "ruff" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/90/5255432602c0b196a0da6720f6f76b93eb50baef46d3c9b0025e2f9acbf3/ruff-0.12.0.tar.gz", hash = "sha256:4d047db3662418d4a848a3fdbfaf17488b34b62f527ed6f10cb8afd78135bc5c", size = 4376101, upload-time = "2025-06-17T15:19:26.217Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/fd/b46bb20e14b11ff49dbc74c61de352e0dc07fb650189513631f6fb5fc69f/ruff-0.12.0-py3-none-linux_armv6l.whl", hash = "sha256:5652a9ecdb308a1754d96a68827755f28d5dfb416b06f60fd9e13f26191a8848", size = 10311554, upload-time = "2025-06-17T15:18:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/e7/d3/021dde5a988fa3e25d2468d1dadeea0ae89dc4bc67d0140c6e68818a12a1/ruff-0.12.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:05ed0c914fabc602fc1f3b42c53aa219e5736cb030cdd85640c32dbc73da74a6", size = 11118435, upload-time = "2025-06-17T15:18:49.064Z" }, + { url = "https://files.pythonhosted.org/packages/07/a2/01a5acf495265c667686ec418f19fd5c32bcc326d4c79ac28824aecd6a32/ruff-0.12.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:07a7aa9b69ac3fcfda3c507916d5d1bca10821fe3797d46bad10f2c6de1edda0", size = 10466010, upload-time = "2025-06-17T15:18:51.341Z" }, + { url = "https://files.pythonhosted.org/packages/4c/57/7caf31dd947d72e7aa06c60ecb19c135cad871a0a8a251723088132ce801/ruff-0.12.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7731c3eec50af71597243bace7ec6104616ca56dda2b99c89935fe926bdcd48", size = 10661366, upload-time = "2025-06-17T15:18:53.29Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ba/aa393b972a782b4bc9ea121e0e358a18981980856190d7d2b6187f63e03a/ruff-0.12.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:952d0630eae628250ab1c70a7fffb641b03e6b4a2d3f3ec6c1d19b4ab6c6c807", size = 10173492, upload-time = "2025-06-17T15:18:55.262Z" }, + { url = "https://files.pythonhosted.org/packages/d7/50/9349ee777614bc3062fc6b038503a59b2034d09dd259daf8192f56c06720/ruff-0.12.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c021f04ea06966b02614d442e94071781c424ab8e02ec7af2f037b4c1e01cc82", size = 11761739, upload-time = "2025-06-17T15:18:58.906Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/ad459de67c70ec112e2ba7206841c8f4eb340a03ee6a5cabc159fe558b8e/ruff-0.12.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7d235618283718ee2fe14db07f954f9b2423700919dc688eacf3f8797a11315c", size = 12537098, upload-time = "2025-06-17T15:19:01.316Z" }, + { url = "https://files.pythonhosted.org/packages/ed/50/15ad9c80ebd3c4819f5bd8883e57329f538704ed57bac680d95cb6627527/ruff-0.12.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0758038f81beec8cc52ca22de9685b8ae7f7cc18c013ec2050012862cc9165", size = 12154122, upload-time = "2025-06-17T15:19:03.727Z" }, + { url = "https://files.pythonhosted.org/packages/76/e6/79b91e41bc8cc3e78ee95c87093c6cacfa275c786e53c9b11b9358026b3d/ruff-0.12.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:139b3d28027987b78fc8d6cfb61165447bdf3740e650b7c480744873688808c2", size = 11363374, upload-time = "2025-06-17T15:19:05.875Z" }, + { url = "https://files.pythonhosted.org/packages/db/c3/82b292ff8a561850934549aa9dc39e2c4e783ab3c21debe55a495ddf7827/ruff-0.12.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68853e8517b17bba004152aebd9dd77d5213e503a5f2789395b25f26acac0da4", size = 11587647, upload-time = "2025-06-17T15:19:08.246Z" }, + { url = "https://files.pythonhosted.org/packages/2b/42/d5760d742669f285909de1bbf50289baccb647b53e99b8a3b4f7ce1b2001/ruff-0.12.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3a9512af224b9ac4757f7010843771da6b2b0935a9e5e76bb407caa901a1a514", size = 10527284, upload-time = "2025-06-17T15:19:10.37Z" }, + { url = "https://files.pythonhosted.org/packages/19/f6/fcee9935f25a8a8bba4adbae62495c39ef281256693962c2159e8b284c5f/ruff-0.12.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b08df3d96db798e5beb488d4df03011874aff919a97dcc2dd8539bb2be5d6a88", size = 10158609, upload-time = "2025-06-17T15:19:12.286Z" }, + { url = "https://files.pythonhosted.org/packages/37/fb/057febf0eea07b9384787bfe197e8b3384aa05faa0d6bd844b94ceb29945/ruff-0.12.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6a315992297a7435a66259073681bb0d8647a826b7a6de45c6934b2ca3a9ed51", size = 11141462, upload-time = "2025-06-17T15:19:15.195Z" }, + { url = "https://files.pythonhosted.org/packages/10/7c/1be8571011585914b9d23c95b15d07eec2d2303e94a03df58294bc9274d4/ruff-0.12.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1e55e44e770e061f55a7dbc6e9aed47feea07731d809a3710feda2262d2d4d8a", size = 11641616, upload-time = "2025-06-17T15:19:17.6Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ef/b960ab4818f90ff59e571d03c3f992828d4683561095e80f9ef31f3d58b7/ruff-0.12.0-py3-none-win32.whl", hash = "sha256:7162a4c816f8d1555eb195c46ae0bd819834d2a3f18f98cc63819a7b46f474fb", size = 10525289, upload-time = "2025-06-17T15:19:19.688Z" }, + { url = "https://files.pythonhosted.org/packages/34/93/8b16034d493ef958a500f17cda3496c63a537ce9d5a6479feec9558f1695/ruff-0.12.0-py3-none-win_amd64.whl", hash = "sha256:d00b7a157b8fb6d3827b49d3324da34a1e3f93492c1f97b08e222ad7e9b291e0", size = 11598311, upload-time = "2025-06-17T15:19:21.785Z" }, + { url = "https://files.pythonhosted.org/packages/d0/33/4d3e79e4a84533d6cd526bfb42c020a23256ae5e4265d858bd1287831f7d/ruff-0.12.0-py3-none-win_arm64.whl", hash = "sha256:8cd24580405ad8c1cc64d61725bca091d6b6da7eb3d36f72cc605467069d7e8b", size = 10724946, upload-time = "2025-06-17T15:19:23.952Z" }, +] + +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/bc/51647cd02527e87d05cb083ccc402f93e441606ff1f01739a62c8ad09ba5/typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", size = 107423, upload-time = "2025-06-02T14:52:11.399Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/e0/552843e0d356fbb5256d21449fa957fa4eff3bbc135a74a691ee70c7c5da/typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af", size = 43839, upload-time = "2025-06-02T14:52:10.026Z" }, +] |