Compare commits

...

20 Commits

Author SHA1 Message Date
9ca8e88ec0 don't save client logs 2026-05-06 20:36:10 +02:00
be2c4b7bf2 log experiment stages to separate files 2026-05-06 20:30:41 +02:00
644603fb8b don't move runner log 2026-05-06 20:08:39 +02:00
0dccd1df46 update fail binaries again again 2026-05-06 19:52:25 +02:00
9db4cb8bb1 remove fail binaries 2026-05-06 19:39:47 +02:00
10fe608a90 separate client/server logs + move logs to experiment dir 2026-05-04 13:32:34 +02:00
2de6e20675 update fail binaries again - set static port (--server-port doesn't work) 2026-05-04 13:31:18 +02:00
bc98e2af5c add updated fail binaries 2026-05-04 11:38:05 +02:00
3819e84acb remove fail binaries 2026-05-04 11:35:42 +02:00
6ce8987ebd add --server-port option to generic-experiment-client 2026-04-29 21:02:10 +02:00
6859402483 update FAIL database queries for new version 2026-04-29 20:16:24 +02:00
32b1f3fa31 move old FAIL binaries so nix doesn't autopatchelf them 2026-04-29 20:10:02 +02:00
a6f33f1960 update FAIL version to current 2026-04-29 19:58:18 +02:00
1bf4886c64 choose experiments instead of builds for radare/objdump/wasm-objdump actions 2026-04-28 00:53:46 +02:00
e33fed9b8d add binaryninja action to menu 2026-04-28 00:40:31 +02:00
c87409dd5c add radare/objdump/wasm-objdump actions to menu 2026-04-28 00:17:51 +02:00
5f6537b7ea reenable --catch-outerspace and --catch-write-textsegment 2026-04-27 19:09:19 +02:00
5bfe1a366b disable --catch-outerspace and --catch-write-textsegment 2026-04-27 18:49:51 +02:00
f2559c8445 disable --catch-write-textsegment 2026-04-27 15:57:17 +02:00
4d0693dd30 disable --catch-outerspace 2026-04-27 15:49:18 +02:00
11 changed files with 353 additions and 264 deletions

BIN
fail/bin/fail-x86-tracing (Stored with Git LFS)

Binary file not shown.

BIN
fail/bin/generic-experiment-client (Stored with Git LFS)

Binary file not shown.

BIN
fail/bin/generic-experiment-server (Stored with Git LFS)

Binary file not shown.

BIN
fail/bin/import-trace (Stored with Git LFS)

Binary file not shown.

BIN
fail/bin/prune-trace (Stored with Git LFS)

Binary file not shown.

View File

@ -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
]; ];

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -201,59 +201,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 +267,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 +422,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

View File

@ -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;