Annotation of coherent/b/STREAMS/coh.386/ker_data.c, revision 1.1.1.1

1.1       root        1: /* $Header: /src386/STREAMS/coh.386/RCS/ker_data.c,v 2.1 93/08/09 13:35:41 bin Exp Locker: bin $ */
                      2: /*
                      3:  * This file contains definitions for the functions which support the Coherent
                      4:  * internal binary-compatibility scheme. We select _SYSV3 to get some old
                      5:  * definitions like makedev () visible.
                      6:  */
                      7: /*
                      8:  * $Log:       ker_data.c,v $
                      9:  * Revision 2.1  93/08/09  13:35:41  bin
                     10:  * Kernel 82 changes
                     11:  * 
                     12:  * Revision 2.2  93/07/26  14:55:28  nigel
                     13:  * Nigel's R80
                     14:  * 
                     15:  */
                     16: 
                     17: #define        _SYSV3          1
                     18: 
                     19: #include <common/ccompat.h>
                     20: #include <common/_tricks.h>
                     21: #include <common/_gregset.h>
                     22: #include <kernel/sigproc.h>
                     23: #include <kernel/v_types.h>
                     24: #include <sys/debug.h>
                     25: #include <string.h>
                     26: 
                     27: /*
                     28:  * These two pull in all the old-style trash.
                     29:  */
                     30: 
                     31: #include <sys/coherent.h>
                     32: #include <sys/uproc.h>
                     33: #include <sys/proc.h>
                     34: 
                     35: /*
                     36:  * Stubs for the multiprocessor locking functions.
                     37:  */
                     38: 
                     39: #define        PROC_STATE_LOCK(proc)           sphi ()
                     40: #define        PROC_STATE_UNLOCK(proc,pl)      spl (pl)
                     41: #define        PROC_ASSERT_LOCKED(proc)        ((void) 0)
                     42: 
                     43: 
                     44: /*
                     45:  * Initialize a freshly-allocated process structure to a copy of the current
                     46:  * process. As a special case, if there is no current process, the new process
                     47:  * is given some default values.
                     48:  */
                     49: 
                     50: #if    __USE_PROTO__
                     51: void PROC_INIT (__proc_t * process)
                     52: #else
                     53: void
                     54: PROC_INIT (process)
                     55: __proc_t      *        process;
                     56: #endif
                     57: {
                     58:        process->p_event = NULL;        /* Wakeup event channel */
                     59:        process->p_alarm = 0;           /* Timer for alarms */
                     60: 
                     61:        process->p_utime = 0L;          /* User time (HZ) */
                     62:        process->p_stime = 0L;          /* System time */
                     63:        process->p_cutime = 0L;         /* Sum of childs user time */
                     64:        process->p_cstime = 0L;         /* Sum of childs system time */
                     65:        process->p_exit = 0;            /* Exit status */
                     66:        process->p_polls = NULL;        /* Enabled polls */
                     67: 
                     68:        /* Poll timer */
                     69:        process->p_polltim.t_next = NULL;
                     70:        process->p_polltim.t_last = NULL;
                     71:        process->p_polltim.t_lbolt = 0L;
                     72:        process->p_polltim.t_func = NULL;
                     73:        process->p_polltim.t_farg = NULL;
                     74: 
                     75:        /* Alarm timer */
                     76:        process->p_alrmtim.t_next = NULL;
                     77:        process->p_alrmtim.t_last = NULL;
                     78:        process->p_alrmtim.t_lbolt = 0L;
                     79:        process->p_alrmtim.t_func = NULL;
                     80:        process->p_alrmtim.t_farg = NULL;
                     81: 
                     82:        process->p_prl = NULL;          /* Pending record lock */
                     83:        process->p_semu = NULL;         /* Semaphore undo */
                     84: 
                     85:        process->p_flags = PFCORE;
                     86:        process->p_state = PSRUN;
                     87:        process->p_ttdev = NODEV;
                     88: 
                     89:        process->p_pid = 0;
                     90: 
                     91:        __SIGSET_EMPTY (process->p_pending_signals);
                     92: 
                     93:        if (SELF == NULL) {
                     94:                process->p_ppid = 0;
                     95:                process->p_nice = 0;
                     96:                process->p_schedPri = 0;
                     97: 
                     98:                process->p_uid = 0;
                     99:                process->p_group = 0;
                    100:                process->p_ruid = 0;
                    101:                process->p_rgid = 0;
                    102: 
                    103:                /*
                    104:                 * Set ttdev to null so that we do not accidentally set a tty
                    105:                 * for init.
                    106:                 */
                    107:                process->p_ttdev = makedev (0, 0);
                    108: 
                    109:                __SIGSET_EMPTY (process->p_signal_mask);
                    110:                __SIGSET_EMPTY (process->p_queued_signals);
                    111: 
                    112:                /*
                    113:                 * The default action for the following signals is to ignore
                    114:                 * them.
                    115:                 */
                    116: 
                    117: #if    _SIGNAL_MAX <= __LONG_BIT
                    118:                process->p_ignored_signals._sigbits [0] =
                    119:                        __SIGSET_MASK (SIGCHLD) | __SIGSET_MASK (SIGPWR) |
                    120:                        __SIGSET_MASK (SIGWINCH) | __SIGSET_MASK (SIGURG) |
                    121:                        __SIGSET_MASK (SIGPOLL) | __SIGSET_MASK (SIGCONT);
                    122: #else
                    123:                __SIGSET_EMPTY (process->p_ignored_signals);
                    124:                __SIGSET_CLRBIT (process->p_ignored, SIGCHLD);
                    125:                __SIGSET_CLRBIT (process->p_ignored, SIGPWR);
                    126:                __SIGSET_CLRBIT (process->p_ignored, SIGWINCH);
                    127:                __SIGSET_CLRBIT (process->p_ignored, SIGURG);
                    128:                __SIGSET_CLRBIT (process->p_ignored, SIGPOLL);
                    129:                __SIGSET_CLRBIT (process->p_ignored, SIGCONT);
                    130: #endif
                    131: 
                    132:                process->p_sigflags = 0;
                    133:        } else {
                    134:                process->p_ppid = SELF->p_pid;
                    135:                process->p_nice = SELF->p_nice;
                    136:                process->p_schedPri = SELF->p_schedPri;
                    137: 
                    138:                process->p_uid = SELF->p_uid;
                    139:                process->p_group = SELF->p_group;
                    140:                process->p_ruid = SELF->p_ruid;
                    141:                process->p_rgid = SELF->p_rgid;
                    142: 
                    143:                process->p_ttdev = SELF->p_ttdev;
                    144: 
                    145:                process->p_signal_mask = SELF->p_signal_mask;
                    146:                process->p_ignored_signals = SELF->p_ignored_signals;
                    147:                process->p_queued_signals = SELF->p_queued_signals;
                    148: 
                    149:                process->p_sigflags = SELF->p_sigflags;
                    150:        }
                    151: }
                    152: 
                    153: 
                    154: /*
                    155:  * Wake a process from a sleep state, with the indicated "reason" code so that
                    156:  * the process can know whether sleep was interrupted or not.
                    157:  */
                    158: 
                    159: #if    __USE_PROTO__
                    160: void PROC_WAKE (__proc_t * process, int reason)
                    161: #else
                    162: void
                    163: PROC_WAKE (process, reason)
                    164: __proc_t      *        process;
                    165: int            reason;
                    166: #endif
                    167: {
                    168:        PROC_ASSERT_LOCKED (process);
                    169: 
                    170:        /*
                    171:         * Dequeue the process from the hash list used for old-style sleep ().
                    172:         */
                    173: 
                    174:        process->p_lback->p_lforw = process->p_lforw;
                    175:        process->p_lforw->p_lback = process->p_lback;
                    176: 
                    177:        /*
                    178:         * Change the process state to runnable and queue the process on the
                    179:         * appropriate run queue.
                    180:         */
                    181: 
                    182:        setrun (process);
                    183: }
                    184: 
                    185: #define        PROC_WAKE_SIGNAL(proc)  PROC_WAKE (proc, PROCESS_SIGNALLED)
                    186: 
                    187: 
                    188: /*
                    189:  * Internal version of sigaction (), which allows retrieval and optional
                    190:  * replacement of the current signal information.
                    191:  *
                    192:  * Note that we take a copy of the current information in a temporary before
                    193:  * trying to fiddle the new information; this allows the "act" and "oact"
                    194:  * pointers to point to the same space.
                    195:  */
                    196: 
                    197: #if    __USE_PROTO__
                    198: void curr_signal_action (int signal, __CONST__ __sigaction_t * act,
                    199:                         __sigaction_t * oact)
                    200: #else
                    201: void
                    202: curr_signal_action (signal, act, oact)
                    203: int            signal;
                    204: __CONST__ __sigaction_t
                    205:              * act;
                    206: __sigaction_t *        oact;
                    207: #endif
                    208: {
                    209:        __sigaction_t * proc_act;
                    210: 
                    211:        ASSERT (oact != NULL || act != NULL);
                    212:        ASSERT (signal > 0 && signal <= _SIGNAL_MAX);
                    213: 
                    214:        proc_act = & u.u_sigact [signal - 1];
                    215: 
                    216:        if (act != NULL) {
                    217:                __sigmask_t     mask = __SIGSET_MASK (signal);
                    218:                __sigaction_t   temp;
                    219: 
                    220:                /*
                    221:                 * Exchange the "action" data.
                    222:                 */
                    223: 
                    224:                temp = * proc_act;
                    225:                * proc_act = * act;
                    226:                if (oact != NULL)
                    227:                        * oact = temp;
                    228: 
                    229:                /*
                    230:                 * The SIGILL, SIGTRAP and SIGPWR signals do not have their
                    231:                 * handlers reset to SIG_DFL even if the user requests this.
                    232:                 * Again, this is "silently enforced" so it happens at this
                    233:                 * layer.
                    234:                 */
                    235: 
                    236: #if    _SIGNAL_MAX <= __LONG_BIT
                    237:                if ((mask & (__SIGSET_MASK (SIGILL) | __SIGSET_MASK (SIGTRAP) |
                    238:                             __SIGSET_MASK (SIGPWR))) == 0)
                    239: #else
                    240:                if (signal == SIGILL || signal == SIGTRAP || signal == SIGPWR)
                    241: #endif
                    242:                        proc_act->sa_flags &= ~ __SA_RESETHAND;
                    243: 
                    244:                /*
                    245:                 * Set the ignore flags to match handler. Note that we do not
                    246:                 * clear the pending signals for the current process here;
                    247:                 * that will happen on the way out of the system call we are
                    248:                 * in during the check for signals to deliver.
                    249:                 */
                    250: 
                    251:                if (proc_act->sa_handler == SIG_IGN)
                    252:                        __SIGSET_ADDMASK (SELF->p_ignored_signals, signal,
                    253:                                          mask);
                    254:                else
                    255:                        __SIGSET_CLRMASK (SELF->p_ignored_signals, signal,
                    256:                                          mask);
                    257: 
                    258:                /*
                    259:                 * Existing System V, Release 4 systems zero the mask if the
                    260:                 * signal is defaulted or ignored, so we copy them.
                    261:                 */
                    262: 
                    263:                if (proc_act->sa_handler == SIG_IGN ||
                    264:                    proc_act->sa_handler == SIG_DFL)
                    265:                        __SIGSET_EMPTY (proc_act->sa_mask);
                    266: 
                    267:                /*
                    268:                 * The default action for the following signals is for them to
                    269:                 * be ignored: SIGCHLD, SIGPWR, SIGWINCH, SIGURG, SIGPOLL,
                    270:                 * SIGCONT.
                    271:                 */
                    272: 
                    273: #if    _SIGNAL_MAX <= __LONG_BIT
                    274:                if (((__SIGSET_MASK (SIGCHLD) | __SIGSET_MASK (SIGPWR) |
                    275:                      __SIGSET_MASK (SIGWINCH) | __SIGSET_MASK (SIGURG) |
                    276:                      __SIGSET_MASK (SIGPOLL) | __SIGSET_MASK (SIGCONT))
                    277:                     & mask) != 0
                    278: #else
                    279:                if ((signal == SIGCHLD || signal == SIGPWR ||
                    280:                     signal == SIGWINCH || signal == SIGURG ||
                    281:                     signal == SIGPOLL || signal == SIGCONT)
                    282: #endif
                    283:                    && proc_act->sa_handler == SIG_DFL)
                    284:                        __SIGSET_ADDMASK (SELF->p_ignored_signals, signal,
                    285:                                          mask);
                    286: 
                    287:                if ((proc_act->sa_flags & __SA_SIGINFO) != 0)
                    288:                        __SIGSET_ADDMASK (SELF->p_queued_signals, signal,
                    289:                                          mask);
                    290:        } else
                    291:                * oact = * proc_act;
                    292: }
                    293: 
                    294: 
                    295: /*
                    296:  * Obtain and possibly change the current process's signal mask. Note that
                    297:  * we capture the current mask to a temporary before beginning, thus allowing
                    298:  * "mask" and "omask" to point to the same storage.
                    299:  */
                    300: 
                    301: #if    __USE_PROTO__
                    302: void curr_signal_mask (__CONST__ __sigset_t * mask, __sigset_t * omask)
                    303: #else
                    304: void
                    305: curr_signal_mask (mask, omask)
                    306: __CONST__ __sigset_t
                    307:              * mask;
                    308: __sigset_t    *        omask;
                    309: #endif
                    310: {
                    311:        ASSERT (omask != NULL || mask != NULL);
                    312: 
                    313:        if (mask != NULL) {
                    314:                __sigset_t      temp;
                    315: 
                    316:                /*
                    317:                 * The caller of this function should arrange for collateral
                    318:                 * actions such as checking for newly-unmasked signals in such
                    319:                 * as way as to ensure that signal actions are dealt with
                    320:                 * promptly and to ensure that locking is not needed.
                    321:                 *
                    322:                 * For instance, at this point signals may be briefly held
                    323:                 * which in fact "cannot" be. We don't care about this; the
                    324:                 * above constraint on our callers will ensure that this has
                    325:                 * no effect.
                    326:                 */
                    327: 
                    328:                temp = SELF->p_signal_mask;
                    329:                SELF->p_signal_mask = * mask;
                    330:                if (omask != NULL)
                    331:                        * omask = temp;
                    332: 
                    333:                /*
                    334:                 * SIGKILL and SIGSTOP may never be blocked or caught. Here we
                    335:                 * enforce the blocking part, which as the SVR4 PRM says is
                    336:                 * "silently enforced" by the system.
                    337:                 */
                    338: 
                    339:                __SIGSET_CLRBIT (SELF->p_signal_mask, SIGKILL);
                    340:                __SIGSET_CLRBIT (SELF->p_signal_mask, SIGSTOP);
                    341:        } else
                    342:                * omask = SELF->p_signal_mask;
                    343: }
                    344: 
                    345: 
                    346: /*
                    347:  * Test the signal mask of the given process to determine whether the given
                    348:  * signal is masked.
                    349:  */
                    350: 
                    351: #if    __USE_PROTO__
                    352: int proc_signal_masked (__proc_t * process, int signal)
                    353: #else
                    354: int
                    355: proc_signal_masked (process, signal)
                    356: __proc_t      *        process;
                    357: int            signal;
                    358: #endif
                    359: {
                    360:        ASSERT (process != NULL && signal > 0 && signal <= _SIGNAL_MAX);
                    361:        return __SIGSET_TSTBIT (process->p_signal_mask, signal);
                    362: }
                    363: 
                    364: 
                    365: /*
                    366:  * Return a zero value if there are no signals pending, otherwise return the
                    367:  * number of the first unmasked, non-ignored signal.
                    368:  *
                    369:  * NOTE: The code here interacts with curr_signal_action () and
                    370:  * proc_send_signal () in some ways that need comment; specifically, the
                    371:  * treatment of ignored signals may seem sloppy. However, the System V usage
                    372:  * of allowing ignored signals to be blocked, and then caught if a handler is
                    373:  * subsequently attached means that the approach of clearing pending, ignored
                    374:  * signals at this point is much simpler than dealing with them at all the
                    375:  * other points (arrival, unblocking, handler attach).
                    376:  */
                    377: 
                    378: #if    __USE_PROTO__
                    379: int curr_signal_pending (void)
                    380: #else
                    381: int
                    382: curr_signal_pending ()
                    383: #endif
                    384: {
                    385:        int             signo;
                    386: 
                    387:        /*
                    388:         * If any signals have arrived, but which are not held, figure out
                    389:         * what they are. This takes a little doing.
                    390:         */
                    391: 
                    392:        for (signo = 0 ;
                    393:             signo < __ARRAY_LENGTH (SELF->p_pending_signals._sigbits) ;
                    394:             signo ++) {
                    395:                __sigmask_t     mask;
                    396: 
                    397:                mask = (SELF->p_pending_signals._sigbits [signo] &=
                    398:                        ~ SELF->p_ignored_signals._sigbits [signo]) &
                    399:                                ~ SELF->p_signal_mask._sigbits [signo];
                    400:                if (mask == 0)
                    401:                        continue;
                    402: 
                    403:                /*
                    404:                 * There is at least one signal.  Extract its number
                    405:                 * from the signal bits.
                    406:                 */
                    407: 
                    408:                T_HAL(8, printf ("curr_signal_pending () = %d ",
                    409:                                 signo * sizeof (__sigmask_t) * __CHAR_BIT +
                    410:                                        __SIGSET_FIRSTBIT (mask)));
                    411: 
                    412:                return signo * sizeof (__sigmask_t) * __CHAR_BIT +
                    413:                                __SIGSET_FIRSTBIT (mask);
                    414:        }
                    415:        return 0;
                    416: }
                    417: 
                    418: 
                    419: #if    _SIGNAL_MAX <= __LONG_BIT
                    420: /*
                    421:  * For optimizing handling of job-control signals.
                    422:  */
                    423: 
                    424: #define        STOP_SIGNALS    (__SIGSET_MASK (SIGSTOP) | __SIGSET_MASK (SIGTSTP) |\
                    425:                         __SIGSET_MASK (SIGTTIN) | __SIGSET_MASK (SIGTTOU))
                    426: #endif
                    427: 
                    428: /*
                    429:  * Add the given signal to the indicated process's pending-signal mask and if
                    430:  * the process requires some notification (such as being woken if asleep, or
                    431:  * interrupted if scheduled on another processor) then perform that.
                    432:  *
                    433:  * This function can only be called from base level, but we must be aware of
                    434:  * the fact that process state-changes can happen at interrupt level and that
                    435:  * we can be interacting with multiple processors.
                    436:  */
                    437: 
                    438: #if    __USE_PROTO__
                    439: void proc_send_signal (__proc_t * process, __CONST__ __siginfo_t * siginfo)
                    440: #else
                    441: void
                    442: proc_send_signal (process, siginfo)
                    443: __proc_t      *        process;
                    444: __CONST__ __siginfo_t
                    445:              * siginfo;
                    446: #endif
                    447: {
                    448:        __sigmask_t     mask;
                    449:        pl_t            prev_pl;
                    450: 
                    451:        ASSERT (process != NULL && siginfo != NULL);
                    452:        ASSERT (siginfo->__si_signo > 0 && siginfo->__si_signo <= _SIGNAL_MAX);
                    453: 
                    454:        mask = __SIGSET_MASK (siginfo->__si_signo);
                    455: 
                    456:        if (siginfo->__si_signo == SIGCONT) {
                    457:                /*
                    458:                 * When a SIGCONT is received, all pending stop signals are
                    459:                 * discarded and if the process is stopped, it is continued.
                    460:                 */
                    461: 
                    462: #if    _SIGNAL_MAX <= __LONG_BIT
                    463:                __SIGSET_CLRMASK (process->p_pending_signals, 0,
                    464:                                  STOP_SIGNALS);
                    465: #else
                    466:                __SIGSET_CLRBIT (process->p_pending_signals, SIGSTOP);
                    467:                __SIGSET_CLRBIT (process->p_pending_signals, SIGTSTP);
                    468:                __SIGSET_CLRBIT (process->p_pending_signals, SIGTTIN);
                    469:                __SIGSET_CLRBIT (process->p_pending_signals, SIGTTOU);
                    470: #endif
                    471: 
                    472: #ifdef PROC_IS_STOPPED
                    473:                if (PROC_IS_STOPPED (process))
                    474:                        PROC_CONTINUE (process);
                    475: #endif
                    476:        }
                    477: 
                    478: #if    _SIGNAL_MAX <= __LONG_BIT
                    479:        if ((mask & STOP_SIGNALS) != 0) {
                    480: #else
                    481:        if (siginfo->__si_signo == SIGSTOP ||
                    482:            siginfo->__si_signo == SIGTSTP ||
                    483:            siginfo->__si_signo == SIGTTIN ||
                    484:            siginfo->__si_signo == SIGTTOU) {
                    485: #endif
                    486:                /*
                    487:                 * When a stop signal is received, any pending SIGCONT signal
                    488:                 * is discarded.
                    489:                 */
                    490: 
                    491:                __SIGSET_CLRBIT (process->p_pending_signals, SIGCONT);
                    492:        }
                    493: 
                    494: 
                    495: #if    0
                    496:        if (__SIGSET_TSTMASK (process->p_queued_signals, siginfo->__si_signo,
                    497:                              mask) != 0) {
                    498:                /*
                    499:                 * Reliable signal-queueing is in effect, so we must stash
                    500:                 * away a copy of the structure pointed at by "siginfo" so we
                    501:                 * can deliver the information as an additional argument to
                    502:                 * the signal-catching function.
                    503:                 */
                    504:                ASSERT ("Not implemented" == NULL);
                    505:        }
                    506: #endif /* NOT IMPLEMENTED */
                    507: 
                    508: 
                    509:        /*
                    510:         * Here we are about to modify some shared per-process state; now is a
                    511:         * good time to take a lock, so we structure the code so it can be
                    512:         * released. We require a basic lock for the state-change code, so we
                    513:         * use that lock to cover the process-level guard as well. In a uni-
                    514:         * processor system, the process-level guard is not necessary, but the
                    515:         * extra area covered is small enough that it doesn't matter.
                    516:         */
                    517: 
                    518:        prev_pl = PROC_STATE_LOCK (process);
                    519: 
                    520:        __SIGSET_ADDMASK (process->p_pending_signals,
                    521:                          siginfo->__si_signo, mask);
                    522: 
                    523:        if (! __SIGSET_TSTMASK (process->p_signal_mask,
                    524:                                siginfo->__si_signo, mask) &&
                    525:            ! __SIGSET_TSTMASK (process->p_ignored_signals,
                    526:                                siginfo->__si_signo, mask) &&
                    527:            process->p_state == PSSLSIG) {
                    528:                /*
                    529:                 * The process is sleeping and wants to be woken by
                    530:                 * signals, arrange for it to come out of sleep so it
                    531:                 * can get to user-level and process the signal.
                    532:                 */
                    533: 
                    534:                PROC_WAKE_SIGNAL (process);
                    535:        }
                    536: 
                    537:        PROC_STATE_UNLOCK (process, prev_pl);
                    538: 
                    539:        T_HAL (8, printf (" ign = %x hold = %x pend = %x ",
                    540:                          process->p_ignored_signals._sigbits [0],
                    541:                          process->p_signal_mask._sigbits [0],
                    542:                          process->p_pending_signals._sigbits [0]));
                    543: }
                    544: 
                    545: 
                    546: /*
                    547:  * Obtain and/or modify the current process's miscellaneous signal-flags. The
                    548:  * previous flags are returned, making "curr_signal_misc (0, 0)" the fetch.
                    549:  */
                    550: 
                    551: #if    __USE_PROTO__
                    552: __sigmiscfl_t curr_signal_misc (__sigmiscfl_t clear, __sigmiscfl_t set)
                    553: #else
                    554: __sigmiscfl_t
                    555: curr_signal_misc (clear, set)
                    556: __sigmiscfl_t  clear;
                    557: __sigmiscfl_t  set;
                    558: #endif
                    559: {
                    560:        __sigmiscfl_t   temp = SELF->p_sigflags;
                    561: 
                    562:        SELF->p_sigflags = (temp & ~ clear) | set;
                    563:        return temp;
                    564: }
                    565: 
                    566: 
                    567: /*
                    568:  * Return the given process's miscellaneous signal information. Note that we
                    569:  * don't try and deal with synchronization issues here, so whatever code tests
                    570:  * this data has to find some way of being multi-processor safe (concretely,
                    571:  * it means that the uses of the signal information here are not atomic at the
                    572:  * system-call level).
                    573:  */
                    574: 
                    575: #if    __USE_PROTO__
                    576: __sigmiscfl_t proc_signal_misc (__proc_t * process)
                    577: #else
                    578: __sigmiscfl_t
                    579: proc_signal_misc (process)
                    580: __proc_t      *        process;
                    581: #endif
                    582: {
                    583:        return process->p_sigflags;
                    584: }
                    585: 
                    586: 
                    587: /*
                    588:  * Remove a signal from the pending signal mask.
                    589:  */
                    590: 
                    591: #if    __USE_PROTO__
                    592: void proc_unkill (__proc_t * process, int signal)
                    593: #else
                    594: void
                    595: proc_unkill (process, signal)
                    596: __proc_t      *        process;
                    597: int            signal;
                    598: #endif
                    599: {
                    600:        __SIGSET_CLRBIT (process->p_pending_signals, signal);
                    601: }
                    602: 
                    603: 
                    604: /*
                    605:  * Perform a register dump from a gregset_t, plus any useful data from the
                    606:  * current process.
                    607:  */
                    608: 
                    609: #if    __USE_PROTO__
                    610: void curr_register_dump (gregset_t * regsetp)
                    611: #else
                    612: void
                    613: curr_register_dump (regsetp)
                    614: gregset_t     *        regsetp;
                    615: #endif
                    616: {
                    617:        printf ("\neax=%x  ebx=%x  ecx=%x  edx=%x\n", regsetp->_i386._eax,
                    618:                regsetp->_i386._ebx, regsetp->_i386._ecx, regsetp->_i386._edx);
                    619:        printf ("esi=%x  edi=%x  ebp=%x  esp=%x\n", regsetp->_i386._esi,
                    620:                regsetp->_i386._edi, regsetp->_i386._ebp, regsetp->_i386._esp);
                    621:        printf ("cs=%x  ds=%x  es=%x  ss=%x  fs=%x  gs=%x\n",
                    622:                regsetp->_i386._cs, regsetp->_i386._ds, regsetp->_i386._es,
                    623:                regsetp->_i386._ss, regsetp->_i386._fs, regsetp->_i386._gs);
                    624:        printf ("err #%d eip=%x  uesp=%x  cmd=%s\n", regsetp->_i386._err,
                    625:                regsetp->_i386._eip, regsetp->_i386._uesp, u.u_comm);
                    626:        printf ("efl=%x  ", regsetp->_i386._eflags);
                    627: 
                    628:        if ((regsetp->_i386._cs & R_USR) != R_USR) {
                    629:                /*
                    630:                 * This register set is indicating something that happened in
                    631:                 * the kernel, so do a call backtrace. To make this a little
                    632:                 * more robust, we only go upwards in the stack from the frame
                    633:                 * where we are, so that a smashed %ebp or frame causes no
                    634:                 * problems.
                    635:                 */
                    636: 
                    637:                __ulong_t     * ebp = (__ulong_t *) regsetp->_i386._ebp;
                    638:                __ulong_t     * prev = & regsetp->_i386._ebp;
                    639:                while (ebp > prev) {
                    640:                        printf (" -> %x", * (ebp + 1));
                    641:                        ebp = (__ulong_t *) * (prev = ebp);
                    642:                }
                    643:                printf ("\n");
                    644:        }
                    645: }
                    646: 

unix.superglobalmegacorp.com

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