From 7535fb29aeb314f71bd491dade2ecebcd3c67179 Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Thu, 12 Mar 2026 15:15:15 +0100 Subject: [PATCH] split justfile into nixos.just + mars.just --- fail.just | 107 +++++++++++++++++++++++++++++++ flake.nix | 2 + mars.just | 25 ++++++++ justfile => nixos.just | 140 ++++++----------------------------------- 4 files changed, 153 insertions(+), 121 deletions(-) create mode 100644 fail.just create mode 100644 mars.just rename justfile => nixos.just (68%) diff --git a/fail.just b/fail.just new file mode 100644 index 0000000..23fc5c4 --- /dev/null +++ b/fail.just @@ -0,0 +1,107 @@ +[doc("Trace a golden run using FAIL*")] +[group("fail")] +trace module: + {{ BOCHS_RUNNER }} \ + -V {{ FAIL_SHARE }}/vgabios.bin \ + -b {{ FAIL_SHARE }}/BIOS-bochs-latest \ + -1 \ + -f {{ FAIL_TRACE }} \ + -e {{ BUILD_DIR }}-{{ module }}/system.elf \ + -i {{ BUILD_DIR }}-{{ module }}/system.iso \ + -- \ + -Wf,--start-symbol=start_trace \ + -Wf,--save-symbol=start_trace \ + -Wf,--end-symbol=stop_trace \ + -Wf,--state-file={{ BUILD_DIR }}-{{ module }}/state \ + -Wf,--trace-file={{ BUILD_DIR }}-{{ module }}/trace.pb \ + -Wf,--elf-file={{ BUILD_DIR }}-{{ module }}/system.elf + @echo "Next step: \"just import {{ module }}\"" + +# [doc("Dump a FAIL* golden run trace")] +# [group("fail")] +# dump module: +# {{ FAIL_DUMP }} {{ BUILD_DIR }}-{{ module }}/trace.pb + +[doc("Import a FAIL* golden run trace")] +[group("fail")] +import module: + {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ + -i MemoryImporter \ + -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b mem + {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ + -i RegisterImporter \ + -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b regs --flags + {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ + -i RegisterImporter \ + -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b ip --no-gp --ip + + {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ + -i ElfImporter --objdump objdump \ + -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b ip + {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ + -i ElfImporter --objdump objdump \ + -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b mem + {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ + -i ElfImporter --objdump objdump \ + -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b regs + + {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ + -i ElfImporter --objdump objdump \ + -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b ip --sources + {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ + -i ElfImporter --objdump objdump \ + -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b mem --sources + {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ + -i ElfImporter --objdump objdump \ + -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b regs --sources + + {{ FAIL_PRUNE }} --database-option-file ./db.conf -v {{ module }} -b %% --overwrite + @echo "Next step: \"just server {{ module }}\"" + +[doc("Start the FAIL* campaign server")] +[group("fail")] +server module: + {{ FAIL_SERVER }} --database-option-file ./db.conf -v {{ module }} -b % --inject-single-bit --inject-registers & + @echo "Next step: \"just client {{ module }}\"" + +[doc("Stop the FAIL* campaign server")] +[group("fail")] +stop-server: + pkill -f {{ FAIL_SERVER }} + +[doc("Start a FAIL* campaign client")] +[group("fail")] +client module: + {{ BOCHS_RUNNER }} \ + -V {{ FAIL_SHARE }}/vgabios.bin \ + -b {{ FAIL_SHARE }}/BIOS-bochs-latest \ + -f {{ FAIL_INJECT }} \ + -e {{ BUILD_DIR }}-{{ module }}/system.elf \ + -i {{ BUILD_DIR }}-{{ module }}/system.iso \ + -j {{ num_cpus() }} \ + -- \ + -Wf,--state-dir={{ BUILD_DIR }}-{{ module }}/state \ + -Wf,--trap \ + -Wf,--timeout=500000 \ + -Wf,--ok-marker=ok_marker \ + -Wf,--fail-marker=fail_marker \ + > /dev/null + @echo "Next step: \"just result {{ module }}\" or \"just resultbrowser\"" + +[doc("Query FAIL* marker statistics from the database")] +[group("fail")] +result module: + @echo "select variant, benchmark, resulttype, sum(t.time2 - t.time1 + 1) as faults \ + FROM variant v \ + JOIN trace t ON v.id = t.variant_id \ + JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_address = t.data_address \ + JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id \ + JOIN fsppilot p ON r.pilot_id = p.id \ + WHERE v.variant = \"{{ module }}\" \ + GROUP BY v.id, resulttype \ + ORDER BY variant, benchmark, resulttype;" | mariadb --defaults-file=./db.conf -t + +[doc("Start the FAIL* resultbrowser")] +[group("fail")] +resultbrowser: + {{ RESULT_BROWSER }} -c ./db.conf --host=0.0.0.0 --port=5000 diff --git a/flake.nix b/flake.nix index 2d3bfb5..f61e3f8 100644 --- a/flake.nix +++ b/flake.nix @@ -459,6 +459,8 @@ rec { # Dynamic libraries from buildinputs: # LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs; + JUST_JUSTFILE = "./nixos.just"; + # Those are read by the justfile FAIL_SHARE = "${fail-bin}/share"; WASI_ROOT = wasi-sdk; diff --git a/mars.just b/mars.just new file mode 100644 index 0000000..4232269 --- /dev/null +++ b/mars.just @@ -0,0 +1,25 @@ +import "fail.just" + +BUILD_DIR := "build" + +# FAIL* variables + +FAIL_BIN := "bin" +FAIL_SHARE := "share" +BOCHS_RUNNER := f"{{FAIL_BIN}}/bochs-experiment-runner.py" +FAIL_TRACE := f"{{FAIL_BIN}}/fail-x86-tracing" +FAIL_DUMP := f"{{FAIL_BIN}}/dump-trace" +FAIL_IMPORT := f"{{FAIL_BIN}}/import-trace" +FAIL_PRUNE := f"{{FAIL_BIN}}/prune-trace" +FAIL_SERVER := f"{{FAIL_BIN}}/generic-experiment-server" +FAIL_INJECT := f"{{FAIL_BIN}}/generic-experiment-client" +RESULT_BROWSER := f"{{FAIL_BIN}}/resultbrowser.py" + +# =================================================================================================================== # +# Helper recipes +# =================================================================================================================== # + +[default] +[private] +list: + @just --list --unsorted diff --git a/justfile b/nixos.just similarity index 68% rename from justfile rename to nixos.just index a6e055f..6138fe4 100644 --- a/justfile +++ b/nixos.just @@ -1,3 +1,5 @@ +import "fail.just" + BUILD_DIR := "build" # Load environment variables set by "nix develop"-shell @@ -12,6 +14,17 @@ LIBIWASM_LINUX_RELEASE := env("LIBIWASM_LINUX_RELEASE") CROSS_CC := env("CROSS_CC") LINUX_CC := env("LINUX_CC") +# FAIL* variables + +BOCHS_RUNNER := "bochs-experiment-runner.py" +FAIL_TRACE := "fail-x86-tracing" +FAIL_DUMP := "dump-trace" +FAIL_IMPORT := "import-trace" +FAIL_PRUNE := "prune-trace" +FAIL_SERVER := "generic-experiment-server" +FAIL_INJECT := "generic-experiment-client" +RESULT_BROWSER := "resultbrowser.py" + # =================================================================================================================== # # Helper recipes # =================================================================================================================== # @@ -310,127 +323,6 @@ stop-db: remove-db: docker container rm fail-db -# =================================================================================================================== # -# FAIL* recipes -# =================================================================================================================== # - -BOCHS_RUNNER := "bochs-experiment-runner.py" -FAIL_TRACE := "fail-x86-tracing" -FAIL_DUMP := "dump-trace" -FAIL_IMPORT := "import-trace" -FAIL_PRUNE := "prune-trace" -FAIL_SERVER := "generic-experiment-server" -FAIL_INJECT := "generic-experiment-client" -RESULT_BROWSER := "resultbrowser.py" - -[doc("Trace a golden run using FAIL*")] -[group("fail")] -trace module: - {{ BOCHS_RUNNER }} \ - -V {{ FAIL_SHARE }}/vgabios.bin \ - -b {{ FAIL_SHARE }}/BIOS-bochs-latest \ - -1 \ - -f {{ FAIL_TRACE }} \ - -e {{ BUILD_DIR }}-{{ module }}/system.elf \ - -i {{ BUILD_DIR }}-{{ module }}/system.iso \ - -- \ - -Wf,--start-symbol=start_trace \ - -Wf,--save-symbol=start_trace \ - -Wf,--end-symbol=stop_trace \ - -Wf,--state-file={{ BUILD_DIR }}-{{ module }}/state \ - -Wf,--trace-file={{ BUILD_DIR }}-{{ module }}/trace.pb \ - -Wf,--elf-file={{ BUILD_DIR }}-{{ module }}/system.elf - @echo "Next step: \"just import {{ module }}\"" - -# [doc("Dump a FAIL* golden run trace")] -# [group("fail")] -# dump module: -# {{ FAIL_DUMP }} {{ BUILD_DIR }}-{{ module }}/trace.pb - -[doc("Import a FAIL* golden run trace")] -[group("fail")] -import module: - {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ - -i MemoryImporter \ - -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b mem - {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ - -i RegisterImporter \ - -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b regs --flags - {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ - -i RegisterImporter \ - -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b ip --no-gp --ip - - {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ - -i ElfImporter --objdump objdump \ - -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b ip - {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ - -i ElfImporter --objdump objdump \ - -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b mem - {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ - -i ElfImporter --objdump objdump \ - -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b regs - - {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ - -i ElfImporter --objdump objdump \ - -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b ip --sources - {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ - -i ElfImporter --objdump objdump \ - -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b mem --sources - {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \ - -i ElfImporter --objdump objdump \ - -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b regs --sources - - {{ FAIL_PRUNE }} --database-option-file ./db.conf -v {{ module }} -b %% --overwrite - @echo "Next step: \"just server {{ module }}\"" - -[doc("Start the FAIL* campaign server")] -[group("fail")] -server module: - {{ FAIL_SERVER }} --database-option-file ./db.conf -v {{ module }} -b % --inject-single-bit --inject-registers & - @echo "Next step: \"just client {{ module }}\"" - -[doc("Stop the FAIL* campaign server")] -[group("fail")] -stop-server: - pkill -f {{ FAIL_SERVER }} - -[doc("Start a FAIL* campaign client")] -[group("fail")] -client module: - {{ BOCHS_RUNNER }} \ - -V {{ FAIL_SHARE }}/vgabios.bin \ - -b {{ FAIL_SHARE }}/BIOS-bochs-latest \ - -f {{ FAIL_INJECT }} \ - -e {{ BUILD_DIR }}-{{ module }}/system.elf \ - -i {{ BUILD_DIR }}-{{ module }}/system.iso \ - -j {{ num_cpus() }} \ - -- \ - -Wf,--state-dir={{ BUILD_DIR }}-{{ module }}/state \ - -Wf,--trap \ - -Wf,--timeout=500000 \ - -Wf,--ok-marker=ok_marker \ - -Wf,--fail-marker=fail_marker \ - > /dev/null - @echo "Next step: \"just result {{ module }}\" or \"just resultbrowser\"" - -[doc("Query FAIL* marker statistics from the database")] -[group("fail")] -result module: - @echo "select variant, benchmark, resulttype, sum(t.time2 - t.time1 + 1) as faults \ - FROM variant v \ - JOIN trace t ON v.id = t.variant_id \ - JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_address = t.data_address \ - JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id \ - JOIN fsppilot p ON r.pilot_id = p.id \ - WHERE v.variant = \"{{ module }}\" \ - GROUP BY v.id, resulttype \ - ORDER BY variant, benchmark, resulttype;" | mariadb --defaults-file=./db.conf -t - -[doc("Start the FAIL* resultbrowser")] -[group("fail")] -resultbrowser: - {{ RESULT_BROWSER }} -c ./db.conf --host=0.0.0.0 --port=5000 - # =================================================================================================================== # # Debugging recipes # =================================================================================================================== # @@ -454,8 +346,14 @@ radare module: # AIO # =================================================================================================================== # +[group("just do it")] +upload module: + scp -r {{ BUILD_DIR }}-{{ module }} mars:~/Documents/failnix/{{ BUILD_DIR }}-{{ module }} + +[group("just do it")] build module target="fail": (build-iso module target) +[group("just do it")] inject module: just clean {{ module }} just build {{ module }} "fail"