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

unix.superglobalmegacorp.com

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