Annotation of 43BSD/ucb/pascal/pdx/process/resume.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)resume.c   5.1 (Berkeley) 6/6/85";
                      9: #endif not lint
                     10: /*
                     11:  * Resume execution, first setting appropriate registers.
                     12:  */
                     13: 
                     14: #include "defs.h"
                     15: #include <signal.h>
                     16: #include "process.h"
                     17: #include "machine.h"
                     18: #include "main.h"
                     19: #include "process.rep"
                     20: #include "runtime/frame.rep"
                     21: 
                     22: #include "machine/pxerrors.h"
                     23: #include "pxinfo.h"
                     24: 
                     25: #ifdef vax
                     26:     LOCAL ADDRESS fetchpc();
                     27: #endif
                     28: 
                     29: LOCAL ADDRESS *pcaddr;
                     30: 
                     31: /*
                     32:  * Resume execution, set (get) pcode location counter before (after) resuming.
                     33:  */
                     34: 
                     35: resume()
                     36: {
                     37:     register PROCESS *p;
                     38:     int oldsigno;
                     39: 
                     40:     p = process;
                     41:     do {
                     42:        if (option('e')) {
                     43:            printf("execution resumes at pc 0x%x, lc %d\n", process->pc, pc);
                     44:            fflush(stdout);
                     45:        }
                     46:        pcont(p);
                     47: #       ifdef sun
                     48:            if (pcaddr == 0) {
                     49:                dread(&pcaddr, PCADDRP, sizeof(pcaddr));
                     50:            }
                     51:            dread(&pc, pcaddr, sizeof(pc));
                     52: #       else ifdef vax
                     53:            if (p->status == STOPPED) {
                     54:                if (isbperr()) {
                     55:                    pc = p->reg[11];
                     56:                } else {
                     57:                    dread(&pcframe, PCADDRP, sizeof(pcframe));
                     58:                    pcframe++;
                     59:                    pc = fetchpc(pcframe);
                     60:                }
                     61:                pc -= (sizeof(char) + ENDOFF);
                     62:            }
                     63: #       endif
                     64:        if (option('e')) {
                     65:            printf("execution stops at pc 0x%x, lc %d on sig %d\n",
                     66:                process->pc, pc, p->signo);
                     67:            fflush(stdout);
                     68:        }
                     69:        if (p->status == STOPPED) {
                     70:            errnum = 0;
                     71:        }
                     72:     } while (p->signo == SIGCONT);
                     73:     if (option('r') && p->signo != 0) {
                     74:        choose();
                     75:     }
                     76: 
                     77:     /*
                     78:      * If px implements a breakpoint by executing a halt instruction
                     79:      * the real pc must be incremented to skip over it.
                     80:      *
                     81:      * Currently, px sends itself a signal so no incrementing is needed.
                     82:      *
                     83:        if (isbperr()) {
                     84:            p->pc++;
                     85:        }
                     86:      */
                     87: }
                     88: 
                     89: #ifdef vax
                     90: 
                     91: /*
                     92:  * Find the location in the Pascal object where execution was suspended.
                     93:  *
                     94:  * We basically walk back through the frames looking for saved
                     95:  * register 11's.  Each time we find one, we remember it.  When we reach
                     96:  * the frame associated with the interpreter procedure, the most recently
                     97:  * saved register 11 is the one we want.
                     98:  */
                     99: 
                    100: typedef struct {
                    101:     int fr_handler;
                    102:     unsigned int fr_psw : 16;   /* saved psw */
                    103:     unsigned int fr_mask : 12;  /* register save mask */
                    104:     unsigned int fr_unused : 1;
                    105:     unsigned int fr_s : 1;      /* call was a calls, not callg */
                    106:     unsigned int fr_spa : 2;    /* stack pointer alignment */
                    107:     unsigned int fr_savap;      /* saved arg pointer */
                    108:     unsigned int fr_savfp;      /* saved frame pointer */
                    109:     int fr_savpc;           /* saved program counter */
                    110: } Vaxframe;
                    111: 
                    112: #define regsaved(frame, n) ((frame.fr_mask&(1 << n)) != 0)
                    113: 
                    114: LOCAL ADDRESS fetchpc(framep)
                    115: ADDRESS *framep;
                    116: {
                    117:     register PROCESS *p;
                    118:     Vaxframe vframe;
                    119:     ADDRESS *savfp;
                    120:     ADDRESS r;
                    121: 
                    122:     p = process;
                    123:     r = p->reg[11];
                    124:     if (p->fp == (ADDRESS) framep) {
                    125:        return r;
                    126:     }
                    127:     savfp = (ADDRESS *) p->fp;
                    128:     dread(&vframe, savfp, sizeof(vframe));
                    129:     while (vframe.fr_savfp != (int) framep && vframe.fr_savfp != 0) {
                    130:        if (regsaved(vframe, 11)) {
                    131:            dread(&r, savfp + 5, sizeof(r));
                    132:            r -= sizeof(char);
                    133:        }
                    134:        savfp = (ADDRESS *) vframe.fr_savfp;
                    135:        dread(&vframe, savfp, sizeof(vframe));
                    136:     }
                    137:     if (vframe.fr_savfp == 0) {
                    138:        panic("resume: can't find interpreter frame 0x%x", framep);
                    139:     }
                    140:     if (regsaved(vframe, 11)) {
                    141:        dread(&r, savfp + 5, sizeof(r));
                    142:        r -= sizeof(char);
                    143:     }
                    144:     return(r);
                    145: }
                    146: 
                    147: #endif
                    148: 
                    149: /*
                    150:  * Under the -r option, we offer the opportunity to just get
                    151:  * the px traceback and not actually enter the debugger.
                    152:  *
                    153:  * If the standard input is not a tty but standard error is,
                    154:  * change standard input to be /dev/tty.
                    155:  */
                    156: 
                    157: LOCAL choose()
                    158: {
                    159:     register int c;
                    160: 
                    161:     if (!isterm(stdin)) {
                    162:        if (!isterm(stderr) || freopen("/dev/tty", "r", stdin) == NIL) {
                    163:            unsetsigtraces(process);
                    164:            pcont(process);
                    165:            quit(process->exitval);
                    166:            /* NOTREACHED */
                    167:        }
                    168:     }
                    169:     fprintf(stderr, "\nProgram error");
                    170:     if (errnum != 0) {
                    171:        fprintf(stderr, " -- %s", pxerrmsg[errnum]);
                    172:     }
                    173:     fprintf(stderr, "\nDo you wish to enter the debugger? ");
                    174:     c = getchar();
                    175:     if (c == 'n') {
                    176:        unsetsigtraces(process);
                    177:        pcont(process);
                    178:        quit(process->exitval);
                    179:     }
                    180:     while (c != '\n' && c != EOF) {
                    181:        c = getchar();
                    182:     }
                    183:     fprintf(stderr, "\nEntering debugger ...");
                    184:     init();
                    185:     option('r') = FALSE;
                    186:     fprintf(stderr, " type 'help' for help.\n");
                    187: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.