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

unix.superglobalmegacorp.com

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