about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--.gitignore8
-rw-r--r--.gitmodules7
m---------cpuid0
-rw-r--r--flake.lock150
-rw-r--r--flake.nix198
m---------miasm0
-rw-r--r--nix.shell12
-rw-r--r--pyproject.toml64
-rw-r--r--reproducers/issue-508.c13
-rw-r--r--requirements.txt1
-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-xsrc/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-xtools/verify_qemu.py2
-rw-r--r--uv.lock227
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" },
+]