BSD 4_3_Net_2 release
[unix-history] / usr / src / usr.bin / pascal / pdx / process / resume.c
index 62343c0..3f170c3 100644 (file)
@@ -1,9 +1,42 @@
-/* Copyright (c) 1982 Regents of the University of California */
+/*-
+ * Copyright (c) 1980 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
 
 
-static char sccsid[] = "@(#)resume.c 1.5 %G%";
+#ifndef lint
+static char sccsid[] = "@(#)resume.c   5.4 (Berkeley) 4/16/91";
+#endif /* not lint */
 
 /*
 
 /*
- * resume execution, first setting appropriate registers
+ * Resume execution, first setting appropriate registers.
  */
 
 #include "defs.h"
  */
 
 #include "defs.h"
@@ -14,22 +47,16 @@ static char sccsid[] = "@(#)resume.c 1.5 %G%";
 #include "process.rep"
 #include "runtime/frame.rep"
 
 #include "process.rep"
 #include "runtime/frame.rep"
 
-#   if (isvaxpx)
-#       include "machine/pxerrors.h"
-#       include "pxinfo.h"
-#   endif
-
-LOCAL ADDRESS fetchpc();
+#include "machine/pxerrors.h"
+#include "pxinfo.h"
 
 /*
 
 /*
- * If we hit a breakpoint, px's pc points at a halt instruction,
- * this must be avoided when restarting.
+ * Resume execution, set (get) pcode location counter before (after) resuming.
  */
 
 resume()
 {
     register PROCESS *p;
  */
 
 resume()
 {
     register PROCESS *p;
-    int oldsigno;
 
     p = process;
     do {
 
     p = process;
     do {
@@ -38,110 +65,50 @@ resume()
            fflush(stdout);
        }
        pcont(p);
            fflush(stdout);
        }
        pcont(p);
-#       if (isvaxpx)
-           if (p->status == STOPPED) {
-               if (isbperr()) {
-                   pc = p->reg[11];
-               } else {
-                   dread(&pcframe, PCADDRP, sizeof(pcframe));
-                   pcframe++;
-                   pc = fetchpc(pcframe);
-               }
-               pc -= (sizeof(char) + ENDOFF);
-           }
-#       else
-           pc = process->pc;
-#       endif
+       dread(&pc, PCADDR, sizeof(pc));         /* Get pcode pc */
        if (option('e')) {
            printf("execution stops at pc 0x%x, lc %d on sig %d\n",
                process->pc, pc, p->signo);
            fflush(stdout);
        }
        if (option('e')) {
            printf("execution stops at pc 0x%x, lc %d on sig %d\n",
                process->pc, pc, p->signo);
            fflush(stdout);
        }
-       if (p->status == STOPPED) {
-           errnum = 0;
-       }
     } while (p->signo == SIGCONT);
     } while (p->signo == SIGCONT);
-#   if (isvaxpx)
-       if (option('r') && p->signo != 0) {
-           choose();
-       }
+    if (option('r') && p->signo != 0) {
+       choose();
+    }
+
+    /*
+     * If px implements a breakpoint by executing a halt instruction
+     * the real pc must be incremented to skip over it.
+     *
+     * Currently, px sends itself a signal so no incrementing is needed.
+     *
        if (isbperr()) {
            p->pc++;
        }
        if (isbperr()) {
            p->pc++;
        }
-#   endif
-}
-
-# if (isvaxpx)
-
-/*
- * Find the location in the Pascal object where execution was suspended.
- *
- * We basically walk back through the frames looking for saved
- * register 11's.  Each time we find one, we remember it.  When we reach
- * the frame associated with the interpreter procedure, the most recently
- * saved register 11 is the one we want.
- */
-
-typedef struct {
-    int fr_handler;
-    unsigned int fr_psw : 16;   /* saved psw */
-    unsigned int fr_mask : 12;  /* register save mask */
-    unsigned int fr_unused : 1;
-    unsigned int fr_s : 1;      /* call was a calls, not callg */
-    unsigned int fr_spa : 2;    /* stack pointer alignment */
-    unsigned int fr_savap;      /* saved arg pointer */
-    unsigned int fr_savfp;      /* saved frame pointer */
-    int fr_savpc;           /* saved program counter */
-} Vaxframe;
-
-#define regsaved(frame, n) ((frame.fr_mask&(1 << n)) != 0)
-
-LOCAL ADDRESS fetchpc(framep)
-ADDRESS *framep;
-{
-    register PROCESS *p;
-    Vaxframe vframe;
-    ADDRESS *savfp;
-    ADDRESS r;
-
-    p = process;
-    r = p->reg[11];
-    if (p->fp == (ADDRESS) framep) {
-       return r;
-    }
-    savfp = (ADDRESS *) p->fp;
-    dread(&vframe, savfp, sizeof(vframe));
-    while (vframe.fr_savfp != (int) framep && vframe.fr_savfp != 0) {
-       if (regsaved(vframe, 11)) {
-           dread(&r, savfp + 5, sizeof(r));
-           r -= sizeof(char);
-       }
-       savfp = (ADDRESS *) vframe.fr_savfp;
-       dread(&vframe, savfp, sizeof(vframe));
-    }
-    if (vframe.fr_savfp == 0) {
-       panic("resume: can't find interpreter frame 0x%x", framep);
-    }
-    if (regsaved(vframe, 11)) {
-       dread(&r, savfp + 5, sizeof(r));
-       r -= sizeof(char);
-    }
-    return(r);
+     */
 }
 
 /*
  * Under the -r option, we offer the opportunity to just get
  * the px traceback and not actually enter the debugger.
 }
 
 /*
  * Under the -r option, we offer the opportunity to just get
  * the px traceback and not actually enter the debugger.
+ *
+ * If the standard input is not a tty but standard error is,
+ * change standard input to be /dev/tty.
  */
 
 LOCAL choose()
 {
     register int c;
 
  */
 
 LOCAL choose()
 {
     register int c;
 
-    fprintf(stderr, "\nProgram error");
-    if (errnum != 0) {
-       fprintf(stderr, " -- %s", pxerrmsg[errnum]);
+    if (!isterm(stdin)) {
+       if (!isterm(stderr) || freopen("/dev/tty", "r", stdin) == NIL) {
+           unsetsigtraces(process);
+           pcont(process);
+           quit(process->exitval);
+           /* NOTREACHED */
+       }
     }
     }
+    fprintf(stderr, "\nProgram error");
     fprintf(stderr, "\nDo you wish to enter the debugger? ");
     c = getchar();
     if (c == 'n') {
     fprintf(stderr, "\nDo you wish to enter the debugger? ");
     c = getchar();
     if (c == 'n') {
@@ -149,7 +116,7 @@ LOCAL choose()
        pcont(process);
        quit(process->exitval);
     }
        pcont(process);
        quit(process->exitval);
     }
-    while (c != '\n') {
+    while (c != '\n' && c != EOF) {
        c = getchar();
     }
     fprintf(stderr, "\nEntering debugger ...");
        c = getchar();
     }
     fprintf(stderr, "\nEntering debugger ...");
@@ -157,5 +124,3 @@ LOCAL choose()
     option('r') = FALSE;
     fprintf(stderr, " type 'help' for help.\n");
 }
     option('r') = FALSE;
     fprintf(stderr, " type 'help' for help.\n");
 }
-
-# endif