diff --git a/scripts/runner.pl b/scripts/runner.pl index 7229e2f..a15e179 100644 --- a/scripts/runner.pl +++ b/scripts/runner.pl @@ -4,6 +4,8 @@ use strict; use warnings; use diagnostics; +use IO::Socket::INET; + use feature 'say'; my $remote_root = '/home/lab/smchurla/Documents/failnix'; @@ -75,6 +77,29 @@ sub update_db_config { say "Updated db.conf for database $db_prefix\_$experiment"; } +sub wait_for_port { + my ( $host, $port, $timeout ) = @_; + my $deadline = time + $timeout; + + while ( time < $deadline ) { + my $sock = IO::Socket::INET->new( + PeerHost => $host, + PeerPort => $port, + Proto => 'tcp', + Timeout => 1, + ); + + if ($sock) { + close $sock; + return 1; + } + + select undef, undef, undef, 0.1; + } + + return 0; +} + sub cpu_count { open( my $handle, "/proc/cpuinfo" ) or die "Can't open cpuinfo: $!\n"; my $count = scalar( map /^processor/, <$handle> ); @@ -96,7 +121,23 @@ sub trace { notify("Tracing $experiment..."); system( -"$bochs_runner -V $fail_share/vgabios.bin -b $fail_share/BIOS-bochs-latest -1 -f $fail_trace -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,--end-symbol=fail_stop_trace -Wf,--state-file=$remote_builds_dir/$experiment/state -Wf,--trace-file=$remote_builds_dir/$experiment/trace.pb -Wf,--elf-file=$remote_builds_dir/$experiment/system.elf" + join " ", + ( + "$bochs_runner", + "-V $fail_share/vgabios.bin", + "-b $fail_share/BIOS-bochs-latest", + "-1", + "-f $fail_trace", + "-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,--end-symbol=fail_stop_trace", + "-Wf,--state-file=$remote_builds_dir/$experiment/state", + "-Wf,--trace-file=$remote_builds_dir/$experiment/trace.pb", + "-Wf,--elf-file=$remote_builds_dir/$experiment/system.elf" + ) ); # notify("Tracing $experiment complete."); @@ -108,25 +149,93 @@ sub import_trace { notify("Importing $experiment trace..."); system( -"$fail_import --database-option-file $remote_db_conf -t $remote_builds_dir/$experiment/trace.pb -i MemoryImporter -e $remote_builds_dir/$experiment/system.elf -v $experiment -b mem" + join " ", + ( + "$fail_import", + "--database-option-file $remote_db_conf", + "-t $remote_builds_dir/$experiment/trace.pb", + "-i MemoryImporter", + "-e $remote_builds_dir/$experiment/system.elf", + "-v $experiment", + "-b mem" + ) ); system( -"$fail_import --database-option-file $remote_db_conf -t $remote_builds_dir/$experiment/trace.pb -i RegisterImporter -e $remote_builds_dir/$experiment/system.elf -v $experiment -b regs --flags" + join " ", + ( + "$fail_import", + "--database-option-file $remote_db_conf", + "-t $remote_builds_dir/$experiment/trace.pb", + "-i RegisterImporter", + "-e $remote_builds_dir/$experiment/system.elf", + "-v $experiment", + "-b regs", + "--flags" + ) ); system( -"$fail_import --database-option-file $remote_db_conf -t $remote_builds_dir/$experiment/trace.pb -i RegisterImporter -e $remote_builds_dir/$experiment/system.elf -v $experiment -b ip --no-gp --ip" + join " ", + ( + "$fail_import", + "--database-option-file $remote_db_conf", + "-t $remote_builds_dir/$experiment/trace.pb", + "-i RegisterImporter", + "-e $remote_builds_dir/$experiment/system.elf", + "-v $experiment", + "-b ip", + "--no-gp", + "--ip" + ) + ); + + system( + join " ", + ( + "$fail_import", + "--database-option-file $remote_db_conf", + "-t $remote_builds_dir/$experiment/trace.pb", + "-i ElfImporter", + "--objdump objdump", + "-e $remote_builds_dir/$experiment/system.elf", + "-v $experiment", + "-b ip" + ) ); system( -"$fail_import --database-option-file $remote_db_conf -t $remote_builds_dir/$experiment/trace.pb -i ElfImporter --objdump objdump -e $remote_builds_dir/$experiment/system.elf -v $experiment -b ip" + join " ", + ( + "$fail_import", + "--database-option-file $remote_db_conf", + "-t $remote_builds_dir/$experiment/trace.pb", + "-i ElfImporter", + "--objdump objdump", + "-e $remote_builds_dir/$experiment/system.elf", + "-v $experiment", + "-b mem" + ) ); system( -"$fail_import --database-option-file $remote_db_conf -t $remote_builds_dir/$experiment/trace.pb -i ElfImporter --objdump objdump -e $remote_builds_dir/$experiment/system.elf -v $experiment -b mem" + join " ", + ( + "$fail_import", + "--database-option-file $remote_db_conf", + "-t $remote_builds_dir/$experiment/trace.pb", + "-i ElfImporter", + "--objdump objdump", + "-e $remote_builds_dir/$experiment/system.elf", + "-v $experiment", + "-b regs" + ) ); + system( -"$fail_import --database-option-file $remote_db_conf -t $remote_builds_dir/$experiment/trace.pb -i ElfImporter --objdump objdump -e $remote_builds_dir/$experiment/system.elf -v $experiment -b regs" - ); - system( -"$fail_prune --database-option-file $remote_db_conf -v $experiment -b %% --overwrite" + join " ", + ( + "$fail_prune", + "--database-option-file $remote_db_conf", + "-v $experiment", + "-b %%", "--overwrite" + ) ); # notify("Importing $experiment trace complete."); @@ -147,17 +256,53 @@ sub inject { if ( $pid == 0 ) { # child -> server + say "Running server in child process..."; exec( -"$fail_server --port $fail_server_port --database-option-file $remote_db_conf -v $experiment -b % --inject-single-bit --inject-registers" + join " ", + ( + "$fail_server", + "--port $fail_server_port", + "--database-option-file $remote_db_conf", + "-v $experiment", + "-b %", + "--inject-single-bit", + "--inject-registers" + ) ) or die "exec server failed: $!"; } # parent -> client - # "-Wf,--catch-write-textsegment", + + say "Waiting for server..."; + die "Server did not become ready on port $fail_server_port\n" + unless wait_for_port( "127.0.0.1", $fail_server_port, 10 ); + say "Running client with $count cores in parent process"; + system( -"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,--timeout=500000 -Wf,--ok-marker=fail_marker_positive -Wf,--fail-marker=fail_marker_negative -Wf,--detected-marker=fail_marker_detected > /dev/null" + 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" + ) ) or die "client failed: $?"; say "Killing server with pid $pid..."; @@ -187,7 +332,7 @@ sub results { notify("Querying $experiment..."); my $results_overview_query = "SELECT -variant, benchmark, resulttype, sum(t.time2 - t.time1 + 1) as faults +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