slight change in the way signals are handled -- px now gets
authorMark Linton <linton@ucbvax.Berkeley.EDU>
Mon, 8 Feb 1982 08:08:46 +0000 (00:08 -0800)
committerMark Linton <linton@ucbvax.Berkeley.EDU>
Mon, 8 Feb 1982 08:08:46 +0000 (00:08 -0800)
all but interrupt, trap, and iot, it is assumed px handles the errors
and then sends itself a trap

SCCS-vsn: usr.bin/pascal/pdx/process/start.c 1.3
SCCS-vsn: usr.bin/pascal/pdx/process/resume.c 1.4

usr/src/usr.bin/pascal/pdx/process/resume.c
usr/src/usr.bin/pascal/pdx/process/start.c

index 16bd6de..f371817 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1982 Regents of the University of California */
 
 /* Copyright (c) 1982 Regents of the University of California */
 
-static char sccsid[] = "@(#)resume.c 1.3 %G%";
+static char sccsid[] = "@(#)resume.c 1.4 %G%";
 
 /*
  * resume execution, first setting appropriate registers
 
 /*
  * resume execution, first setting appropriate registers
@@ -14,10 +14,10 @@ static char sccsid[] = "@(#)resume.c 1.3 %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
+#   if (isvaxpx)
+#       include "machine/pxerrors.h"
+#       include "pxinfo.h"
+#   endif
 
 LOCAL ADDRESS fetchpc();
 
 
 LOCAL ADDRESS fetchpc();
 
@@ -28,61 +28,47 @@ LOCAL ADDRESS fetchpc();
 
 resume()
 {
 
 resume()
 {
-       register PROCESS *p;
-       int oldsigno;
-
-       p = process;
-       do {
-               if (option('e')) {
-                       printf("execution resumes at pc 0x%x, lc %d\n", process->pc, pc);
-                       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
-               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);
-#      if (isvaxpx)
-               oldsigno = p->signo;
-               switch (p->signo) {
-                       case SIGFPE:
-                               errnum = EOVERFLOW;
-                               p->signo = ESIGNAL;
-                               break;
-
-                       case SIGSEGV:
-                               errnum = ESTKOVER;
-                               p->signo = ESIGNAL;
-                               break;
-               }
-               if (option('r') && oldsigno != 0) {
-                       p->signo = oldsigno;
-                       choose();
-                       p->signo = ESIGNAL;
-               }
+    register PROCESS *p;
+    int oldsigno;
+
+    p = process;
+    do {
+       if (option('e')) {
+           printf("execution resumes at pc 0x%x, lc %d\n", process->pc, pc);
+           fflush(stdout);
+       }
+       pcont(p);
+#       if (isvaxpx)
+           if (p->status == STOPPED) {
                if (isbperr()) {
                if (isbperr()) {
-                       p->pc++;
+                   pc = p->reg[11];
+               } else {
+                   dread(&pcframe, PCADDRP, sizeof(pcframe));
+                   pcframe++;
+                   pc = fetchpc(pcframe);
                }
                }
-#      endif
+               pc -= (sizeof(char) + ENDOFF);
+           }
+#       else
+           pc = process->pc;
+#       endif
+       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);
+#   if (isvaxpx)
+       if (option('r') && p->signo != 0) {
+           choose();
+       }
+       if (isbperr()) {
+           p->pc++;
+       }
+#   endif
 }
 
 # if (isvaxpx)
 }
 
 # if (isvaxpx)
@@ -92,45 +78,45 @@ resume()
  */
 
 typedef struct {
  */
 
 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 */
+    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;
 
 LOCAL ADDRESS fetchpc(framep)
 ADDRESS *framep;
 {
 } Vaxframe;
 
 LOCAL ADDRESS fetchpc(framep)
 ADDRESS *framep;
 {
-       register PROCESS *p;
-       Vaxframe vframe;
-       ADDRESS *savfp;
-       ADDRESS r;
-
-       p = process;
-       if (p->fp == (ADDRESS) framep) {
-               return(p->reg[11]);
-       }
-       savfp = (ADDRESS *) p->fp;
+    register PROCESS *p;
+    Vaxframe vframe;
+    ADDRESS *savfp;
+    ADDRESS r;
+
+    p = process;
+    if (p->fp == (ADDRESS) framep) {
+       return(p->reg[11]);
+    }
+    savfp = (ADDRESS *) p->fp;
+    dread(&vframe, savfp, sizeof(vframe));
+    while (vframe.fr_savfp != (int) framep && vframe.fr_savfp != 0) {
+       savfp = (ADDRESS *) vframe.fr_savfp;
        dread(&vframe, savfp, sizeof(vframe));
        dread(&vframe, savfp, sizeof(vframe));
-       while (vframe.fr_savfp != (int) framep && vframe.fr_savfp != 0) {
-               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 (vframe.fr_mask == 0) {
-               r = p->reg[11];
-       } else {
-               dread(&r, savfp + 5, sizeof(r));
-               r -= sizeof(char);
-       }
-       return(r);
+    }
+    if (vframe.fr_savfp == 0) {
+       panic("resume: can't find interpreter frame 0x%x", framep);
+    }
+    if (vframe.fr_mask == 0) {
+       r = p->reg[11];
+    } else {
+       dread(&r, savfp + 5, sizeof(r));
+       r -= sizeof(char);
+    }
+    return(r);
 }
 
 /*
 }
 
 /*
@@ -140,26 +126,26 @@ ADDRESS *framep;
 
 LOCAL choose()
 {
 
 LOCAL choose()
 {
-       register int c;
-
-       fprintf(stderr, "\nProgram error");
-       if (errnum != 0) {
-               fprintf(stderr, " -- %s", pxerrmsg[errnum]);
-       }
-       fprintf(stderr, "\nDo you wish to enter the debugger? ");
+    register int c;
+
+    fprintf(stderr, "\nProgram error");
+    if (errnum != 0) {
+       fprintf(stderr, " -- %s", pxerrmsg[errnum]);
+    }
+    fprintf(stderr, "\nDo you wish to enter the debugger? ");
+    c = getchar();
+    if (c == 'n') {
+       unsetsigtraces(process);
+       pcont(process);
+       quit(process->exitval);
+    }
+    while (c != '\n') {
        c = getchar();
        c = getchar();
-       if (c == 'n') {
-               unsetsigtraces(process);
-               pcont(process);
-               quit(process->exitval);
-       }
-       while (c != '\n') {
-               c = getchar();
-       }
-       fprintf(stderr, "\nEntering debugger ...");
-       init();
-       option('r') = FALSE;
-       fprintf(stderr, " type 'help' for help.\n");
+    }
+    fprintf(stderr, "\nEntering debugger ...");
+    init();
+    option('r') = FALSE;
+    fprintf(stderr, " type 'help' for help.\n");
 }
 
 # endif
 }
 
 # endif
index 37cbe9e..ad3123c 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1982 Regents of the University of California */
 
 /* Copyright (c) 1982 Regents of the University of California */
 
-static char sccsid[] = "@(#)start.c 1.2 %G%";
+static char sccsid[] = "@(#)start.c 1.3 %G%";
 
 /*
  * Begin execution.
 
 /*
  * Begin execution.
@@ -26,9 +26,9 @@ static char sccsid[] = "@(#)start.c 1.2 %G%";
 #include "sym.h"
 #include "process.rep"
 
 #include "sym.h"
 #include "process.rep"
 
-#      if (isvaxpx)
-#              include "pxinfo.h"
-#      endif
+#   if (isvaxpx)
+#       include "pxinfo.h"
+#   endif
 
 LOCAL PROCESS pbuf;
 
 
 LOCAL PROCESS pbuf;
 
@@ -36,53 +36,53 @@ start(argv, infile, outfile)
 char **argv;
 char *infile, *outfile;
 {
 char **argv;
 char *infile, *outfile;
 {
-       char *cmd;
+    char *cmd;
 
 
-       process = &pbuf;
-       setsigtrace();
-#      if (isvaxpx)
-               cmd = "px";
-#      else
-               cmd = argv[0];
-#      endif
-       pstart(process, cmd, argv, infile, outfile);
-       if (process->status == STOPPED) {
-#              if (isvaxpx)
-                       TRAPARGS *ap, t;
+    process = &pbuf;
+    setsigtrace();
+#   if (isvaxpx)
+       cmd = "px";
+#   else
+       cmd = argv[0];
+#   endif
+    pstart(process, cmd, argv, infile, outfile);
+    if (process->status == STOPPED) {
+#       if (isvaxpx)
+           TRAPARGS *ap, t;
 
 
-                       pcont(process);
-                       if (process->status != STOPPED) {
-                               if (option('t')) {
-                                       quit(process->exitval);
-                               } else {
-                                       panic("px exited with %d", process->exitval);
-                               }
-                       }
-                       dread(&ap, process->fp + 2*sizeof(int), sizeof(ap));
-                       dread(&t, ap, sizeof(TRAPARGS));
-                       if (t.nargs != 5) {
-                               if (option('t')) {
-                                       unsetsigtraces(process);
-                                       pcont(process);
-                                       quit(process->exitval);
-                               } else {
-                                       panic("start: args out of sync");
-                               }
-                       }
-                       DISPLAY = t.disp;
-                       DP = t.dp;
-                       ENDOFF = t.objstart;
-                       PCADDRP = t.pcaddrp;
-                       LOOPADDR = t.loopaddr;
-#              endif
-               pc = 0;
-               curfunc = program;
-               if (objsize != 0) {
-                       addbp(lastaddr(), END_BP, NIL, NIL, NIL, 0);
+           pcont(process);
+           if (process->status != STOPPED) {
+               if (option('t')) {
+                   quit(process->exitval);
+               } else {
+                   panic("px exited with %d", process->exitval);
                }
                }
-       } else {
-               panic("could not start program");
+           }
+           dread(&ap, process->fp + 2*sizeof(int), sizeof(ap));
+           dread(&t, ap, sizeof(TRAPARGS));
+           if (t.nargs != 5) {
+               if (option('t')) {
+                   unsetsigtraces(process);
+                   pcont(process);
+                   quit(process->exitval);
+               } else {
+                   panic("start: args out of sync");
+               }
+           }
+           DISPLAY = t.disp;
+           DP = t.dp;
+           ENDOFF = t.objstart;
+           PCADDRP = t.pcaddrp;
+           LOOPADDR = t.loopaddr;
+#       endif
+       pc = 0;
+       curfunc = program;
+       if (objsize != 0) {
+           addbp(lastaddr(), END_BP, NIL, NIL, NIL, 0);
        }
        }
+    } else {
+       panic("could not start program");
+    }
 }
 
 /*
 }
 
 /*
@@ -96,18 +96,18 @@ char *infile, *outfile;
 
 endprogram()
 {
 
 endprogram()
 {
-       char *filename;
+    char *filename;
 
 
-       if (ss_variables) {
-               prvarnews();
-       }
-       printf("\nexecution completed\n");
-       curfunc = program;
-       if ((filename = srcfilename(pc)) != cursource) {
-               skimsource(filename);
-       }
-       curline = lastlinenum;
-       erecover();
+    if (ss_variables) {
+       prvarnews();
+    }
+    printf("\nexecution completed\n");
+    curfunc = program;
+    if ((filename = srcfilename(pc)) != cursource) {
+       skimsource(filename);
+    }
+    curline = lastlinenum;
+    erecover();
 }
 
 /*
 }
 
 /*
@@ -116,13 +116,11 @@ endprogram()
 
 LOCAL setsigtrace()
 {
 
 LOCAL setsigtrace()
 {
-       register int i;
-       register PROCESS *p;
+    register int i;
+    register PROCESS *p;
 
 
-       p = process;
-       for (i = 1; i < NSIG; i++) {
-               psigtrace(p, i, TRUE);
-       }
-       psigtrace(p, SIGHUP, FALSE);
-       psigtrace(p, SIGKILL, FALSE);
+    p = process;
+    psigtrace(p, SIGINT, TRUE);
+    psigtrace(p, SIGTRAP, TRUE);
+    psigtrace(p, SIGIOT, TRUE);
 }
 }