diff --git a/flake.nix b/flake.nix index 553f436..3c5172e 100644 --- a/flake.nix +++ b/flake.nix @@ -526,7 +526,7 @@ rec { # LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs; JUST_WORKING_DIRECTORY = "/home/christoph/Notes/TU/MastersThesis/FailNix"; - JUST_JUSTFILE = "/home/christoph/Notes/TU/MastersThesis/FailNix/scripts/nixos.just"; + JUST_JUSTFILE = "/home/christoph/Notes/TU/MastersThesis/FailNix/scripts/build.just"; # Those are read by the justfile FAIL_SHARE = "${fail-bin}/share"; diff --git a/scripts/wasm.just b/scripts/build.just similarity index 79% rename from scripts/wasm.just rename to scripts/build.just index e4ab237..7347b77 100644 --- a/scripts/wasm.just +++ b/scripts/build.just @@ -1,3 +1,91 @@ +BUILD_DIR := "build" + +# Load environment variables set by "nix develop"-shell + +WASI_ROOT := env("WASI_ROOT") +WAMR_ROOT := env("WAMR_ROOT") +LIBIWASM_DEBUG := env("LIBIWASM_DEBUG") +LIBIWASM_RELEASE := env("LIBIWASM_RELEASE") +LIBIWASM_MMAP_DEBUG := env("LIBIWASM_MMAP_DEBUG") +LIBIWASM_MMAP_RELEASE := env("LIBIWASM_MMAP_RELEASE") +LIBIWASM_LINUX_DEBUG := env("LIBIWASM_LINUX_DEBUG") +LIBIWASM_LINUX_RELEASE := env("LIBIWASM_LINUX_RELEASE") +CROSS_CC := env("CROSS_CC") +LINUX_CC := env("LINUX_CC") + +# =================================================================================================================== # +# Helper recipes +# =================================================================================================================== # + +[default] +[private] +list: + @just --list + +[private] +create-build-dir module: + mkdir -p {{ BUILD_DIR }}-{{ module }} + +[doc("Delete the build directory")] +clean module: + rm -rf {{ BUILD_DIR }}-{{ module }} + +# =================================================================================================================== # +# Just do it +# =================================================================================================================== # +# Somehow this breaks the syntax highlighting: +# [arg("mode", pattern="c|aot|interp", help="Which WASM mode to use")] +# [arg("target", pattern="fail|linux|linux-baremetal", help="Which platform to compile for")] + +[doc("Perform all steps for a fail/linux/linux-bm build with aot/interp WASM")] +[group("5: just do it")] +build module="__help" target="fail" mode="aot": + #!/usr/bin/env sh + + if [ "{{ module }}" = "__help" ]; then + just --usage build + exit 0 + fi + + just clean {{ module }} + just create-build-dir {{ module }} + just copy-auxiliary {{ module }} + + if [ "{{ mode }}" = "aot" ]; then + just build-wasm-module {{ module }} + just build-wasm-aot {{ module }} {{ target }} + just build-wasm-aot-array {{ module }} + + just prepare-aot-host {{ module }} + just build-wasm-host {{ module }} {{ target }} + + just build-system-startup {{ module }} {{ target }} + just build-system-syscalls {{ module }} {{ target }} + just link-system {{ module }} {{ target }} + elif [ "{{ mode }}" = "interp" ]; then + just build-wasm-module {{ module }} + just build-wasm-interp-array {{ module }} + + just prepare-interp-host {{ module }} + just build-wasm-host {{ module }} {{ target }} + + just build-system-startup {{ module }} {{ target }} + just build-system-syscalls {{ module }} {{ target }} + just link-system {{ module }} {{ target }} + elif [ "{{ mode }}" = "c" ]; then + just build-c-module {{ module }} {{ target }} + + just build-c-host {{ module }} {{ target }} + + just build-system-startup {{ module }} {{ target }} + just link-c-system {{ module }} {{ target }} + else + echo "unknown mode: {{ mode }}" >&2 + exit 1 + fi + + just build-iso {{ module }} + # =================================================================================================================== # # Build WASM module recipes # =================================================================================================================== # @@ -48,7 +136,7 @@ LINUX_LDFLAGS_NOWASM := "\ -lm \ " WAMRC := "wamrc" -WAMR_USE_XIP := env_var_or_default("WAMR_USE_XIP", "false") +WAMR_USE_XIP := env("WAMR_USE_XIP", "false") CROSS_WAMRCFLAGS := "\ --target=i386 \ --cpu=generic \ @@ -131,7 +219,7 @@ build-c-module module target="fail": copy-auxiliary module: cp flake.nix {{ BUILD_DIR }}-{{ module }}/flake.nix cp scripts/runner.pl {{ BUILD_DIR }}-{{ module }}/runner.pl - cp scripts/wasm.just {{ BUILD_DIR }}-{{ module }}/wasm.just + cp scripts/build.just {{ BUILD_DIR }}-{{ module }}/wasm.just cp targets/lib.h {{ BUILD_DIR }}-{{ module }}/lib.h cp targets/linker.ld {{ BUILD_DIR }}-{{ module }}/linker.ld cp targets/startup.s {{ BUILD_DIR }}-{{ module }}/startup.s @@ -143,7 +231,7 @@ copy-auxiliary module: # =================================================================================================================== # # FAIL* -WAMR_USE_MMAP := env_var_or_default("WAMR_USE_MMAP", "false") +WAMR_USE_MMAP := env("WAMR_USE_MMAP", "false") ACTIVE_LIBIWASM_DEBUG := if WAMR_USE_MMAP == "true" { LIBIWASM_MMAP_DEBUG } else { LIBIWASM_DEBUG } CROSS_CFLAGS := f"-I./targets/wasm-host {{CROSS_CFLAGS_NOWASM}}" CROSS_LDFLAGS := f"-L{{ACTIVE_LIBIWASM_DEBUG}} -liwasm {{CROSS_LDFLAGS_NOWASM}}" diff --git a/scripts/fail.just b/scripts/fail.just deleted file mode 100644 index e5c1a9f..0000000 --- a/scripts/fail.just +++ /dev/null @@ -1,134 +0,0 @@ -[doc("Trace a golden run using FAIL*")] -[group("4: 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=fail_start_trace \ - -Wf,--save-symbol=fail_start_trace \ - -Wf,--end-symbol=fail_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("4: 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("4: fail")] -server module: - {{ FAIL_SERVER }} \ - --port {{ FAIL_SERVER_PORT }} \ - --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("4: fail")] -stop-server: - pkill -f {{ FAIL_SERVER }} - -[doc("Start a FAIL* campaign client")] -[group("4: fail")] -client module: - # -Wf,--catch-write-textsegment - # -Wf,--catch-outerspace - {{ 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,--server-port={{ FAIL_SERVER_PORT }} \ - -Wf,--state-dir={{ BUILD_DIR }}-{{ module }}/state \ - -Wf,--trap \ - -Wf,--catch-outerspace \ - -Wf,--timeout=500000 \ - -Wf,--ok-marker=fail_marker_positive \ - -Wf,--fail-marker=fail_marker_negative \ - -Wf,--detected-marker=fail_marker_detected \ - > /dev/null - @echo "Next step: \"just result {{ module }}\" or \"just resultbrowser\"" - -[doc("Query FAIL* marker statistics from the database")] -[group("4: 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("Dump FAIL* markers to CSV")] -[group("4: fail")] -result-csv module: - @echo "SELECT \ - CONCAT(\"0x\", HEX(p.injection_instr_absolute)) AS fault_address, \ - SUM(t.time2 - t.time1 + 1) AS total_fail_markers \ - FROM trace t \ - JOIN variant v 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 p.id = r.pilot_id \ - WHERE v.variant = \"{{ module }}\" AND r.resulttype = \"FAIL_MARKER\" \ - GROUP BY p.injection_instr_absolute \ - ORDER BY SUM(t.time2 - t.time1 + 1) DESC;" | mariadb --defaults-file=./db.conf --batch --raw | sed 's/\t/,/g' - -[doc("Start the FAIL* resultbrowser")] -[group("4: fail")] -resultbrowser: - {{ RESULT_BROWSER }} -c ./db.conf --host=0.0.0.0 --port={{ RESULTBROWSER_PORT }} diff --git a/scripts/mars.just b/scripts/mars.just deleted file mode 100644 index 04e26ad..0000000 --- a/scripts/mars.just +++ /dev/null @@ -1,35 +0,0 @@ -import "fail.just" - -BUILD_DIR := "build" - -# FAIL* variables - -FAIL_SERVER_PORT := "22941" -RESULTBROWSER_PORT := "22941" -FAIL_BIN := "fail/bin" -FAIL_SHARE := "fail/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 - -# Create a database: -# - mysql -u smchurla -p -# - CREATE DATABASE database_name; -# - SHOW DATABASES; - -procs: - ps -u smchurla diff --git a/scripts/nixos.just b/scripts/nixos.just deleted file mode 100644 index 2db3fa1..0000000 --- a/scripts/nixos.just +++ /dev/null @@ -1,246 +0,0 @@ -import "wasm.just" -import "fail.just" - -BUILD_DIR := "build" - -# Load environment variables set by "nix develop"-shell - -FAIL_SHARE := env("FAIL_SHARE") -WASI_ROOT := env("WASI_ROOT") -WAMR_ROOT := env("WAMR_ROOT") -LIBIWASM_DEBUG := env("LIBIWASM_DEBUG") -LIBIWASM_RELEASE := env("LIBIWASM_RELEASE") -LIBIWASM_MMAP_DEBUG := env("LIBIWASM_MMAP_DEBUG") -LIBIWASM_MMAP_RELEASE := env("LIBIWASM_MMAP_RELEASE") -LIBIWASM_LINUX_DEBUG := env("LIBIWASM_LINUX_DEBUG") -LIBIWASM_LINUX_RELEASE := env("LIBIWASM_LINUX_RELEASE") -CROSS_CC := env("CROSS_CC") -LINUX_CC := env("LINUX_CC") - -# FAIL* variables - -FAIL_SERVER_PORT := "1111" -RESULTBROWSER_PORT := "5000" -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 -# =================================================================================================================== # - -[default] -[private] -list: - @just --list - -[private] -create-build-dir module: - mkdir -p {{ BUILD_DIR }}-{{ module }} - -[doc("Delete the build directory")] -clean module: - rm -rf {{ BUILD_DIR }}-{{ module }} - -# =================================================================================================================== # -# MySQL recipes -# =================================================================================================================== # - -[doc("Start MySQL container to receive FAIL* trace/campaign results")] -[group("3: fail db")] -start-db: - docker run -d \ - --name fail-db \ - -e MYSQL_ROOT_PASSWORD=fail \ - -e MYSQL_USER=fail \ - -e MYSQL_PASSWORD=fail \ - -e MYSQL_DATABASE=fail \ - -p 3306:3306 \ - mysql - -[doc("Connect to MySQL database using DBeaver")] -[group("3: fail db")] -connect-db: - dbeaver -con "name=fail|driver=mysql|host=localhost|port=3306|database=fail|user=fail|password=fail" - -[doc("Stop MySQL container")] -[group("3: fail db")] -stop-db: - docker stop fail-db - -[doc("Remove MySQL container")] -[group("3: fail db")] -remove-db: - docker container rm fail-db - -# =================================================================================================================== # -# Debugging recipes -# =================================================================================================================== # - -[doc("Launch gdb")] -[group("debug")] -gdb module: - gdb --tui {{ BUILD_DIR }}-{{ module }}/system.elf - -# [doc("Launch radare2 at address and disassemble")] -# [group("debug")] -# r2 module addr="dbg.os_main": -# # -e asm.section=true -# # -e asm.bytes=true -# radare2 -AA \ -# -c "f TARGET @ {{ addr }}; s {{ addr }}; pd-- 30" \ -# -e asm.syntax=intel \ -# -e asm.lines=false \ -# -e asm.xrefs=true \ -# -e asm.flags=true \ -# -e asm.comments=true \ -# -e asm.functions=true \ -# -e asm.var=true \ -# -e asm.cmt.right=true \ -# -e asm.dwarf=true \ -# -e asm.pseudo=false \ -# -e asm.describe=false \ -# -e bin.relocs.apply=true \ -# {{ BUILD_DIR }}-{{ module }}/system.elf - -[doc("Disassemble with objdump at address")] -[group("debug")] -dump dir addr="0x100000" saddr="0x100100": - objdump {{ dir }}/system.elf \ - --disassemble-all \ - --disassembler-options=intel \ - --disassembler-color=terminal \ - --source \ - --demangle \ - --section=.text \ - --start-address={{ addr }} \ - --stop-address={{ saddr }} \ - --prefix={{ dir }} \ - --prefix-strip=7 - -[doc("Launch radare2 at address (interactive)")] -[group("debug")] -r2i module addr="dbg.os_main": - # -e asm.section=true - # -e asm.bytes=true - radare2 -AA \ - -c "s {{ addr }}" \ - -e scr.color=3 \ - -e scr.scrollbar=0 \ - -e scr.responsive=true \ - -e scr.interactive=true \ - -e scr.utf8=true \ - -e scr.utf8.curvy=true \ - -e asm.syntax=intel \ - -e asm.lines=false \ - -e asm.xrefs=true \ - -e asm.flags=true \ - -e asm.comments=true \ - -e asm.functions=true \ - -e asm.var=true \ - -e asm.cmt.right=true \ - -e asm.dwarf=true \ - -e asm.pseudo=false \ - -e asm.describe=false \ - -e bin.relocs.apply=true \ - {{ BUILD_DIR }}-{{ module }}/system.elf - -# =================================================================================================================== # -# Just do it -# =================================================================================================================== # - -[arg("mode", pattern="c|aot|interp", help="Which WASM mode to use")] -[arg("target", pattern="fail|linux|linux-baremetal", help="Which platform to compile for")] -[doc("Perform all steps for a fail/linux/linux-bm build with aot/interp WASM")] -[group("5: just do it")] -build module="__help" target="fail" mode="aot": - #!/usr/bin/env sh - - if [ "{{ module }}" = "__help" ]; then - just --usage build - exit 0 - fi - - just clean {{ module }} - just create-build-dir {{ module }} - just copy-auxiliary {{ module }} - - if [ "{{ mode }}" = "aot" ]; then - just build-wasm-module {{ module }} - just build-wasm-aot {{ module }} {{ target }} - just build-wasm-aot-array {{ module }} - - just prepare-aot-host {{ module }} - just build-wasm-host {{ module }} {{ target }} - - just build-system-startup {{ module }} {{ target }} - just build-system-syscalls {{ module }} {{ target }} - just link-system {{ module }} {{ target }} - elif [ "{{ mode }}" = "interp" ]; then - just build-wasm-module {{ module }} - just build-wasm-interp-array {{ module }} - - just prepare-interp-host {{ module }} - just build-wasm-host {{ module }} {{ target }} - - just build-system-startup {{ module }} {{ target }} - just build-system-syscalls {{ module }} {{ target }} - just link-system {{ module }} {{ target }} - elif [ "{{ mode }}" = "c" ]; then - just build-c-module {{ module }} {{ target }} - - just build-c-host {{ module }} {{ target }} - - just build-system-startup {{ module }} {{ target }} - just link-c-system {{ module }} {{ target }} - else - echo "unknown mode: {{ mode }}" >&2 - exit 1 - fi - - just build-iso {{ module }} - -[doc("Run binary")] -[group("5: just do it")] -run module: - @echo "Running {{ module }}:" - @{{ BUILD_DIR }}-{{ module }}/system.elf - -[arg("mode", pattern="c|aot|interp", help="Which WASM mode to use")] -[arg("target", pattern="fail|linux|linux-baremetal", help="Which platform to compile for")] -[doc("Perform all steps for a fail/linux/linux-bm build with aot/interp WASM")] -[group("5: just do it")] -build-run module="__help" target="fail" mode="aot": (build module target mode) (run module) - -[doc("Send binaries to mars")] -[group("5: just do it")] -upload module: - scp -r {{ BUILD_DIR }}-{{ module }} mars:~/Documents/failnix/{{ BUILD_DIR }}-{{ module }} - -[doc("Send markers to local")] -[group("5: just do it")] -download-markers: - scp mars:~/Documents/failnix/markers.csv ./markers.csv - -[doc("Perform all steps for a FAIL* campaign")] -[group("5: just do it")] -inject module: - just start-db - @echo "Waiting for database..." - sleep 20 - - just trace {{ module }} - just import {{ module }} - just server {{ module }} - just client {{ module }} - just result {{ module }} - -[doc("Copy build directory to injections/ with timestamp")] -[group("5: just do it")] -archive module suffix: - cp -rv {{ BUILD_DIR }}-{{ module }} ./injections/`date +%Y-%m-%d_%H-%M`_{{ module }}_"{{ suffix }}"