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

unix.superglobalmegacorp.com

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