Annotation of researchv10no/cmd/adb/v7/trcrun.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * machine-specific functions for running the debugged process
                      3:  * v7-style (ptrace)
                      4:  */
                      5: 
                      6: #include "defs.h"
                      7: #include "regs.h"
                      8: #include "ptrace.h"
                      9: #include <sys/param.h>
                     10: #include <signal.h>
                     11: 
                     12: extern char lastc, peekc;
                     13: extern ADDR txtsize;
                     14: 
                     15: /*
                     16:  * kill process
                     17:  */
                     18: 
                     19: killpcs()
                     20: {
                     21: 
                     22:        ptrace(P_KILL, pid, 0, 0);
                     23: }
                     24: 
                     25: /*
                     26:  * grab the process already opened (but not traced);
                     27:  * stop it so we can look at it
                     28:  */
                     29: 
                     30: grab()
                     31: {
                     32: 
                     33:        error("antique system, can't grab");
                     34: }
                     35: 
                     36: /*
                     37:  * turn off tracing & let it go
                     38:  */
                     39: 
                     40: ungrab()
                     41: {
                     42: 
                     43:        error("antique system, can't ungrab");
                     44: }
                     45: 
                     46: /*
                     47:  * get the program to be debugged ready to run
                     48:  * program is left stopped at the beginning (so we can poke in breakpoints)
                     49:  */
                     50: 
                     51: extern int (*sigint)(), (*sigqit)();
                     52: 
                     53: startpcs()
                     54: {
                     55: 
                     56:        if ((pid = fork()) == 0) {
                     57:                close(fsym);
                     58:                close(fcor);
                     59:                signal(SIGINT, sigint);
                     60:                signal(SIGQUIT, sigqit);
                     61:                doexec();
                     62:                exit(0);
                     63:        }
                     64:        if (pid == -1)
                     65:                error("cannot fork");
                     66:        bpwait();
                     67:        if (adrflg)
                     68:                rput(PC, wtoa(adrval));
                     69:        while (rdc() != EOR)
                     70:                ;
                     71:        reread();
                     72: }
                     73: 
                     74: /*
                     75:  * set process running, single-stepped
                     76:  */
                     77: 
                     78: runstep(keepsig)
                     79: int keepsig;
                     80: {
                     81: 
                     82:        delbp();
                     83:        ptrace(P_STEP, pid, CONTNEXT, keepsig ? signo : 0);
                     84: }
                     85: 
                     86: /*
                     87:  * set process running
                     88:  */
                     89: 
                     90: runrun(keepsig)
                     91: int keepsig;
                     92: {
                     93: 
                     94:        ptrace(P_CONT, pid, CONTNEXT, keepsig ? signo : 0);
                     95: }
                     96: 
                     97: /*
                     98:  * exec the program to be debugged
                     99:  * opening standard input and output as requested
                    100:  */
                    101: 
                    102: extern char **environ;
                    103: 
                    104: doexec()
                    105: {
                    106:        char *argl[MAXARG];
                    107:        char args[LINSIZ];
                    108:        register char *p;
                    109:        register char **ap;
                    110:        register char *thisarg;
                    111: 
                    112:        ap = argl;
                    113:        p = args;
                    114:        *ap++ = symfil;
                    115:        for (rdc(); lastc != EOR;) {
                    116:                thisarg = p;
                    117:                if (lastc == '<' || lastc == '>') {
                    118:                        *p++ = lastc;
                    119:                        rdc();
                    120:                }
                    121:                while (lastc != EOR && lastc != SPC && lastc != TB) {
                    122:                        *p++ = lastc;
                    123:                        readchar();
                    124:                }
                    125:                if (lastc == SPC || lastc == TB)
                    126:                        rdc();
                    127:                *p++ = 0;
                    128:                if (*thisarg == '<') {
                    129:                        close(0);
                    130:                        if (open(&thisarg[1], 0) < 0) {
                    131:                                printf("%s: cannot open\n", &thisarg[1]);
                    132:                                _exit(0);
                    133:                        }
                    134:                }
                    135:                else if (*thisarg == '>') {
                    136:                        close(1);
                    137:                        if (creat(&thisarg[1], 0666) < 0) {
                    138:                                printf("%s: cannot create\n", &thisarg[1]);
                    139:                                _exit(0);
                    140:                        }
                    141:                }
                    142:                else
                    143:                        *ap++ = thisarg;
                    144:        }
                    145:        *ap = NULL;
                    146:        ptrace(P_INIT, 0, (int *)0, 0);
                    147:        execve(symfil, argl, environ);
                    148:        perror(symfil);
                    149: }
                    150: 
                    151: /*
                    152:  * wait for the process to stop;
                    153:  * pick up status and registers when it does
                    154:  */
                    155: 
                    156: #define        WSLEEP  10
                    157: 
                    158: extern int errno;
                    159: 
                    160: bpwait()
                    161: {
                    162:        register int w;
                    163:        int stat;
                    164:        int (*isig)();
                    165:        int nulsig();
                    166: 
                    167:        isig = signal(SIGINT, SIG_IGN);
                    168:        while ((w = wait(&stat)) != -1 && w != pid)
                    169:                ;
                    170:        signal(SIGINT, isig);
                    171:        if (w == -1)
                    172:                errflg = "wait failed";
                    173:        else if ((stat & 0177) == 0177) {       /* trace status */
                    174:                signo = (stat >> 8) & 0177;
                    175:                mapimage();
                    176:                if (signo == SIGTRAP)
                    177:                        signo = 0;
                    178:                else {
                    179:                        sigprint();
                    180:                        newline();
                    181:                }
                    182:                return;
                    183:        }
                    184:        else {
                    185:                errflg = "process terminated";
                    186:                sigcode = 0;
                    187:                if ((signo = stat & 0177) != 0)
                    188:                        sigprint();
                    189:                if (stat & 0200) {
                    190:                        prints(" - core dumped");
                    191:                        corfil = "core";
                    192:                }
                    193:                pid = 0;
                    194:                setcor();
                    195:        }
                    196: }
                    197: 
                    198: /*
                    199:  * is the right-hand file a process image?
                    200:  */
                    201: 
                    202: trcimage()
                    203: {
                    204: 
                    205:        return (pid != 0);
                    206: }
                    207: 
                    208: /*
                    209:  * grab some data from the user block,
                    210:  * before maps are set up (ugh)
                    211:  */
                    212: 
                    213: int
                    214: trcunab(off)
                    215: int off;
                    216: {
                    217:        int data;
                    218: 
                    219:        errno = 0;
                    220:        data = ptrace(P_RDU, pid, off, 0);
                    221:        if (errno) {
                    222:                errflg = "can't read user block";
                    223:                return (0);
                    224:        }
                    225:        return (data);
                    226: }

unix.superglobalmegacorp.com

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