Compare commits
159 Commits
bba9ced348
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
e0624a10f7
|
|||
| 3ebc07bfc8 | |||
| 278eb8c980 | |||
| 0223a49099 | |||
| f4b8c16adb | |||
| a46adf528d | |||
| 38bec04ad8 | |||
| 8a97bb738b | |||
| 61c31e51bd | |||
| 2b46a7d544 | |||
| 8a6ea086d6 | |||
| e115cf05ce | |||
| 28da996299 | |||
| 2e5128db6a | |||
| d805b787ac | |||
| 32cb0460c3 | |||
| 9839d3152c | |||
| 2d20dfe665 | |||
| 59d3c7f824 | |||
| aabbd1311d | |||
| d1eee623fa | |||
| 402ba643dc | |||
| 9dd04e905c | |||
| 5487d44394 | |||
| f2f8d7f89f | |||
| 285dbc77d3 | |||
| 38183cae74 | |||
| b5d9d1ec78 | |||
| 1a4d4b64bf | |||
| b00c63ae42 | |||
| 0007193a4f | |||
| 4dcb71ff00 | |||
| fd65e8b791 | |||
| c05164bf0d | |||
| 7992744ae4 | |||
| 54574e0a88 | |||
| 171fe1703e | |||
| 1681f27afc | |||
| ca6338b351 | |||
| e444ab34df | |||
| 6b5bf117e4 | |||
| 64d6971d4d | |||
| 263bb454f1 | |||
| f4bc1b669a | |||
| 0a093c807f | |||
| 921b18cc7a | |||
| e09e3a0f9d | |||
| 63604d39c8 | |||
| 19ed8dd5a2 | |||
| 624f4fb4b3 | |||
| 19c9559cc0 | |||
| ec13adc778 | |||
| 5c826a80f2 | |||
| 3cb7349e81 | |||
| f9354690dd | |||
| 840847a7a2 | |||
| b836517168 | |||
| 8f8a3909d1 | |||
| e7d9635af7 | |||
| d4090125ef | |||
| 10b10f1e68 | |||
| e298f2edd0 | |||
| 3d1fe06f1a | |||
| 5306fdca4b | |||
| 5643b8bf84 | |||
| 950e0ea810 | |||
| 66fd5b6e8a | |||
| 5425f6e620 | |||
| ac5189d81f | |||
| c332ea6b1a | |||
| 36bda84d78 | |||
| 0bb554bb9d | |||
| fb992064ed | |||
| ed5e4fac19 | |||
| ba84d063e7 | |||
| ea3a3002be | |||
| 8cb266381d | |||
| bbc0521963 | |||
| d74222ccec | |||
| d71e0d40ce | |||
| 048b05942d | |||
| 0c19405966 | |||
| 8d1b2c459c | |||
| cece3bc3c7 | |||
| aa3c641426 | |||
| 661ea869c5 | |||
| ae9b064146 | |||
| d5648b1d85 | |||
| a3c9726540 | |||
| e29944d76c | |||
| f0b18a5285 | |||
| 8465439b24 | |||
| 6d3a482469 | |||
| 72bf924583 | |||
| 086393ef81 | |||
| 14ce025824 | |||
| 76c3e552af | |||
| ea4b431713 | |||
| 33e5a4c57c | |||
| b3fac78b8c | |||
| 42abfa0488 | |||
| cae1aead0e | |||
| 3ca6690822 | |||
| fe3adb5859 | |||
| b0ffcc1e31 | |||
| 94ce91ae0a | |||
| db54f88fd7 | |||
| c78fefbed9 | |||
| a11fab4853 | |||
| eebcb56297 | |||
| 820cc2a390 | |||
| 20e2c009fb | |||
| efc188ac10 | |||
| 266e6b51f5 | |||
| d701b88f63 | |||
| ac9ff33b24 | |||
| fbfb504123 | |||
| 258ca7ccce | |||
| 399ced2a00 | |||
| ab5ef378ab | |||
| edb903d000 | |||
| 9cc94387eb | |||
| 7e8b199fde | |||
| b9bf7dd478 | |||
| dc86ad17ec | |||
| 32e925c794 | |||
| b2f1ec44f5 | |||
| 03b2851f4d | |||
| a5cbc3e61b | |||
| 5428225d1d | |||
| 8da11311a0 | |||
| 39c7d921ab | |||
| 350dff63cd | |||
| ddde71c69a | |||
| 05bc73c711 | |||
| 4888b35c31 | |||
| a8f59a2b61 | |||
| 647c4c6406 | |||
| a04e71f183 | |||
| 38461f1708 | |||
| a37ac671ea | |||
| 10c4002bd9 | |||
| bcab6e02ae | |||
| daeb1f1211 | |||
| 4f5553737b | |||
| 7cb7ffef35 | |||
| 8fec847cca | |||
| f64d7eda8a | |||
| 9e46f14dcd | |||
| 6ff924328e | |||
| 2aea27172e | |||
| 1267f885cd | |||
| 836d2e0da1 | |||
| d7607c362d | |||
| 0b61c6f928 | |||
| 8ebb3d78df | |||
| 11cf5b1701 | |||
| 8b608a17c8 | |||
| f32f631bc3 |
BIN
fail/bin/fail-x86-tracing
(Stored with Git LFS)
BIN
fail/bin/fail-x86-tracing
(Stored with Git LFS)
Binary file not shown.
BIN
fail/bin/generic-experiment-client
(Stored with Git LFS)
BIN
fail/bin/generic-experiment-client
(Stored with Git LFS)
Binary file not shown.
BIN
fail/bin/generic-experiment-server
(Stored with Git LFS)
BIN
fail/bin/generic-experiment-server
(Stored with Git LFS)
Binary file not shown.
BIN
fail/bin/import-trace
(Stored with Git LFS)
BIN
fail/bin/import-trace
(Stored with Git LFS)
Binary file not shown.
BIN
fail/bin/prune-trace
(Stored with Git LFS)
BIN
fail/bin/prune-trace
(Stored with Git LFS)
Binary file not shown.
29
flake.nix
29
flake.nix
@ -321,10 +321,12 @@ rec {
|
|||||||
src = pkgs.fetchFromGitea {
|
src = pkgs.fetchFromGitea {
|
||||||
domain = "gitea.local.chriphost.de";
|
domain = "gitea.local.chriphost.de";
|
||||||
owner = "christoph";
|
owner = "christoph";
|
||||||
|
# domain = "git.cs.tu-dortmund.de";
|
||||||
|
# owner = "christoph.urlacher";
|
||||||
repo = "wamr";
|
repo = "wamr";
|
||||||
|
|
||||||
# With mmap_space in .text.wamr_aot
|
# With mmap_space in .text.wamr_aot
|
||||||
rev = "cda2008deb85511089b04b0ac736ad4da2d07e58";
|
rev = "cda2009deb85511089b04b0ac736ad4da2d07e58";
|
||||||
hash = "sha256-CN6xTiwzF4Jbrpf21TF5c/C03Xb3urwkibRuIXjoU/w=";
|
hash = "sha256-CN6xTiwzF4Jbrpf21TF5c/C03Xb3urwkibRuIXjoU/w=";
|
||||||
|
|
||||||
# Without mmap_space in .text.wamr_aot
|
# Without mmap_space in .text.wamr_aot
|
||||||
@ -451,17 +453,28 @@ rec {
|
|||||||
buildInputs = with pkgs; [
|
buildInputs = with pkgs; [
|
||||||
# FAIL runtime dependencies
|
# FAIL runtime dependencies
|
||||||
python # bochs-experiment-runner.py, resultbrowser.py
|
python # bochs-experiment-runner.py, resultbrowser.py
|
||||||
alsa-lib # libasound.so.2
|
|
||||||
boost_pkgs.boost174 # libboost_coroutine.so.1.74.0, libboost_regex.so.1.74.0, libboost_thread.so.1.74.0
|
# For old VSS FAIL
|
||||||
capstone_4 # libcapstone.so.4
|
# alsa-lib # libasound.so.2
|
||||||
|
# boost_pkgs.boost174 # libboost_coroutine.so.1.74.0, libboost_regex.so.1.74.0, libboost_thread.so.1.74.0
|
||||||
|
# capstone_4 # libcapstone.so.4
|
||||||
|
# libdwarf_pkgs.libdwarf # libdwarf.so.1
|
||||||
|
# elfutils # libelf.so.1
|
||||||
|
# mariadb # libmariadb.so.3
|
||||||
|
# libpcl # libpcl.so.1
|
||||||
|
# protobuf_21 # libprotobuf.so.32
|
||||||
|
# SDL # libSDL-1.2.so.0
|
||||||
|
# libx11 # libX11.so.6
|
||||||
|
# libxrandr # libXrandr.so.2
|
||||||
|
# libz # libz.so.1
|
||||||
|
|
||||||
|
# For current FAIL
|
||||||
|
boost183
|
||||||
|
capstone # libcapstone.so.5
|
||||||
libdwarf_pkgs.libdwarf # libdwarf.so.1
|
libdwarf_pkgs.libdwarf # libdwarf.so.1
|
||||||
elfutils # libelf.so.1
|
elfutils # libelf.so.1
|
||||||
mariadb # libmariadb.so.3
|
mariadb # libmariadb.so.3
|
||||||
libpcl # libpcl.so.1
|
|
||||||
protobuf_21 # libprotobuf.so.32
|
protobuf_21 # libprotobuf.so.32
|
||||||
SDL # libSDL-1.2.so.0
|
|
||||||
libx11 # libX11.so.6
|
|
||||||
libxrandr # libXrandr.so.2
|
|
||||||
libz # libz.so.1
|
libz # libz.so.1
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@ benchmark, resulttype, SUM(t.time2 - t.time1 + 1) AS faults,
|
|||||||
CONCAT('0x', HEX(p.injection_instr_absolute)) AS fault_address
|
CONCAT('0x', HEX(p.injection_instr_absolute)) AS fault_address
|
||||||
FROM variant v
|
FROM variant v
|
||||||
JOIN trace t ON v.id = t.variant_id
|
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 fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address
|
||||||
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||||
JOIN fsppilot p ON r.pilot_id = p.id
|
JOIN fsppilot p ON r.pilot_id = p.id
|
||||||
WHERE v.variant = '$experiment'
|
WHERE v.variant = '$experiment'
|
||||||
|
|||||||
@ -11,7 +11,7 @@ sub query {
|
|||||||
benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
|
benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
|
||||||
FROM variant v
|
FROM variant v
|
||||||
JOIN trace t ON v.id = t.variant_id
|
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 fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address
|
||||||
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||||
JOIN fsppilot p ON r.pilot_id = p.id
|
JOIN fsppilot p ON r.pilot_id = p.id
|
||||||
WHERE v.variant = '$experiment'
|
WHERE v.variant = '$experiment'
|
||||||
|
|||||||
@ -11,7 +11,7 @@ sub query {
|
|||||||
benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
|
benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults
|
||||||
FROM variant v
|
FROM variant v
|
||||||
JOIN trace t ON v.id = t.variant_id
|
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 fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address
|
||||||
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
|
||||||
JOIN fsppilot p ON r.pilot_id = p.id
|
JOIN fsppilot p ON r.pilot_id = p.id
|
||||||
WHERE v.variant = '$experiment'
|
WHERE v.variant = '$experiment'
|
||||||
|
|||||||
@ -260,7 +260,8 @@ sub select_experiment {
|
|||||||
TUI::select_from_list( "Select Experiment", $multi, @exp_with_notes );
|
TUI::select_from_list( "Select Experiment", $multi, @exp_with_notes );
|
||||||
die "No experiment selected" unless @selected_experiments;
|
die "No experiment selected" unless @selected_experiments;
|
||||||
|
|
||||||
map { s/(.*?)\s+\(.+\)$/$1/ } @selected_experiments;
|
@selected_experiments =
|
||||||
|
map { s/(.*?)\s+\(.+\)$/$1/r } @selected_experiments;
|
||||||
|
|
||||||
return $multi == 1 ? @selected_experiments : $selected_experiments[0];
|
return $multi == 1 ? @selected_experiments : $selected_experiments[0];
|
||||||
}
|
}
|
||||||
|
|||||||
254
scripts/menu.pl
254
scripts/menu.pl
@ -109,6 +109,7 @@ my %handlers = (
|
|||||||
|
|
||||||
my @existing = Util::find_files($local_ghidra_projects);
|
my @existing = Util::find_files($local_ghidra_projects);
|
||||||
|
|
||||||
|
# Determine if an experiment was already imported
|
||||||
my $is_old = sub {
|
my $is_old = sub {
|
||||||
my ($name) = @_;
|
my ($name) = @_;
|
||||||
$name =~ s/:/-/g;
|
$name =~ s/:/-/g;
|
||||||
@ -201,59 +202,7 @@ my %handlers = (
|
|||||||
'10. Open Experiment In Explorer' =>
|
'10. Open Experiment In Explorer' =>
|
||||||
sub { do "$local_scripts_dir/explore.pl" },
|
sub { do "$local_scripts_dir/explore.pl" },
|
||||||
|
|
||||||
'11. Open Experiment in Ghidra' => sub {
|
'11. Compare Experiment Results' => sub {
|
||||||
|
|
||||||
my @projects =
|
|
||||||
map { s/\.gpr//r } Util::find_files($local_ghidra_projects);
|
|
||||||
my @selected_projects =
|
|
||||||
TUI::select_from_list( "Select Project to Open in Ghidra",
|
|
||||||
0, @projects );
|
|
||||||
die "No project selected" unless @selected_projects;
|
|
||||||
my $project = $selected_projects[0];
|
|
||||||
system(
|
|
||||||
join " ",
|
|
||||||
(
|
|
||||||
"_JAVA_AWT_WM_NONREPARENTING=1", "ghidra",
|
|
||||||
"$local_ghidra_projects/$project.gpr",
|
|
||||||
)
|
|
||||||
);
|
|
||||||
},
|
|
||||||
|
|
||||||
'12. Open Experiment in Binsider' => sub {
|
|
||||||
my $selected_experiment = Util::select_experiment(0);
|
|
||||||
|
|
||||||
system( 'binsider',
|
|
||||||
"$local_archive_dir/$selected_experiment/system.elf" );
|
|
||||||
},
|
|
||||||
|
|
||||||
'13. Open Experiment in ResultBrowser' => sub {
|
|
||||||
|
|
||||||
my @db_names = Mars::db_list();
|
|
||||||
my @selected_dbs =
|
|
||||||
TUI::select_from_list( "Select Database for ResultBrowser",
|
|
||||||
0, @db_names );
|
|
||||||
die "No database selected" unless @selected_dbs;
|
|
||||||
my $selected_db = $selected_dbs[0];
|
|
||||||
|
|
||||||
Util::rewrite_file( $local_db_conf, "database=",
|
|
||||||
"database=$selected_db\n" );
|
|
||||||
|
|
||||||
system( $resultbrowser, '-c', $local_db_conf, '--host=0.0.0.0',
|
|
||||||
"--port=$resultbrowser_port" );
|
|
||||||
},
|
|
||||||
|
|
||||||
'14. Open Database in LazySQL' => sub {
|
|
||||||
my $experiment =
|
|
||||||
Util::select_experiment(0) =~ s/T(\d\d)-(\d\d)-(\d\d)/T$1:$2:$3/r;
|
|
||||||
my $ssh = Mars::ssh_connect();
|
|
||||||
my $db_password = Mars::read_db_password_file();
|
|
||||||
|
|
||||||
system( 'lazysql', '-read-only',
|
|
||||||
"mariadb://$db_user:$db_password\@$db_host:$db_port/${db_user}_$experiment"
|
|
||||||
);
|
|
||||||
},
|
|
||||||
|
|
||||||
'15. Compare Experiment Results' => sub {
|
|
||||||
|
|
||||||
my @selected_experiments = Util::select_experiment(1);
|
my @selected_experiments = Util::select_experiment(1);
|
||||||
|
|
||||||
@ -319,44 +268,129 @@ my %handlers = (
|
|||||||
0, @entries );
|
0, @entries );
|
||||||
},
|
},
|
||||||
|
|
||||||
'16. Plot Results' => sub {
|
'12. Open Experiment in BinaryNinja' => sub {
|
||||||
|
|
||||||
# Generate R ggplot2 charts
|
|
||||||
my @selected_experiments = Util::select_experiment(1);
|
my @selected_experiments = Util::select_experiment(1);
|
||||||
|
my @paths =
|
||||||
|
map { "$local_archive_dir/$_/system.elf" } @selected_experiments;
|
||||||
|
|
||||||
my @charts = map { s/\.r//r } Util::find_files($local_charts_dir);
|
system( 'binaryninja', @paths );
|
||||||
my @selected_charts =
|
|
||||||
TUI::select_from_list( "Select Plots to Generate", 1, @charts );
|
|
||||||
die "No plot selected" unless @selected_charts;
|
|
||||||
|
|
||||||
my @single_charts = grep { /single/ } @selected_charts;
|
|
||||||
foreach my $experiment (@selected_experiments) {
|
|
||||||
foreach my $chart (@single_charts) {
|
|
||||||
say " - Generating plot $chart for $experiment...";
|
|
||||||
system(
|
|
||||||
'Rscript',
|
|
||||||
"$local_charts_dir/$chart.r",
|
|
||||||
"$local_archive_dir/$experiment"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
my @combined_charts = grep { /combined/ } @selected_charts;
|
|
||||||
my $print_experiments = join " ", @selected_experiments;
|
|
||||||
my @path_experiments =
|
|
||||||
map { "$local_archive_dir/$_" } @selected_experiments;
|
|
||||||
foreach my $chart (@combined_charts) {
|
|
||||||
say " - Generating plot $chart for ($print_experiments)...";
|
|
||||||
system( 'Rscript', "$local_charts_dir/$chart.r",
|
|
||||||
@path_experiments );
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
'17. Run Build in GDB' => sub {
|
'13. Open Experiment in Binsider' => sub {
|
||||||
|
my $selected_experiment = Util::select_experiment(0);
|
||||||
|
|
||||||
|
system( 'binsider',
|
||||||
|
"$local_archive_dir/$selected_experiment/system.elf" );
|
||||||
|
},
|
||||||
|
|
||||||
|
'14. Open Experiment in Ghidra' => sub {
|
||||||
|
|
||||||
|
my @projects =
|
||||||
|
map { s/\.gpr//r } Util::find_files($local_ghidra_projects);
|
||||||
|
my @selected_projects =
|
||||||
|
TUI::select_from_list( "Select Project to Open in Ghidra",
|
||||||
|
0, @projects );
|
||||||
|
die "No project selected" unless @selected_projects;
|
||||||
|
my $project = $selected_projects[0];
|
||||||
|
system(
|
||||||
|
join " ",
|
||||||
|
(
|
||||||
|
"_JAVA_AWT_WM_NONREPARENTING=1", "ghidra",
|
||||||
|
"$local_ghidra_projects/$project.gpr",
|
||||||
|
)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
'15. Run Objdump on Experiment' => sub {
|
||||||
|
my $selected_experiment = Util::select_experiment(0);
|
||||||
|
|
||||||
|
system(
|
||||||
|
"objdump $local_archive_dir/$selected_experiment/system.elf -D -M intel -S | bat --color never"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
'16. Run Wasm-Objdump on Experiment' => sub {
|
||||||
|
my $selected_experiment = Util::select_experiment(0);
|
||||||
|
|
||||||
|
system(
|
||||||
|
"wasm-objdump -d $local_archive_dir/$selected_experiment/wasm_module.wasm | bat --color never"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
'17. Run Radare2 on Experiment' => sub {
|
||||||
|
my $selected_experiment = Util::select_experiment(0);
|
||||||
|
|
||||||
|
say "Radare help:";
|
||||||
|
say "s <address> - Seek to address";
|
||||||
|
say "pd <n> - Disassemble n instructions";
|
||||||
|
say "pdf - Disassemble current function";
|
||||||
|
say "pdf @ <function> - Disassemble function";
|
||||||
|
say "pdr - Disassemble recursively";
|
||||||
|
say "V - Switch view";
|
||||||
|
say "p - Switch print mode";
|
||||||
|
say "P - Switch layout";
|
||||||
|
system(
|
||||||
|
'radare2', '-AA',
|
||||||
|
'-c', '"-s dbg.os_main"',
|
||||||
|
'-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',
|
||||||
|
"$local_archive_dir/$selected_experiment/system.elf",
|
||||||
|
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
'18. Open Database in ResultBrowser (Mars)' => sub {
|
||||||
|
|
||||||
|
my @db_names = Mars::db_list();
|
||||||
|
my @selected_dbs =
|
||||||
|
TUI::select_from_list( "Select Database for ResultBrowser",
|
||||||
|
0, @db_names );
|
||||||
|
die "No database selected" unless @selected_dbs;
|
||||||
|
my $selected_db = $selected_dbs[0];
|
||||||
|
|
||||||
|
Util::rewrite_file( $local_db_conf, "database=",
|
||||||
|
"database=$selected_db\n" );
|
||||||
|
|
||||||
|
system( $resultbrowser, '-c', $local_db_conf, '--host=0.0.0.0',
|
||||||
|
"--port=$resultbrowser_port" );
|
||||||
|
},
|
||||||
|
|
||||||
|
'19. Open Database in LazySQL (Mars)' => sub {
|
||||||
|
my $experiment =
|
||||||
|
Util::select_experiment(0) =~ s/T(\d\d)-(\d\d)-(\d\d)/T$1:$2:$3/r;
|
||||||
|
my $ssh = Mars::ssh_connect();
|
||||||
|
my $db_password = Mars::read_db_password_file();
|
||||||
|
|
||||||
|
system( 'lazysql', '-read-only',
|
||||||
|
"mariadb://$db_user:$db_password\@$db_host:$db_port/${db_user}_$experiment"
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
'20. Open TablePlus (Mars)' => sub {
|
||||||
|
system('tableplus');
|
||||||
|
},
|
||||||
|
|
||||||
|
'21. Run Build in GDB' => sub {
|
||||||
my @builds = grep { /linux/ } Util::find_subdirs($local_builds_dir);
|
my @builds = grep { /linux/ } Util::find_subdirs($local_builds_dir);
|
||||||
my @selected_builds =
|
my @selected_builds =
|
||||||
TUI::select_from_list( "Select Build to Run in GDB", 0, @builds );
|
TUI::select_from_list( "Select Build to Run in GDB", 0, @builds );
|
||||||
die "No experiment selected" unless @selected_builds;
|
die "No build selected" unless @selected_builds;
|
||||||
my $selected_build = $selected_builds[0];
|
my $selected_build = $selected_builds[0];
|
||||||
|
|
||||||
my $build_dir = "$local_builds_dir/$selected_build";
|
my $build_dir = "$local_builds_dir/$selected_build";
|
||||||
@ -389,6 +423,39 @@ my %handlers = (
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'30. Plot Results' => sub {
|
||||||
|
|
||||||
|
# Generate R ggplot2 charts
|
||||||
|
my @selected_experiments = Util::select_experiment(1);
|
||||||
|
|
||||||
|
my @charts = map { s/\.r//r } Util::find_files($local_charts_dir);
|
||||||
|
my @selected_charts =
|
||||||
|
TUI::select_from_list( "Select Plots to Generate", 1, @charts );
|
||||||
|
die "No plot selected" unless @selected_charts;
|
||||||
|
|
||||||
|
my @single_charts = grep { /single/ } @selected_charts;
|
||||||
|
foreach my $experiment (@selected_experiments) {
|
||||||
|
foreach my $chart (@single_charts) {
|
||||||
|
say " - Generating plot $chart for $experiment...";
|
||||||
|
system(
|
||||||
|
'Rscript',
|
||||||
|
"$local_charts_dir/$chart.r",
|
||||||
|
"$local_archive_dir/$experiment"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my @combined_charts = grep { /combined/ } @selected_charts;
|
||||||
|
my $print_experiments = join " ", @selected_experiments;
|
||||||
|
my @path_experiments =
|
||||||
|
map { "$local_archive_dir/$_" } @selected_experiments;
|
||||||
|
foreach my $chart (@combined_charts) {
|
||||||
|
say " - Generating plot $chart for ($print_experiments)...";
|
||||||
|
system( 'Rscript', "$local_charts_dir/$chart.r",
|
||||||
|
@path_experiments );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
'95. Delete Builds' => sub {
|
'95. Delete Builds' => sub {
|
||||||
|
|
||||||
# Delete old build files
|
# Delete old build files
|
||||||
@ -438,11 +505,26 @@ my %handlers = (
|
|||||||
'99. Drop Databases (Mars)' => sub {
|
'99. Drop Databases (Mars)' => sub {
|
||||||
|
|
||||||
# Drop databases on mars
|
# Drop databases on mars
|
||||||
my @db_names = Mars::db_list();
|
my @dbs = Mars::db_list();
|
||||||
|
my @dbs_with_notes;
|
||||||
|
foreach my $db (@dbs) {
|
||||||
|
my $info =
|
||||||
|
Util::read_experiment_info( $db =~ s/smchurla_//r =~ s/:/-/gr );
|
||||||
|
|
||||||
|
push @dbs_with_notes,
|
||||||
|
( defined $info && length($info) > 0 )
|
||||||
|
? sprintf( "%-60s (%s)", $db, $info )
|
||||||
|
: $db;
|
||||||
|
}
|
||||||
|
|
||||||
my @selected_dbs =
|
my @selected_dbs =
|
||||||
TUI::select_from_list( "Select Databases to Drop from Mars",
|
TUI::select_from_list( "Select Databases to Drop from Mars",
|
||||||
1, @db_names );
|
1, @dbs_with_notes );
|
||||||
die "No database selected" unless @selected_dbs;
|
die "No database selected" unless @selected_dbs;
|
||||||
|
|
||||||
|
@selected_dbs =
|
||||||
|
map { s/(.*?)\s+\(.+\)$/$1/r } @selected_dbs;
|
||||||
|
|
||||||
Mars::db_drop($_) for @selected_dbs;
|
Mars::db_drop($_) for @selected_dbs;
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@ -35,147 +35,156 @@ my $result_browser = "$fail_bin/resultbrowser.py";
|
|||||||
sub trace {
|
sub trace {
|
||||||
my ($experiment) = @_;
|
my ($experiment) = @_;
|
||||||
|
|
||||||
Util::notify("Tracing $experiment...");
|
# Util::notify("Tracing $experiment...");
|
||||||
|
|
||||||
system(
|
my $trace_command = join " ", (
|
||||||
join " ",
|
"$bochs_runner",
|
||||||
(
|
"-V $fail_share/vgabios.bin",
|
||||||
"$bochs_runner",
|
"-b $fail_share/BIOS-bochs-latest",
|
||||||
"-V $fail_share/vgabios.bin",
|
"-1",
|
||||||
"-b $fail_share/BIOS-bochs-latest",
|
"-f $fail_trace",
|
||||||
"-1",
|
"-e $remote_builds_dir/$experiment/system.elf",
|
||||||
"-f $fail_trace",
|
"-i $remote_builds_dir/$experiment/system.iso",
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
"--",
|
||||||
"-i $remote_builds_dir/$experiment/system.iso",
|
"-Wf,--start-symbol=fail_start_trace",
|
||||||
"--",
|
"-Wf,--save-symbol=fail_start_trace",
|
||||||
"-Wf,--full-trace",
|
"-Wf,--end-symbol=fail_stop_trace",
|
||||||
"-Wf,--check-bounds",
|
"-Wf,--state-file=$remote_builds_dir/$experiment/state",
|
||||||
"-Wf,--start-symbol=fail_start_trace",
|
"-Wf,--trace-file=$remote_builds_dir/$experiment/trace.pb",
|
||||||
"-Wf,--save-symbol=fail_start_trace",
|
"-Wf,--elf-file=$remote_builds_dir/$experiment/system.elf",
|
||||||
"-Wf,--end-symbol=fail_stop_trace",
|
|
||||||
"-Wf,--state-file=$remote_builds_dir/$experiment/state",
|
# "-Wf,--full-trace",
|
||||||
"-Wf,--trace-file=$remote_builds_dir/$experiment/trace.pb",
|
# "-Wf,--check-bounds",
|
||||||
"-Wf,--elf-file=$remote_builds_dir/$experiment/system.elf"
|
">$remote_builds_dir/$experiment/1_trace.log"
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
say "Trace command: $trace_command";
|
||||||
|
|
||||||
|
system($trace_command);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub import_trace {
|
sub import_trace {
|
||||||
my ($experiment) = @_;
|
my ($experiment) = @_;
|
||||||
|
|
||||||
Util::notify("Importing $experiment trace...");
|
# Util::notify("Importing $experiment trace...");
|
||||||
|
|
||||||
# Benchmark: ip
|
# Benchmark: ip
|
||||||
system(
|
my $import_ip_command = join " ", (
|
||||||
join " ",
|
"$fail_import",
|
||||||
(
|
"--database-option-file $remote_db_conf",
|
||||||
"$fail_import",
|
"-t $remote_builds_dir/$experiment/trace.pb",
|
||||||
"--database-option-file $remote_db_conf",
|
"-i RegisterImporter",
|
||||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
"-e $remote_builds_dir/$experiment/system.elf",
|
||||||
"-i RegisterImporter",
|
"-v $experiment",
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
"-b ip",
|
||||||
"-v $experiment",
|
"--no-gp", # Don't inject general purpose registers
|
||||||
"-b ip",
|
"--ip", # Inject instruction pointer
|
||||||
"--no-gp", # Don't inject general purpose registers
|
">$remote_builds_dir/$experiment/2_import_ip.log"
|
||||||
"--ip" # Inject instruction pointer
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
say "Import IP command: $import_ip_command";
|
||||||
|
|
||||||
|
system($import_ip_command);
|
||||||
|
|
||||||
# Benchmark: mem
|
# Benchmark: mem
|
||||||
system(
|
my $import_mem_command = join " ",
|
||||||
join " ",
|
(
|
||||||
(
|
"$fail_import",
|
||||||
"$fail_import",
|
"--database-option-file $remote_db_conf",
|
||||||
"--database-option-file $remote_db_conf",
|
"-t $remote_builds_dir/$experiment/trace.pb",
|
||||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
"-i MemoryImporter",
|
||||||
"-i MemoryImporter",
|
"-e $remote_builds_dir/$experiment/system.elf",
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
"-v $experiment",
|
||||||
"-v $experiment",
|
"-b mem",
|
||||||
"-b mem"
|
">$remote_builds_dir/$experiment/2_import_mem.log"
|
||||||
)
|
);
|
||||||
);
|
say "Import MEM command: $import_mem_command";
|
||||||
|
|
||||||
|
system($import_mem_command);
|
||||||
|
|
||||||
# Benchmark: regs
|
# Benchmark: regs
|
||||||
system(
|
my $import_regs_command = join " ", (
|
||||||
join " ",
|
"$fail_import",
|
||||||
(
|
"--database-option-file $remote_db_conf",
|
||||||
"$fail_import",
|
"-t $remote_builds_dir/$experiment/trace.pb",
|
||||||
"--database-option-file $remote_db_conf",
|
"-i RegisterImporter",
|
||||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
"-e $remote_builds_dir/$experiment/system.elf",
|
||||||
"-i RegisterImporter",
|
"-v $experiment",
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
"-b regs",
|
||||||
"-v $experiment",
|
"--flags", # Inject flags register
|
||||||
"-b regs",
|
">$remote_builds_dir/$experiment/2_import_regs.log"
|
||||||
"--flags" # Inject flags register
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
say "Import REGS command: $import_regs_command";
|
||||||
|
|
||||||
|
system($import_regs_command);
|
||||||
|
|
||||||
# Import fulltrace for VisualFAIL
|
# Import fulltrace for VisualFAIL
|
||||||
system(
|
# system(
|
||||||
join " ",
|
# join " ",
|
||||||
(
|
# (
|
||||||
"$fail_import",
|
# "$fail_import",
|
||||||
"--database-option-file $remote_db_conf",
|
# "--database-option-file $remote_db_conf",
|
||||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
# "-t $remote_builds_dir/$experiment/trace.pb",
|
||||||
"-i FullTraceImporter",
|
# "-i FullTraceImporter",
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
# "-e $remote_builds_dir/$experiment/system.elf",
|
||||||
"-v $experiment",
|
# "-v $experiment",
|
||||||
)
|
# )
|
||||||
);
|
# );
|
||||||
|
|
||||||
# Import objdump disassembly + source files
|
# Import objdump disassembly + source files
|
||||||
system(
|
# system(
|
||||||
join " ",
|
# join " ",
|
||||||
(
|
# (
|
||||||
"$fail_import",
|
# "$fail_import",
|
||||||
"--database-option-file $remote_db_conf",
|
# "--database-option-file $remote_db_conf",
|
||||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
# "-t $remote_builds_dir/$experiment/trace.pb",
|
||||||
"-i ElfImporter",
|
# "-i ElfImporter",
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
# "-e $remote_builds_dir/$experiment/system.elf",
|
||||||
"-v $experiment",
|
# "-v $experiment",
|
||||||
"-b ip",
|
# "-b ip",
|
||||||
"--objdump objdump",
|
# "--objdump objdump",
|
||||||
"--sources",
|
#
|
||||||
)
|
# # "--sources",
|
||||||
);
|
# )
|
||||||
system(
|
# );
|
||||||
join " ",
|
# system(
|
||||||
(
|
# join " ",
|
||||||
"$fail_import",
|
# (
|
||||||
"--database-option-file $remote_db_conf",
|
# "$fail_import",
|
||||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
# "--database-option-file $remote_db_conf",
|
||||||
"-i ElfImporter",
|
# "-t $remote_builds_dir/$experiment/trace.pb",
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
# "-i ElfImporter",
|
||||||
"-v $experiment",
|
# "-e $remote_builds_dir/$experiment/system.elf",
|
||||||
"-b mem",
|
# "-v $experiment",
|
||||||
"--objdump objdump",
|
# "-b mem",
|
||||||
"--sources",
|
# "--objdump objdump",
|
||||||
)
|
#
|
||||||
);
|
# # "--sources",
|
||||||
system(
|
# )
|
||||||
join " ",
|
# );
|
||||||
(
|
# system(
|
||||||
"$fail_import",
|
# join " ",
|
||||||
"--database-option-file $remote_db_conf",
|
# (
|
||||||
"-t $remote_builds_dir/$experiment/trace.pb",
|
# "$fail_import",
|
||||||
"-i ElfImporter",
|
# "--database-option-file $remote_db_conf",
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
# "-t $remote_builds_dir/$experiment/trace.pb",
|
||||||
"-v $experiment",
|
# "-i ElfImporter",
|
||||||
"-b regs",
|
# "-e $remote_builds_dir/$experiment/system.elf",
|
||||||
"--objdump objdump",
|
# "-v $experiment",
|
||||||
"--sources",
|
# "-b regs",
|
||||||
)
|
# "--objdump objdump",
|
||||||
);
|
#
|
||||||
|
# # "--sources",
|
||||||
|
# )
|
||||||
|
# );
|
||||||
|
|
||||||
system(
|
my $prune_command = join " ",
|
||||||
join " ",
|
(
|
||||||
(
|
"$fail_prune", "--database-option-file $remote_db_conf",
|
||||||
"$fail_prune",
|
"-v $experiment", "-b %%",
|
||||||
"--database-option-file $remote_db_conf",
|
"--overwrite", ">$remote_builds_dir/$experiment/2_prune.log"
|
||||||
"-v $experiment",
|
);
|
||||||
"-b %%", "--overwrite"
|
say "Prune command: $prune_command";
|
||||||
)
|
|
||||||
);
|
system($prune_command);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub inject {
|
sub inject {
|
||||||
@ -185,6 +194,43 @@ sub inject {
|
|||||||
|
|
||||||
Util::notify("Injecting $experiment using $count cores...");
|
Util::notify("Injecting $experiment using $count cores...");
|
||||||
|
|
||||||
|
my $server_command = join " ", (
|
||||||
|
"$fail_server",
|
||||||
|
|
||||||
|
# "--port $fail_server_port",
|
||||||
|
"--database-option-file $remote_db_conf", "-v $experiment",
|
||||||
|
"-b %", "--inject-single-bit",
|
||||||
|
"--inject-registers",
|
||||||
|
">$remote_builds_dir/$experiment/3_server.log"
|
||||||
|
);
|
||||||
|
say "Server command: $server_command";
|
||||||
|
|
||||||
|
my $client_command = join " ", (
|
||||||
|
"nice $bochs_runner",
|
||||||
|
"-V $fail_share/vgabios.bin",
|
||||||
|
"-b $fail_share/BIOS-bochs-latest",
|
||||||
|
"-f $fail_inject",
|
||||||
|
"-e $remote_builds_dir/$experiment/system.elf",
|
||||||
|
"-i $remote_builds_dir/$experiment/system.iso",
|
||||||
|
"-j $count",
|
||||||
|
"--",
|
||||||
|
|
||||||
|
# "-Wf,--server-port=$fail_server_port",
|
||||||
|
"-Wf,--state-dir=$remote_builds_dir/$experiment/state",
|
||||||
|
"-Wf,--trap",
|
||||||
|
"-Wf,--catch-outerspace",
|
||||||
|
"-Wf,--catch-write-textsegment",
|
||||||
|
"-Wf,--timeout=500000",
|
||||||
|
"-Wf,--ok-marker=fail_marker_positive",
|
||||||
|
"-Wf,--fail-marker=fail_marker_negative",
|
||||||
|
"-Wf,--detected-marker=fail_marker_detected",
|
||||||
|
|
||||||
|
">/dev/null"
|
||||||
|
|
||||||
|
# ">$remote_builds_dir/$experiment/4_client.log"
|
||||||
|
);
|
||||||
|
say "Client command: $client_command";
|
||||||
|
|
||||||
say "Forking...";
|
say "Forking...";
|
||||||
my $pid = fork();
|
my $pid = fork();
|
||||||
die "fork failed: $!" unless defined $pid;
|
die "fork failed: $!" unless defined $pid;
|
||||||
@ -192,52 +238,16 @@ sub inject {
|
|||||||
if ( $pid == 0 ) {
|
if ( $pid == 0 ) {
|
||||||
|
|
||||||
# child -> server
|
# child -> server
|
||||||
|
|
||||||
say "Running server in child process...";
|
say "Running server in child process...";
|
||||||
exec(
|
exec($server_command) == 0 or die "exec server failed: $!";
|
||||||
join " ",
|
|
||||||
(
|
|
||||||
"$fail_server",
|
|
||||||
"--port $fail_server_port",
|
|
||||||
"--database-option-file $remote_db_conf",
|
|
||||||
"-v $experiment",
|
|
||||||
"-b %",
|
|
||||||
"--inject-single-bit",
|
|
||||||
"--inject-registers"
|
|
||||||
)
|
|
||||||
) == 0 or die "exec server failed: $!";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# parent -> client
|
# parent -> client
|
||||||
|
|
||||||
say "Waiting for server...";
|
say "Waiting for server...";
|
||||||
sleep(10);
|
sleep(10);
|
||||||
|
|
||||||
say "Running client with $count cores in parent process";
|
say "Running client with $count cores in parent process";
|
||||||
|
system($client_command) == 0 or die "client failed: $?";
|
||||||
system(
|
|
||||||
join " ",
|
|
||||||
(
|
|
||||||
"nice $bochs_runner",
|
|
||||||
"-V $fail_share/vgabios.bin",
|
|
||||||
"-b $fail_share/BIOS-bochs-latest",
|
|
||||||
"-f $fail_inject",
|
|
||||||
"-e $remote_builds_dir/$experiment/system.elf",
|
|
||||||
"-i $remote_builds_dir/$experiment/system.iso",
|
|
||||||
"-j $count",
|
|
||||||
"--",
|
|
||||||
"-Wf,--server-port=$fail_server_port",
|
|
||||||
"-Wf,--state-dir=$remote_builds_dir/$experiment/state",
|
|
||||||
"-Wf,--trap",
|
|
||||||
"-Wf,--catch-outerspace",
|
|
||||||
"-Wf,--catch-write-textsegment",
|
|
||||||
"-Wf,--timeout=500000",
|
|
||||||
"-Wf,--ok-marker=fail_marker_positive",
|
|
||||||
"-Wf,--fail-marker=fail_marker_negative",
|
|
||||||
"-Wf,--detected-marker=fail_marker_detected",
|
|
||||||
">/dev/null"
|
|
||||||
)
|
|
||||||
) == 0 or die "client failed: $?";
|
|
||||||
|
|
||||||
say "Killing server with pid $pid...";
|
say "Killing server with pid $pid...";
|
||||||
kill 'TERM', $pid;
|
kill 'TERM', $pid;
|
||||||
|
|||||||
Reference in New Issue
Block a user