Annotation of coherent/b/bin/db_400/i8086a.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     i8086a.c
                      3:  *
                      4:  *     The information contained herein is a trade secret of Mark Williams
                      5:  *     Company, and  is confidential information.  It is provided  under a
                      6:  *     license agreement,  and may be  copied or disclosed  only under the
                      7:  *     terms of  that agreement.  Any  reproduction or disclosure  of this
                      8:  *     material without the express written authorization of Mark Williams
                      9:  *     Company or persuant to the license agreement is unlawful.
                     10:  *
                     11:  *     COHERENT Version 2.3.35
                     12:  *     Copyright (c) 1982, 1983, 1984.
                     13:  *     An unpublished work by Mark Williams Company, Chicago.
                     14:  *     All rights reserved.
                     15:  */
                     16: 
                     17: #include <stdio.h>
                     18: #include <sys/param.h>
                     19: #include <l.out.h>
                     20: #include <signal.h>
                     21: #include <sys/ptrace.h>
                     22: #include <sys/timeout.h>
                     23: #include <sys/uproc.h>
                     24: #include "trace.h"
                     25: #include "i8086.h"
                     26: 
                     27: extern errno;
                     28: 
                     29: #define        MAGICTEST       hdrinfo.magic == L_MAGIC
                     30: 
                     31: /*
                     32:  * Given an l.out header, set up segmentation for an l.out.
                     33:  */
                     34: setaseg(ldhp)
                     35: register struct ldheader *ldhp;
                     36: {
                     37:        register long fbase;
                     38:        register long si;
                     39:        register long pi;
                     40:        register long bi;
                     41:        register long sd;
                     42:        register long pd;
                     43:        register long rs;
                     44: 
                     45:        fbase = sizeof(*ldhp);
                     46:        si = ldhp->l_ssize[L_SHRI];
                     47:        pi = ldhp->l_ssize[L_PRVI];
                     48:        bi = ldhp->l_ssize[L_BSSI];
                     49:        sd = ldhp->l_ssize[L_SHRD];
                     50:        pd = ldhp->l_ssize[L_PRVD];
                     51:        switch (ldhp->l_flag & (LF_SEP|LF_SHR)) {
                     52:        case 0:
                     53:                endpure = NULL;
                     54:                DSPACE = setsmap(NULL, (long)0, si+pi, fbase,
                     55:                                getf, putf, 0);
                     56:                DSPACE = setsmap(DSPACE, si+pi+bi, sd+pd, fbase+si+pi,
                     57:                                getf, putf, 0);
                     58:                ISPACE = DSPACE;
                     59:                break;
                     60: 
                     61:        case LF_SHR:
                     62:                endpure = NULL;
                     63:                rs = (si+sd+0xF) & ~0xF;
                     64:                DSPACE = setsmap(NULL, (long)0, si, fbase, getf, putf, 0);
                     65:                DSPACE = setsmap(DSPACE, si, sd, fbase+si+pi, getf, putf, 0);
                     66:                DSPACE = setsmap(DSPACE, rs, pi, fbase+si, getf, putf, 0);
                     67:                DSPACE = setsmap(DSPACE, rs+pi, pd, fbase+si+pi+sd,
                     68:                                getf, putf, 0);
                     69:                ISPACE = DSPACE;
                     70:                break;
                     71: 
                     72:        case LF_SEP:
                     73:                endpure = NULL;
                     74:                ISPACE = setsmap(NULL, (long)0, si+pi, fbase, getf, putf, 0);
                     75:                DSPACE = setsmap(NULL, (long)0, sd+pd, fbase+si+pi,
                     76:                                getf, putf, 0);
                     77:                break;
                     78: 
                     79:        case LF_SEP|LF_SHR:
                     80:                endpure = NULL; /* No pure data */
                     81:                rs  = (sd+0xF) & ~0xF;
                     82:                ISPACE = setsmap(NULL, (long)0, si+pi, fbase, getf, putf, 0);
                     83:                DSPACE = setsmap(NULL, (long)0, sd, fbase+si+pi, getf, putf, 0);
                     84:                DSPACE = setsmap(DSPACE, rs, pd, fbase+si+pi+sd, getf, putf, 0);
                     85:                break;
                     86:        }
                     87: }
                     88: 
                     89: /*
                     90:  * Set up segmentation for kernel memory.
                     91:  */
                     92: setkmem(np)
                     93: char *np;
                     94: {
                     95:        register off_t l;
                     96:        unsigned n;
                     97:        struct LDSYM lds;
                     98: 
                     99:        cfp = openfil(np, rflag);
                    100:        USPACE = setsmap(NULL, (off_t)0, (off_t)LI, (off_t)0,
                    101:                getf, putf, 1);
                    102:        add = 2;
                    103:        if (getb(USEG, &n, sizeof(n)) == 0)
                    104:                panic("Bad memory file");
                    105:        l = (off_t)n << 4;
                    106:        ISPACE = setsmap(NULL, (off_t)0, (off_t)LI, (off_t)l,
                    107:                getf, putf, 1);
                    108:        strncpy(lds.ls_id, "etext_", NCPLN);
                    109:        if (nameval(&lds) == 0)
                    110:                DSPACE = ISPACE;
                    111:        else {
                    112:                n = (lds.ls_addr+0xF) & ~0xF;
                    113:                DSPACE = setsmap(NULL, (off_t)0, (off_t)LI, (off_t)l+n,
                    114:                        getf, putf, 1);
                    115:        }
                    116: }
                    117: 
                    118: /*
                    119:  * Set up segmentation for a system dump.
                    120:  */
                    121: setdump(np)
                    122: char *np;
                    123: {
                    124:        setkmem(np);
                    125: }
                    126: 
                    127: #if FPTEST
                    128: void
                    129: fpdump(fstp)
                    130: struct _fpstate * fstp;
                    131: {
                    132:        int i;
                    133:        int tagbits;
                    134:        unsigned char opfirst, opsecond;
                    135:        unsigned int fcs = fstp->cssel;
                    136:        int tos = (fstp->sw >> 11) & 7;
                    137: 
                    138:        fflush(stdout);
                    139: 
                    140:        printf("fstp=%08x  tos=%d  ", fstp, tos);
                    141:        opfirst = 0xD8 | ((fcs >> 24) & 7);
                    142:        opsecond = fcs >> 16;
                    143:        printf("cw=%04x  sw=%04x  tag=%04x\n",
                    144:          fstp->cw&0xFFFF, fstp->sw&0xFFFF, fstp->tag&0xffff);
                    145:        printf("op=%02x %02x  fcs=%04x fip=%08x  fos=%04x foo=%08x\n",
                    146:          opfirst, opsecond,
                    147:          fcs&0xFFFF, fstp->ipoff, fstp->datasel&0xFFFF, fstp->dataoff);
                    148:        for (i = 0; i < 8; i++) {
                    149:                tagbits = (fstp->tag >> (((tos + i) & 7) * 2)) & 3;
                    150:                printf("st[%d]:(%d) at %08x ", i, tagbits,
                    151:                  fstp->_st + i);
                    152:                switch(tagbits) {
                    153:                case 0:
                    154:                        {
                    155:                          int j;
                    156:                          for (j = 0; j < 4; j++)
                    157:                            printf("%04x ", fstp->_st[i].significand[j]);
                    158:                          printf(":%04x ", fstp->_st[i].exponent);
                    159:                        }
                    160:                        printf("\n");
                    161:                        break;
                    162:                case 1:
                    163:                        printf("Zero\n");
                    164:                        break;
                    165:                case 2:
                    166:                        printf("Special: %08x %08x %08x %08x : %08x\n",
                    167:                          fstp->_st[i].significand[0],
                    168:                          fstp->_st[i].significand[1],
                    169:                          fstp->_st[i].significand[2],
                    170:                          fstp->_st[i].significand[3],
                    171:                          fstp->_st[i].exponent);
                    172:                        break;
                    173:                case 3:
                    174:                        printf("Empty\n");
                    175:                        break;
                    176:                }
                    177:        }
                    178:        fflush(stdout);
                    179: }
                    180: #endif
                    181: 
                    182: /*
                    183:  * Update register structure in memory.
                    184:  */
                    185: setregs()
                    186: {
                    187:        struct ureg ureg;
                    188: 
                    189:        regflag = 0;
                    190:        add = 0; /* UGLY! FIX THIS! */
                    191:        if (getb(USEG, (char *)&ureg, sizeof(ureg)) == 0) {
                    192:                printr("Cannot read registers");
                    193:                return 0;
                    194:        }
                    195: 
                    196: #if FPTEST
                    197:        fpdump(&ureg.ur_fpstate);
                    198: #endif
                    199:        copyreg(&ureg);
                    200:        regflag = 1;
                    201:        return 1;
                    202: }
                    203: 
                    204: /*
                    205:  * Copy registers from the User area structure to the register
                    206:  * structure.
                    207:  */
                    208: copyreg(up)
                    209: register struct ureg *up;
                    210: {
                    211:        reg.r_ax = up->ur_ax;
                    212:        reg.r_bx = up->ur_bx;
                    213:        reg.r_cx = up->ur_cx;
                    214:        reg.r_dx = up->ur_dx;
                    215:        reg.r_sp = up->ur_sp;
                    216:        reg.r_bp = up->ur_bp;
                    217:        reg.r_si = up->ur_si;
                    218:        reg.r_di = up->ur_di;
                    219:        reg.r_cs = up->ur_cs;
                    220:        reg.r_ds = up->ur_ds;
                    221:        reg.r_ss = up->ur_ss;
                    222:        reg.r_es = up->ur_es;
                    223:        reg.r_ip = up->ur_ip;
                    224:        reg.r_fw = up->ur_fw;
                    225:        reg.r_fs = up->ur_fs;
                    226:        reg.r_gs = up->ur_gs;
                    227:        reg.valid = 1;
                    228: }
                    229: 
                    230: /*
                    231:  * If the given name matches a register, set up `ldp' with the address
                    232:  * of a register in the user area.
                    233:  */
                    234: regaddr(ldp)
                    235: struct LDSYM *ldp;
                    236: {
                    237:        register char *cp;
                    238:        register int c0;
                    239:        register int c1;
                    240:        register int a;
                    241: 
                    242:        a = 0;  /* UGLY!  FIX THIS */
                    243:        cp = ldp->ls_id;
                    244:        if ((c0=*cp++) == '\0')
                    245:                return 0;
                    246:        if ((c1=*cp++) == '\0')
                    247:                return 0;
                    248:        if (*cp != '\0')
                    249:                return 0;
                    250:        switch (c1) {
                    251:        case 'h':
                    252:                a++;
                    253:        case 'l':
                    254:                c1 = 'x';
                    255:        }
                    256:        cp = regitab;
                    257:        do {
                    258:                if (cp[0]==c0 && cp[1]==c1) {
                    259:                        ldp->ls_addr = a;
                    260:                        ldp->ls_type = L_REG;
                    261:                        return 1;
                    262:                }
                    263:                a += 2;
                    264:                cp += 2;
                    265:        } while (*cp != '\0');
                    266:        return 0;
                    267: }
                    268: 
                    269: /*
                    270:  * Return the program counter.
                    271:  */
                    272: caddr_t
                    273: getpc()
                    274: {
                    275:        return reg.r_ip;
                    276: }
                    277: 
                    278: /*
                    279:  * Set the program counter.
                    280:  */
                    281: setpc(ip)
                    282: caddr_t ip;
                    283: {
                    284: fprintf(stderr, "setpc(%x)\n", ip);
                    285:        reg.r_ip = ip;
                    286:        add = PTRACE_EIP;
                    287:        putb(USEG, &reg.r_ip, sizeof(reg.r_ip));
                    288: }
                    289: 
                    290: /*
                    291:  * Return the frame pointer.
                    292:  */
                    293: getfp()
                    294: {
                    295:        return reg.r_bp;
                    296: }
                    297: 
                    298: /*
                    299:  * Print out a constant in a reasonable format.
                    300:  */
                    301: concons(sp, l)
                    302: register char *sp;
                    303: unsigned long l;
                    304: {
                    305: /* Another bug in unsigned long on the PDP11
                    306:        if (l < 0x10)
                    307: */
                    308:        if ((unsigned)l < 0x10)
                    309:                sprintf(sp, "%d", (int)l);
                    310:        else
                    311:                sprintf(sp, "0x%lx", l);
                    312: }
                    313: 
                    314: /*
                    315:  * Display registers.
                    316:  */
                    317: dispreg()
                    318: {
                    319:        if (testint())
                    320:                return;
                    321:        if (hdrinfo.defsegatt == DSA16)
                    322:                printf("%%ip=%04x %%fw=%04x\n", reg.r_ip, reg.r_fw);
                    323:        else 
                    324:                printf("%%eip=%08x %%efw=%08x\n", reg.r_ip, reg.r_fw);
                    325: 
                    326:        if (testint())
                    327:                return;
                    328:        if (hdrinfo.defsegatt == DSA16)
                    329:                printf("%%ax=%08x %%bx=%08x %%cx=%08x %%dx=%08x\n",
                    330:                        reg.r_ax, reg.r_bx, reg.r_cx, reg.r_dx);
                    331:        else
                    332:                printf("%%eax=%08x %%ebx=%08x %%ecx=%08x %%edx=%08x\n",
                    333:                        reg.r_ax, reg.r_bx, reg.r_cx, reg.r_dx);
                    334: 
                    335:        if (testint())
                    336:                return;
                    337:        if (hdrinfo.defsegatt == DSA16)
                    338:                printf("%%sp=%08x %%bp=%08x %%si=%08x %%di=%08x\n",
                    339:                        reg.r_sp, reg.r_bp, reg.r_si, reg.r_di);
                    340:        else
                    341:                printf("%%esp=%08x %%ebp=%08x %%esi=%08x %%edi=%08x\n",
                    342:                        reg.r_sp, reg.r_bp, reg.r_si, reg.r_di);
                    343: 
                    344:        if (testint())
                    345:                return;
                    346:        printf("%%cs=%04x %%ds=%04x %%ss=%04x %%es=%04x %%fs=%04x %%gs=%04x\n",
                    347:                reg.r_cs&0xffff, reg.r_ds&0xffff, reg.r_ss&0xffff,
                    348:                reg.r_es&0xffff, reg.r_fs&0xffff, reg.r_gs&0xffff);
                    349: }
                    350: 
                    351: /*
                    352:  * Stack traceback.
                    353:  */
                    354: dispsbt(l)
                    355: {
                    356:        register int argc;
                    357:        register int iflag;
                    358:        register int sflag;
                    359:        register int qflag;
                    360:        unsigned amain;
                    361:        unsigned int pc;
                    362:        unsigned int rpc;
                    363:        unsigned int fp;
                    364:        unsigned int n;
                    365:        unsigned char e[1];
                    366:        unsigned char b[3];
                    367:        struct LDSYM ldsym;
                    368: 
                    369:        amain = 1;
                    370:        strcpy(ldsym.ls_id, MAGICTEST ? "main_" : "main");
                    371:        if (nameval(&ldsym) != 0)
                    372:                amain = ldsym.ls_addr;
                    373:        add = MAGICTEST ? (unsigned short)reg.r_ip : reg.r_ip;
                    374:        if (getb(ISEG, b, 1) == 0) {
                    375:                printe("Illegal ip");
                    376:                return;
                    377:        }
                    378:        sflag = 0;
                    379:        fp = reg.r_bp;
                    380:        e[0] = MAGICTEST ? 0x56 : 0xc8;                 /* push si : enter */
                    381:        if (valname(1, (off_t)reg.r_ip, &ldsym) != 0) {
                    382:                add = (long)ldsym.ls_addr;
                    383:                getb(ISEG, (char *)e, 1);
                    384:        }
                    385:        if ( MAGICTEST ? (b[0]==0x56 || e[0]!=0x56)             /* push si */
                    386:                        : (b[0]==0xc8 || e[0]!=0xc8) ) {        /* enter */
                    387:                sflag = 1;
                    388:                fp = reg.r_sp - (MAGICTEST ? 6 : 4);
                    389:        }
                    390:        pc = reg.r_ip;
                    391:        qflag = 0;
                    392:        for (;;) {
                    393:                add = MAGICTEST ? (unsigned short)fp + 6 : fp + 4;
                    394:                if (getb(DSEG, &rpc, MAGICTEST ? 2 : 4) == 0)
                    395:                        break;
                    396:                argc = 0;
                    397:                add = MAGICTEST ? (unsigned short)rpc : rpc;
                    398:                if (getb(ISEG, b, 3) != 0) {
                    399:                        if (b[0]==0x83 && b[1]==0xC4)   /* add sp,$? */
                    400:                                argc = b[2]/(MAGICTEST ? 2 : 4);
                    401:                }
                    402:                add = MAGICTEST ? (unsigned short)rpc - 3 : rpc - 5;
                    403:                if (getb(ISEG, b, 1) == 0)
                    404:                        break;
                    405:                if (getb(ISEG, &n, (MAGICTEST ? 2 : 4)) == 0)
                    406:                        break;
                    407:                printx(DAFMT, (long)fp);
                    408:                printx("  ");
                    409:                printx(DAFMT, (long)pc);
                    410:                printx("  ");
                    411:                if (b[0] == 0xE8) {                     /* call ? */
                    412:                        n += MAGICTEST ? (unsigned short) rpc : rpc;
                    413:                        putaddr(1, (long)n, I);
                    414:                        if (n == amain) {
                    415:                                qflag = 1;
                    416:                                argc = 3;
                    417:                        }
                    418:                } else {
                    419:                        if (valname(1, (off_t)pc, &ldsym) == 0)
                    420:                                printx("*");
                    421:                        else {
                    422:                                printx("%.*s", NCPLN, ldsym.ls_id);
                    423:                                if (strcmp(ldsym.ls_id
                    424:                                        , MAGICTEST ? "main_" : "main") == 0) {
                    425:                                        qflag = 1;
                    426:                                        argc = 3;
                    427:                                }
                    428:                        }
                    429:                }
                    430:                putx('(');
                    431:                iflag = 0;
                    432:                add = (MAGICTEST ? (unsigned short)fp : fp) + 8;
                    433:                        /* offset 8 coincidently works for both file formats */
                    434:                while (argc--) {
                    435:                        if (getb(DSEG, &n, MAGICTEST ? 2 : 4) == 0)
                    436:                                break;
                    437:                        if (iflag++ != 0)
                    438:                                printx(", ");
                    439:                        putaddr(1, (long)n, -1);
                    440:                }
                    441:                printx(")\n");
                    442:                if (testint())
                    443:                        return;
                    444:                if (qflag)
                    445:                        break;
                    446:                if (sflag) {
                    447:                        sflag = 0;
                    448:                        fp = reg.r_bp;
                    449:                } else {
                    450:                        add = MAGICTEST ? (unsigned short)fp : fp;
                    451:                        if (getb(DSEG, &fp, (MAGICTEST ? 2 : 4)) == 0)
                    452:                                break;
                    453:                }
                    454:                if (--l == 0)
                    455:                        return;
                    456:                pc = MAGICTEST ? (unsigned short)rpc : rpc;
                    457:        }
                    458: }
                    459: 
                    460: /*
                    461:  * Get the return pc and frame pointer to set a return breakpoint.
                    462:  */
                    463: setretf(pcp, fpp)
                    464: register caddr_t *pcp;
                    465: register caddr_t *fpp;
                    466: {
                    467:        unsigned char b[1];
                    468: 
                    469:        add = reg.r_ip;
                    470:        if (getb(ISEG, b, sizeof(b)) == 0)
                    471:                return 0;
                    472:        if (b[0] == 0x56) {                     /* push si */
                    473:                *fpp = reg.r_bp;
                    474:                add = reg.r_sp;
                    475:        } else {
                    476:                add = reg.r_bp;
                    477:                if (getb(DSEG, (char *)fpp, sizeof(*fpp)) == 0)
                    478:                        return 0;
                    479:                add = reg.r_bp + 6;
                    480:        }
                    481:        if (getb(DSEG, (char *)pcp, sizeof(*pcp)) == 0)
                    482:                return 0;
                    483: }
                    484: 
                    485: /*
                    486:  * Initialise after getting a trap.
                    487:  */
                    488: trapint()
                    489: {
                    490:        caddr_t pc;
                    491:        caddr_t fw;
                    492: 
                    493: #if 0
                    494: /* new trap handler clears TF in PSW */
                    495:        add = PTRACE_EFL;
                    496:        if (getb(USEG, &fw, sizeof(int)) == 0) {
                    497:                printr("Cannot get psw");
                    498:                return 0;
                    499:        }
                    500:        fw &= ~TBIT;
                    501:        add = PTRACE_EFL;
                    502:        if (putb(USEG, &fw, sizeof(int)) == 0) {
                    503:                printr("Cannot set psw");
                    504:                return 0;
                    505:        }
                    506: #endif
                    507:        if (sysflag) {
                    508:                add = PTRACE_EIP;
                    509:                if (getb(USEG, &pc, sizeof(pc)) == 0) {
                    510:                        printr("Cannot get eip");
                    511:                        return 0;
                    512:                }
                    513:                pc -= 2;
                    514:                add = PTRACE_EIP;
                    515:                if (putb(USEG, &pc, sizeof(pc)) == 0) {
                    516:                        printr("Cannot set eip");
                    517:                        return 0;
                    518:                }
                    519:                add = (long)pc;
                    520:                if (putb(ISEG, (char *)sin, sizeof(sin)) == 0) {
                    521:                        printr("Cannot set sin");
                    522:                        return 0;
                    523:                }
                    524:                bitflag = 1;
                    525:        }
                    526:        return 1;
                    527: }
                    528: 
                    529: /*
                    530:  * Set up before returning from a trap.  Single stepping over a system
                    531:  * call is handled here.
                    532:  */
                    533: restret()
                    534: {
                    535:        unsigned char w[1];
                    536: 
                    537:        sysflag = 0;
                    538:        if (bitflag == 0)
                    539:                return 1;
                    540:        add = reg.r_ip;
                    541:        if (getb(ISEG, (char *)w, sizeof(w)) == 0)
                    542:                return 1;
                    543: 
                    544: /* FIX THIS FOR 386 */
                    545:        if (w[0] != 0xCD)               /* Interrupt (system call) */
                    546:                return 1;
                    547:        add = reg.r_ip + 2;
                    548:        if (getb(ISEG, (char *)sin, sizeof(sin)) == 0) {
                    549:                printr("Cannot get breakpoint");
                    550:                return 0;
                    551:        }
                    552:        add -= sizeof(sin);
                    553:        if (putb(ISEG, (char *)bin, sizeof(bin)) == 0) {
                    554:                printr("Cannot set breakpoint");
                    555:                return 0;
                    556:        }
                    557:        bitflag = 0;
                    558:        sysflag = 1;
                    559:        return 1;
                    560: }
                    561: 
                    562: /*
                    563:  * Change sinmode to SCSET if instruction at EIP is a call.
                    564:  */
                    565: setcont()
                    566: {
                    567:        unsigned char   w[4];
                    568:        int     xx;
                    569: 
                    570:        add = reg.r_ip;
                    571:        if (getb(ISEG, &xx, sizeof(xx)) == 0) {
                    572:                return;
                    573:        }
                    574:        w[0] = xx & 0xff;
                    575:        w[1] = (xx>>8) & 0xff;
                    576:        if (w[0] == 0xE8) {                     /* Direct call */
                    577:                sinmode = SCSET;
                    578:        }
                    579:        if (w[0]==0xFF && (w[1]&0x38)==0x10) {  /* Indirect call */
                    580:                sinmode = SCSET;
                    581:        }
                    582: }
                    583: 
                    584: /*
                    585:  * Get return address from ESP and set BSIN breakpoint there.
                    586:  */
                    587: intcont()
                    588: {
                    589:        unsigned return_addr;
                    590: 
                    591:        add = reg.r_sp;
                    592:        if (getb(DSEG, &return_addr, sizeof(return_addr))) {
                    593:                setibpt(BSIN, return_addr, reg.r_bp, NULL);
                    594:        }
                    595: }
                    596: 
                    597: /*
                    598:  * See if the given instruction is a breakpoint.
                    599:  */
                    600: testbpt(pc)
                    601: {
                    602:        unsigned char w[1];
                    603: 
                    604:        add = pc;
                    605:        return (getb(ISEG, w, sizeof(w))!=0 && w[0]==0xCC);
                    606: }
                    607: 
                    608: /*
                    609:  * Read `n' characters into the buffer `bp' starting at address `a'
                    610:  * from the traced process, segment `f'.
                    611:  */
                    612: getp(f, a, bp, n)
                    613: long a;
                    614: register char *bp;
                    615: register int n;
                    616: {
                    617:        int d, n1;
                    618:        char *memcpy();
                    619:        int     pcmd;
                    620: 
                    621:        for (errno = 0; n; n -= n1, a += n1, bp += n1) {
                    622:                n1 =n>sizeof(long) ? sizeof(long) : n;
                    623:                switch(f) {
                    624:                case ISEG:      pcmd = PTRACE_RD_TXT;   break;
                    625:                case DSEG:      pcmd = PTRACE_RD_DAT;   break;
                    626:                case USEG:      pcmd = PTRACE_RD_USR;   break;
                    627:                }
                    628:                d = ptrace(pcmd, pid, (int *) a, 0);
                    629:                if (errno)
                    630:                        return 0;
                    631:                memcpy(bp, &d, n1);
                    632:        }
                    633:        return 1;
                    634: }
                    635: 
                    636: /*
                    637:  * Write `n' characters from the buffer `bp' starting at address `a' in
                    638:  * the traced process to segment `f'.
                    639:  */
                    640: putp(f, a, bp, n)
                    641: long a;
                    642: register char *bp;
                    643: register int n;
                    644: {
                    645:        int d, n1;
                    646:        int     pcmd;
                    647: 
                    648:        for (errno = 0; n; n -= n1, a += n1, bp += n1) {
                    649:                if (n < sizeof(long)) {
                    650:                        n1 = n;
                    651:                        switch(f) {
                    652:                        case ISEG:      pcmd = PTRACE_RD_TXT;   break;
                    653:                        case DSEG:      pcmd = PTRACE_RD_DAT;   break;
                    654:                        case USEG:      pcmd = PTRACE_RD_USR;   break;
                    655:                        }
                    656:                        d = ptrace(pcmd, pid, (int *)a, 0);
                    657:                } else
                    658:                        n1 = sizeof(long);
                    659:                memcpy(&d, bp, n1);
                    660:                switch(f) {
                    661:                case ISEG:      pcmd = PTRACE_WR_TXT;   break;
                    662:                case DSEG:      pcmd = PTRACE_WR_DAT;   break;
                    663:                case USEG:      pcmd = PTRACE_WR_USR;   break;
                    664:                }
                    665:                ptrace(pcmd, pid, (int *) a, d);
                    666:                if (errno) {
                    667:                        perror("db: putp()");
                    668:                        return 0;
                    669:                }
                    670:        }
                    671:        return 1;
                    672: }
                    673: 
                    674: /******************************************************************************
                    675:  *
                    676:  * Note some #defines in these include files interferes with
                    677:  * items in preceeding include files. Hence the strange
                    678:  * program order.
                    679:  *
                    680:  ******************************************************************************/
                    681: 
                    682: #include <coff.h>
                    683: 
                    684: /*
                    685:  * Given an l.out header, set up segmentation for an l.out.
                    686:  */
                    687: setcoffseg(fp, coffhp)
                    688: FILE   *fp;
                    689: FILEHDR *coffhp;
                    690: {
                    691:        off_t   fbase, tbase, tsize, dbase, dsize, bbase, bsize;
                    692:        off_t   f_tscnp, f_dscnp, f_bscnp;
                    693:        SCNHDR  *scnhp;
                    694:        short   i;
                    695: 
                    696:        if (coffhp->f_opthdr)
                    697:                fbase = sizeof(FILEHDR) + coffhp->f_opthdr;
                    698:        else
                    699:                fbase = sizeof (FILEHDR);
                    700:        if ( (scnhp=nalloc(coffhp->f_nscns*sizeof(SCNHDR))) == NULL ) {
                    701:                printf("No memory to alloc to coff.h section headers");
                    702:                return;
                    703:        }
                    704: 
                    705:        fseek(fp, fbase, 0);
                    706:        for (i=0; i<coffhp->f_nscns; scnhp++, i++) {
                    707:                if (fread(scnhp, sizeof(SCNHDR), 1, fp) != 1)
                    708:                        printf("Cannot read coff.h section headers");
                    709: 
                    710:                switch((int)scnhp->s_flags) {
                    711:                case STYP_TEXT:
                    712:                        tbase = scnhp->s_vaddr;
                    713:                        tsize = scnhp->s_size;
                    714:                        f_tscnp = scnhp->s_scnptr; 
                    715:                        break;
                    716:                case STYP_DATA:
                    717:                        dbase = scnhp->s_vaddr;
                    718:                        dsize = scnhp->s_size;
                    719:                        f_dscnp = scnhp->s_scnptr; 
                    720:                        break;
                    721:                case STYP_BSS:
                    722:                        bbase = scnhp->s_vaddr;
                    723:                        bsize = scnhp->s_size;
                    724:                        f_bscnp = scnhp->s_scnptr; 
                    725:                        break;
                    726:                default:
                    727:                        continue;
                    728:                }
                    729:        }
                    730: 
                    731: #if 0  /* Assume NOT separate */
                    732:        endpure = NULL;
                    733:        DSPACE = setsmap(NULL, tbase, tsize, f_tscnp, getf, putf, 0);
                    734: /*     dbase = (dbase + (off_t)0xF) & ~(off_t)0xF;
                    735: */     DSPACE = setsmap(DSPACE, dbase, dsize, f_dscnp, getf, putf, 0);
                    736:        DSPACE = setsmap(DSPACE, bbase, bsize+4L, f_bscnp, getf, putf, 0);
                    737:        ISPACE = DSPACE;
                    738: 
                    739: #else  /* Assume separate */
                    740:        endpure = NULL;
                    741:        ISPACE = setsmap(NULL, tbase, tsize, f_tscnp, getf, putf, 0);
                    742: /*     dbase = (dbase + (off_t)0xF) & ~(off_t)0xF;
                    743: */     DSPACE = setsmap(NULL, dbase, dsize, f_dscnp, getf, putf, 0);
                    744:        DSPACE = setsmap(DSPACE, bbase, bsize+4L, f_bscnp, getf, putf, 0);
                    745: #endif
                    746:        nfree(scnhp);
                    747: }
                    748: 
                    749: /* end of i8086a.c */

unix.superglobalmegacorp.com

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