Annotation of researchv10no/cmd/adb/comm/access.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * access the files:
                      3:  * read or write data from some address in some space
                      4:  * -DPTRACE and provide the appropriate routines somewhere
                      5:  * if i/o to a process doesn't look like i/o to a file (eg v7 ptrace)
                      6:  */
                      7: 
                      8: #include "defs.h"
                      9: #include "regs.h"
                     10: #include "space.h"
                     11: #include "map.h"
                     12: 
                     13: #define        min(x, y)       ((x) < (y) ? (x) : (y))
                     14: 
                     15: static int intrget(), intrput();
                     16: static int memclr(), memcpy();
                     17: 
                     18: /*
                     19:  * routines to get/put various types
                     20:  */
                     21: 
                     22: TLONG
                     23: lget(addr, space)
                     24: ADDR addr;
                     25: int space;
                     26: {
                     27:        TLONG x;
                     28: 
                     29:        if (space == NOSP)
                     30:                return (wtol((WORD)dot));
                     31:        if (fget(addr, space, (char *)&x, SZLONG) == 0)
                     32:                return (0);
                     33:        return (x);
                     34: }
                     35: 
                     36: TSHORT
                     37: sget(addr, space)
                     38: ADDR addr;
                     39: int space;
                     40: {
                     41:        TSHORT x;
                     42: 
                     43:        if (space == NOSP)
                     44:                return (wtos((WORD)dot));
                     45:        if (fget(addr, space, (char *)&x, SZSHORT) == 0)
                     46:                return (0);
                     47:        return (x);
                     48: }
                     49: 
                     50: TCHAR
                     51: cget(addr, space)
                     52: ADDR addr;
                     53: int space;
                     54: {
                     55:        TCHAR x;
                     56: 
                     57:        if (space == NOSP)
                     58:                return (wtoc((WORD)dot));
                     59:        if (fget(addr, space, (char *)&x, SZCHAR) == 0)
                     60:                return (0);
                     61:        return (x);
                     62: }
                     63: 
                     64: TADDR
                     65: aget(addr, space)
                     66: ADDR addr;
                     67: int space;
                     68: {
                     69:        TADDR x;
                     70: 
                     71:        if (space == NOSP)
                     72:                return (wtoa((WORD)dot));
                     73:        if (fget(addr, space, (char *)&x, SZADDR) == 0)
                     74:                return (0);
                     75:        return (x);
                     76: }
                     77: 
                     78: lput(addr, space, v)
                     79: ADDR addr;
                     80: int space;
                     81: TLONG v;
                     82: {
                     83: 
                     84:        return (fput(addr, space, (char *)&v, SZLONG));
                     85: }
                     86: 
                     87: sput(addr, space, v)
                     88: ADDR addr;
                     89: int space;
                     90: TSHORT v;
                     91: {
                     92: 
                     93:        return (fput(addr, space, (char *)&v, SZSHORT));
                     94: }
                     95: 
                     96: cput(addr, space, v)
                     97: ADDR addr;
                     98: int space;
                     99: TCHAR v;
                    100: {
                    101: 
                    102:        return (fput(addr, space, (char *)&v, SZCHAR));
                    103: }
                    104: 
                    105: aput(addr, space, v)
                    106: ADDR addr;
                    107: int space;
                    108: TADDR v;
                    109: {
                    110: 
                    111:        return (fput(addr, space, (char *)&v, SZADDR));
                    112: }
                    113: 
                    114: /*
                    115:  * the real io code
                    116:  */
                    117: 
                    118: int
                    119: fget(addr, space, buf, size)
                    120: ADDR addr;
                    121: register int space;
                    122: char *buf;
                    123: int size;
                    124: {
                    125:        int fd;
                    126:        long off;
                    127:        ADDR oa;
                    128:        static ADDR regaddr();
                    129:        long lseek();
                    130: 
                    131:        if ((space & SPTYPE) == NOSP) {
                    132:                memclr(buf, size);
                    133:                size = min(size, sizeof(dot)-addr);
                    134:                memcpy(buf, (char *)&dot, min(size, sizeof(dot)));
                    135:                return (1);
                    136:        }
                    137:        if (space & SYMF)
                    138:                fd = fsym;
                    139:        else
                    140:                fd = fcor;
                    141:        oa = addr;
                    142:        if ((space & SPTYPE) == REGSP) {
                    143:                if (space & SYMF) {
                    144:                        errflg = "registers in corefile only";
                    145:                        return (0);
                    146:                }
                    147:                if ((addr = regaddr(addr)) == 0)
                    148:                        return (intrget(oa, buf, size));
                    149:                space &=~ SPTYPE;
                    150:                space |= DATASP;
                    151:        }
                    152:        if (reloc(addr, space, &off) == 0)
                    153:                return (0);
                    154: #ifdef PTRACE
                    155:        if ((space & SYMF) == 0 && pid)
                    156:                return (ptri(addr, space, buf, size));
                    157: #endif
                    158:        if (lseek(fd, off, 0) == -1
                    159:        ||  read(fd, buf, size) != size) {
                    160:                if ((space & SPTYPE) == INSTSP)
                    161:                        errflg = "can't read text";
                    162:                else
                    163:                        errflg = "can't read data";
                    164:                return (0);
                    165:        }
                    166:        return (1);
                    167: }
                    168: 
                    169: int
                    170: fput(addr, space, buf, size)
                    171: ADDR addr;
                    172: register int space;
                    173: char *buf;
                    174: int size;
                    175: {
                    176:        int fd;
                    177:        long off;
                    178:        ADDR oa;
                    179:        static ADDR regaddr();
                    180:        long lseek();
                    181: 
                    182:        if ((space & SPTYPE) == NOSP)
                    183:                return (0);
                    184:        if (wtflag == 0
                    185:        &&  !((space & SYMF) == 0 && pid))
                    186:                error("not in write mode");
                    187:        if (space & SYMF)
                    188:                fd = fsym;
                    189:        else
                    190:                fd = fcor;
                    191:        oa = addr;
                    192:        if ((space & SPTYPE) == REGSP) {
                    193:                if (space & SYMF) {
                    194:                        errflg = "registers in corefile only";
                    195:                        return (0);
                    196:                }
                    197:                if ((addr = regaddr(addr)) == 0)
                    198:                        return (intrput(oa, buf, size));
                    199:                space &=~ SPTYPE;
                    200:                space |= DATASP;
                    201:        }
                    202:        if (reloc(addr, space, &off) == 0)
                    203:                return (0);
                    204: #ifdef PTRACE
                    205:        if ((space & SYMF) == 0 && pid)
                    206:                return (ptro(addr, space, buf, size));
                    207: #endif
                    208:        if (lseek(fd, off, 0) == -1
                    209:        ||  write(fd, buf, size) != size) {
                    210:                if ((space & SPTYPE) == INSTSP)
                    211:                        errflg = "can't write text";
                    212:                else
                    213:                        errflg = "can't write data";
                    214:                return (0);
                    215:        }
                    216:        return (1);
                    217: }
                    218: 
                    219: /*
                    220:  * register address hacks
                    221:  * if the register allegedly has an address (e.g. we're knee deep in
                    222:  * stack frames), return that
                    223:  * otherwise do fake io to our internal copies of registers
                    224:  * awful
                    225:  */
                    226: 
                    227: extern ADDR raddr[];
                    228: extern int roffs[];
                    229: 
                    230: static ADDR
                    231: regaddr(reg)
                    232: register ADDR reg;
                    233: {
                    234: 
                    235:        reg /= SZREG;
                    236:        if (MINREG <= reg && reg <= MAXREG)
                    237:                return (raddr[reg - MINREG]);
                    238:        return (0);
                    239: }
                    240: 
                    241: static int
                    242: intrget(reg, buf, size)
                    243: ADDR reg;
                    244: char *buf;
                    245: {
                    246:        register char *p, *q;
                    247:        register int n;
                    248:        register int rnum;
                    249:        TREG r;
                    250: 
                    251:        for (p = buf, n = size; n > 0; n--)
                    252:                *p++ = 0;
                    253:        rnum = reg / SZREG;
                    254:        if (rnum < MINREG)
                    255:                return (0);
                    256:        p = buf;
                    257:        while (rnum <= MAXREG && size > 0) {
                    258:                r = rget(roffs[rnum - MINREG]);
                    259:                for (q = (char *)&r, n = SZREG; n > 0; n--)
                    260:                        *p++ = *q++;
                    261:                size -= SZREG;
                    262:                rnum++;
                    263:        }
                    264:        return (size <= 0);
                    265: }
                    266: 
                    267: static int
                    268: intrput(reg, buf, size)
                    269: ADDR reg;
                    270: char *buf;
                    271: {
                    272:        register char *p, *q;
                    273:        register int n;
                    274:        register int rnum;
                    275:        TREG r;
                    276: 
                    277:        rnum = reg / SZREG;
                    278:        if (rnum < MINREG)
                    279:                return (0);
                    280:        p = buf;
                    281:        while (rnum <= MAXREG && size > 0) {
                    282:                r = rget(roffs[rnum - MINREG]);
                    283:                for (q = (char *)&r, n = SZREG; n > 0 && size > 0; n--, size--)
                    284:                        *q++ = *p++;
                    285:                rput(roffs[rnum - MINREG], r);
                    286:                rnum++;
                    287:        }
                    288:        return (size <= 0);
                    289: }
                    290: 
                    291: /*
                    292:  * turn address to file offset
                    293:  * returns nonzero if ok
                    294:  */
                    295: 
                    296: 
                    297: int
                    298: reloc(addr, space, offp)
                    299: ADDR addr;
                    300: register int space;
                    301: long *offp;
                    302: {
                    303:        register struct map *mp;
                    304: 
                    305:        for (mp = (space & SYMF) ? symmap : cormap; mp->flag & MPINUSE; mp++)
                    306:                if ((space & SPTYPE) == (mp->sp & SPTYPE)
                    307:                &&  mp->b <= addr && addr < mp->e) {
                    308:                        addr += mp->f - mp->b;
                    309:                        if ((space & (SYMF|RAWADDR)) == 0)
                    310:                                if (kmap(&addr, space) == 0)
                    311:                                        return (0);
                    312:                        *offp = addr;
                    313:                        return (1);
                    314:                }
                    315:        /*
                    316:         * if we wanted instruction space and didn't find it,
                    317:         * try data space now
                    318:         */
                    319:        if ((space & SPTYPE) == INSTSP) {
                    320:                space &=~ SPTYPE;
                    321:                space |= DATASP;
                    322:                for (mp = (space & SYMF) ? symmap : cormap; mp->flag & MPINUSE; mp++)
                    323:                        if ((space & SPTYPE) == (mp->sp & SPTYPE)
                    324:                        &&  mp->b <= addr && addr < mp->e) {
                    325:                                addr += mp->f - mp->b;
                    326:                                if ((space & (SYMF|RAWADDR)) == 0)
                    327:                                        if (kmap(&addr, space) == 0)
                    328:                                                return (0);
                    329:                                *offp = addr;
                    330:                                return (1);
                    331:                        }
                    332:        }
                    333:        if (space & SYMF)
                    334:                errflg = "text address not found";
                    335:        else
                    336:                errflg = "data address not found";
                    337:        return (0);
                    338: }
                    339: 
                    340: /*
                    341:  * small hackery
                    342:  */
                    343: 
                    344: static
                    345: memclr(buf, size)
                    346: register char *buf;
                    347: register int size;
                    348: {
                    349: 
                    350:        while (--size >= 0)
                    351:                *buf++ = 0;
                    352: }
                    353: 
                    354: static
                    355: memcpy(to, fr, size)
                    356: register char *to, *fr;
                    357: register int size;
                    358: {
                    359: 
                    360:        while (--size >= 0)
                    361:                *to++ = *fr++;
                    362: }

unix.superglobalmegacorp.com

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