Annotation of 43BSDReno/sys/kern/sys_process.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  *
                      6:  *     @(#)sys_process.c       7.12 (Berkeley) 6/28/90
                      7:  */
                      8: 
                      9: #define IPCREG
                     10: #include "param.h"
                     11: #include "user.h"
                     12: #include "proc.h"
                     13: #include "vnode.h"
                     14: #include "text.h"
                     15: #include "seg.h"
                     16: #include "buf.h"
                     17: #include "ptrace.h"
                     18: 
                     19: #include "machine/reg.h"
                     20: #include "machine/psl.h"
                     21: #include "machine/pte.h"
                     22: 
                     23: /*
                     24:  * Priority for tracing
                     25:  */
                     26: #define        IPCPRI  PZERO
                     27: 
                     28: /*
                     29:  * Tracing variables.
                     30:  * Used to pass trace command from
                     31:  * parent to child being traced.
                     32:  * This data base cannot be
                     33:  * shared and is locked
                     34:  * per user.
                     35:  */
                     36: struct {
                     37:        int     ip_lock;
                     38:        int     ip_req;
                     39:        int     *ip_addr;
                     40:        int     ip_data;
                     41: } ipc;
                     42: 
                     43: /*
                     44:  * sys-trace system call.
                     45:  */
                     46: ptrace(curp, uap, retval)
                     47:        struct proc *curp;
                     48:        register struct args {
                     49:                int     req;
                     50:                int     pid;
                     51:                int     *addr;
                     52:                int     data;
                     53:        } *uap;
                     54:        int *retval;
                     55: {
                     56:        register struct proc *p;
                     57: 
                     58:        if (uap->req <= 0) {
                     59:                curp->p_flag |= STRC;
                     60:                return (0);
                     61:        }
                     62:        p = pfind(uap->pid);
                     63:        if (p == 0 || p->p_stat != SSTOP || p->p_ppid != curp->p_pid ||
                     64:            !(p->p_flag & STRC))
                     65:                return (ESRCH);
                     66:        while (ipc.ip_lock)
                     67:                sleep((caddr_t)&ipc, IPCPRI);
                     68:        ipc.ip_lock = p->p_pid;
                     69:        ipc.ip_data = uap->data;
                     70:        ipc.ip_addr = uap->addr;
                     71:        ipc.ip_req = uap->req;
                     72:        p->p_flag &= ~SWTED;
                     73:        while (ipc.ip_req > 0) {
                     74:                if (p->p_stat==SSTOP)
                     75:                        setrun(p);
                     76:                sleep((caddr_t)&ipc, IPCPRI);
                     77:        }
                     78:        *retval = ipc.ip_data;
                     79:        ipc.ip_lock = 0;
                     80:        wakeup((caddr_t)&ipc);
                     81:        if (ipc.ip_req < 0)
                     82:                return (EIO);
                     83:        return (0);
                     84: }
                     85: 
                     86: #define        PHYSOFF(p, o) \
                     87:        ((physadr)(p)+((o)/sizeof(((physadr)0)->r[0])))
                     88: 
                     89: /*
                     90:  * Code that the child process
                     91:  * executes to implement the command
                     92:  * of the parent process in tracing.
                     93:  */
                     94: procxmt(p)
                     95:        register struct proc *p;
                     96: {
                     97:        register int i, *poff;
                     98:        register struct text *xp;
                     99:        struct vattr vattr;
                    100:        struct vnode *vp;
                    101: 
                    102:        if (ipc.ip_lock != p->p_pid)
                    103:                return (0);
                    104:        p->p_slptime = 0;
                    105:        i = ipc.ip_req;
                    106:        ipc.ip_req = 0;
                    107:        switch (i) {
                    108: 
                    109:        case PT_READ_I:                 /* read the child's text space */
                    110:                if (!useracc((caddr_t)ipc.ip_addr, 4, B_READ))
                    111:                        goto error;
                    112:                ipc.ip_data = fuiword((caddr_t)ipc.ip_addr);
                    113:                break;
                    114: 
                    115:        case PT_READ_D:                 /* read the child's data space */
                    116:                if (!useracc((caddr_t)ipc.ip_addr, 4, B_READ))
                    117:                        goto error;
                    118:                ipc.ip_data = fuword((caddr_t)ipc.ip_addr);
                    119:                break;
                    120: 
                    121:        case PT_READ_U:                 /* read the child's u. */
                    122: #ifdef HPUXCOMPAT
                    123:                if (u.u_pcb.pcb_flags & PCB_HPUXTRACE)
                    124:                        i = hpuxtobsduoff(ipc.ip_addr);
                    125:                else
                    126: #endif
                    127:                i = (int)ipc.ip_addr;
                    128:                if (i<0 || i > ctob(UPAGES)-sizeof(int))
                    129:                        goto error;
                    130:                ipc.ip_data = *(int *)PHYSOFF(&u, i);
                    131:                break;
                    132: 
                    133:        case PT_WRITE_I:                /* write the child's text space */
                    134:                /*
                    135:                 * If text, must assure exclusive use
                    136:                 */
                    137:                if (xp = p->p_textp) {
                    138:                        vp = xp->x_vptr;
                    139:                        VOP_GETATTR(vp, &vattr, u.u_cred);
                    140:                        if (xp->x_count!=1 || (vattr.va_mode & VSVTX))
                    141:                                goto error;
                    142:                        xp->x_flag |= XTRC;
                    143:                }
                    144:                i = -1;
                    145:                if ((i = suiword((caddr_t)ipc.ip_addr, ipc.ip_data)) < 0) {
                    146:                        if (!chgprot((caddr_t)ipc.ip_addr, RW) &&
                    147:                            !chgprot((caddr_t)ipc.ip_addr+(sizeof(int)-1), RW))
                    148:                                i = suiword((caddr_t)ipc.ip_addr, ipc.ip_data);
                    149:                        (void) chgprot((caddr_t)ipc.ip_addr, RO);
                    150:                        (void) chgprot((caddr_t)ipc.ip_addr+(sizeof(int)-1), RO);
                    151:                }
                    152:                if (i < 0)
                    153:                        goto error;
                    154: #if defined(tahoe)
                    155:                /* make sure the old value is not in cache */
                    156:                ckeyrelease(p->p_ckey);
                    157:                p->p_ckey = getcodekey();
                    158: #endif
                    159:                if (xp) {
                    160:                        xp->x_flag |= XWRIT;
                    161: #if defined(tahoe)
                    162:                        xp->x_ckey = p->p_ckey;
                    163: #endif
                    164:                }
                    165:                break;
                    166: 
                    167:        case PT_WRITE_D:                /* write the child's data space */
                    168:                if (suword((caddr_t)ipc.ip_addr, 0) < 0)
                    169:                        goto error;
                    170:                (void) suword((caddr_t)ipc.ip_addr, ipc.ip_data);
                    171:                break;
                    172: 
                    173:        case PT_WRITE_U:                /* write the child's u. */
                    174: #ifdef HPUXCOMPAT
                    175:                if (u.u_pcb.pcb_flags & PCB_HPUXTRACE)
                    176:                        i = hpuxtobsduoff(ipc.ip_addr);
                    177:                else
                    178: #endif
                    179:                i = (int)ipc.ip_addr;
                    180:                poff = (int *)PHYSOFF(&u, i);
                    181:                for (i=0; i<NIPCREG; i++)
                    182:                        if (poff == &u.u_ar0[ipcreg[i]])
                    183:                                goto ok;
                    184:                if (poff == &u.u_ar0[PS]) {
                    185:                        ipc.ip_data |= PSL_USERSET;
                    186:                        ipc.ip_data &= ~PSL_USERCLR;
                    187: #ifdef PSL_CM_CLR
                    188:                        if (ipc.ip_data & PSL_CM)
                    189:                                ipc.ip_data &= ~PSL_CM_CLR;
                    190: #endif
                    191:                        goto ok;
                    192:                }
                    193: #if defined(hp300)
                    194: #ifdef FPCOPROC
                    195:                if (poff >= (int *)u.u_pcb.pcb_fpregs.fpf_regs &&
                    196:                    poff <= (int *)&u.u_pcb.pcb_fpregs.fpf_fpiar)
                    197:                        goto ok;
                    198: #endif
                    199: #endif
                    200:                goto error;
                    201: 
                    202:        ok:
                    203:                *poff = ipc.ip_data;
                    204:                break;
                    205: 
                    206:        case PT_STEP:                   /* single step the child */
                    207:        case PT_CONTINUE:               /* continue the child */
                    208:                if ((int)ipc.ip_addr != 1)
                    209:                        u.u_ar0[PC] = (int)ipc.ip_addr;
                    210:                if ((unsigned)ipc.ip_data > NSIG)
                    211:                        goto error;
                    212:                p->p_xstat = ipc.ip_data;       /* see issig */
                    213:                if (i == PT_STEP) 
                    214:                        u.u_ar0[PS] |= PSL_T;
                    215:                wakeup((caddr_t)&ipc);
                    216:                return (1);
                    217: 
                    218:        case PT_KILL:                   /* kill the child process */
                    219:                wakeup((caddr_t)&ipc);
                    220:                exit(p, p->p_xstat);
                    221: 
                    222:        default:
                    223:        error:
                    224:                ipc.ip_req = -1;
                    225:        }
                    226:        wakeup((caddr_t)&ipc);
                    227:        return (0);
                    228: }

unix.superglobalmegacorp.com

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