Annotation of researchv10no/cmd/adb/v7/trace.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * ptrace goo for reading and writing
        !             3:  */
        !             4: 
        !             5: #include "defs.h"
        !             6: #include "space.h"
        !             7: #include "ptrace.h"
        !             8: 
        !             9: #define        min(a, b)       (((a) < (b)) ? (a) : (b))
        !            10: extern int errno;
        !            11: 
        !            12: ptri(addr, space, buf, size)
        !            13: ADDR addr;
        !            14: int space;
        !            15: register char *buf;
        !            16: int size;
        !            17: {
        !            18:        PTWORD w;
        !            19:        register char *p, *q;
        !            20:        register int n;
        !            21:        int rf;
        !            22: 
        !            23:        switch (space & SPTYPE) {
        !            24:        default:
        !            25:        case INSTSP:
        !            26:                rf = P_RDI;
        !            27:                break;
        !            28: 
        !            29:        case DATASP:
        !            30:                rf = P_RDD;
        !            31:                break;
        !            32: 
        !            33:        case UBLKSP:
        !            34:                rf = P_RDU;
        !            35:                break;
        !            36:        }
        !            37:        for (p = buf, n = size; n > 0; n--)
        !            38:                *p++ = 0;
        !            39:        while (size) {
        !            40:                errno = 0;
        !            41:                w = ptrace(rf, pid, (int *)addr, 0);
        !            42:                if (errno) {
        !            43:                        errflg = "bad trace read";
        !            44:                        return (0);
        !            45:                }
        !            46:                p = (char *)&w;
        !            47:                for (n = min(size, sizeof(w)); n > 0; size--, n--)
        !            48:                        *buf++ = *p++;
        !            49:                addr += sizeof(w);
        !            50:        }
        !            51:        return (1);
        !            52: }
        !            53: 
        !            54: ptro(addr, space, buf, size)
        !            55: ADDR addr;
        !            56: int space;
        !            57: register char *buf;
        !            58: int size;
        !            59: {
        !            60:        PTWORD w;
        !            61:        register char *p;
        !            62:        register int n;
        !            63:        int rf, wf;
        !            64: 
        !            65:        switch (space & SPTYPE) {
        !            66:        default:
        !            67:        case INSTSP:
        !            68:                rf = P_RDI;
        !            69:                wf = P_WRI;
        !            70:                break;
        !            71: 
        !            72:        case DATASP:
        !            73:                rf = P_RDD;
        !            74:                wf = P_WRD;
        !            75:                break;
        !            76: 
        !            77:        case UBLKSP:
        !            78:                rf = P_RDU;
        !            79:                wf = P_WRU;
        !            80:                break;
        !            81:        }
        !            82:        while (size) {
        !            83:                errno = 0;
        !            84:                w = ptrace(rf, pid, (int *)addr, 0);
        !            85:                if (errno) {
        !            86:                        errflg = "bad trace read";
        !            87:                        return (0);
        !            88:                }
        !            89:                p = (char *)&w;
        !            90:                for (n = min(size, sizeof(w)); n > 0; size--, n--)
        !            91:                        *p++ = *buf++;
        !            92:                errno = 0;
        !            93:                ptrace(wf, pid, (int *)addr, w);
        !            94:                if (errno) {
        !            95:                        errflg = "bad trace write";
        !            96:                        return (0);
        !            97:                }
        !            98:                p = (char *)&w;
        !            99:                for (n = min(size, sizeof(w)); n > 0; size--, n--)
        !           100:                        *buf++ = *p++;
        !           101:                addr += sizeof(w);
        !           102:        }
        !           103:        return (1);
        !           104: }

unix.superglobalmegacorp.com

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