Updated to use Bochs 2.6.11
[pintos-anon] / src / utils / pintos
index eca4708516e41f3c715d2145e761ba775036ed6a..58635a9b65f5a08547f97264a77d467cedee673a 100755 (executable)
@@ -32,6 +32,7 @@ our (@disks);                 # Extra disk images to pass to simulator.
 our ($loader_fn);              # Bootstrap loader.
 our (%geometry);               # IDE disk geometry.
 our ($align);                  # Partition alignment.
+our ($gdb_port) = $ENV{"GDB_PORT"} || "1234"; # Port to listen on for GDB
 
 parse_command_line ();
 prepare_scratch_disk ();
@@ -113,6 +114,8 @@ sub parse_command_line {
     $align = "bochs",
       print STDERR "warning: setting --align=bochs for Bochs support\n"
        if $sim eq 'bochs' && defined ($align) && $align eq 'none';
+
+    $kill_on_failure = 0;
 }
 
 # usage($exitcode).
@@ -561,9 +564,12 @@ cpu: ips=1000000
 megs: $mem
 log: bochsout.txt
 panic: action=fatal
-user_shortcut: keys=ctrlaltdel
+# For older bochs:
+#user_shortcut: keys=ctrlaltdel
+# For more recent bochs:
+keyboard: user_shortcut=ctrl-alt-del
 EOF
-    print BOCHSRC "gdbstub: enabled=1\n" if $debug eq 'gdb';
+    print BOCHSRC "gdbstub: enabled=1, port=$gdb_port\n" if $debug eq 'gdb';
     print BOCHSRC "clock: sync=", $realtime ? 'realtime' : 'none',
       ", time0=0\n";
     print BOCHSRC "ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15\n"
@@ -621,16 +627,23 @@ sub run_qemu {
     my (@cmd) = ('qemu-system-i386');
     push (@cmd, '-device', 'isa-debug-exit');
 
-    push (@cmd, '-hda', $disks[0]) if defined $disks[0];
-    push (@cmd, '-hdb', $disks[1]) if defined $disks[1];
-    push (@cmd, '-hdc', $disks[2]) if defined $disks[2];
-    push (@cmd, '-hdd', $disks[3]) if defined $disks[3];
+    my ($i);
+    for ($i = 0; $i < 4; $i++) {
+       if (defined $disks[$i]) {
+           push (@cmd, '-drive');
+           push (@cmd, "file=$disks[$i],format=raw,index=$i,media=disk");
+       }
+    }
+#    push (@cmd, '-hda', $disks[0]) if defined $disks[0];
+#    push (@cmd, '-hdb', $disks[1]) if defined $disks[1];
+#    push (@cmd, '-hdc', $disks[2]) if defined $disks[2];
+#    push (@cmd, '-hdd', $disks[3]) if defined $disks[3];
     push (@cmd, '-m', $mem);
     push (@cmd, '-net', 'none');
     push (@cmd, '-nographic') if $vga eq 'none';
     push (@cmd, '-serial', 'stdio') if $serial && $vga ne 'none';
     push (@cmd, '-S') if $debug eq 'monitor';
-    push (@cmd, '-s', '-S') if $debug eq 'gdb';
+    push (@cmd, '-gdb', "tcp::$gdb_port", '-S') if $debug eq 'gdb';
     push (@cmd, '-monitor', 'null') if $vga eq 'none' && $debug eq 'none';
     run_command (@cmd);
 }
@@ -827,8 +840,8 @@ sub xsystem {
 
                # Read and print out pipe data.
                my ($len) = length ($buf);
-               waitpid ($pid, 0), last
-                 if sysread ($in, $buf, 4096, $len) <= 0;
+               my ($n_read) = sysread ($in, $buf, 4096, $len);
+               waitpid ($pid, 0), last if !defined ($n_read) || $n_read <= 0;
                print substr ($buf, $len);
 
                # Remove full lines from $buf and scan them for keywords.
@@ -853,7 +866,7 @@ sub xsystem {
        alarm (0);
        &$cleanup ();
 
-       if (WIFSIGNALED ($?) && WTERMSIG ($?) == SIGVTALRM ()) {
+       if (WIFSIGNALED ($?) && WTERMSIG ($?) == SIGVTALRM_number ()) {
            seek (STDOUT, 0, 2);
            print "\nTIMEOUT after $timeout seconds of host CPU time\n";
            exit 0;
@@ -912,7 +925,7 @@ sub get_load_average {
 # Calls setitimer to set a timeout, then execs what was passed to us.
 sub exec_setitimer {
     if (defined $timeout) {
-       if ($\16 ge 5.8.0) {
+       if ($^V ge 5.8.0) {
            eval "
               use Time::HiRes qw(setitimer ITIMER_VIRTUAL);
               setitimer (ITIMER_VIRTUAL, $timeout, 0);
@@ -928,7 +941,7 @@ sub exec_setitimer {
     exit (1);
 }
 
-sub SIGVTALRM {
+sub SIGVTALRM_number {
     use Config;
     my $i = 0;
     foreach my $name (split(' ', $Config{sig_name})) {