Annotation of researchv10no/cmd/adb/cray/trace.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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