Annotation of coherent/f/etc/conf/streams/src/spl.c, revision 1.1

1.1     ! root        1: #define        _DDI_DKI        1
        !             2: #define        _SYSV4          1
        !             3: 
        !             4: /*
        !             5:  * Code to manage the processor interrupt-priority level.
        !             6:  *
        !             7:  * This module exists to define external-linkage versions of the macros given
        !             8:  * in <sys/inline.h>, and to give a manual-page entry.
        !             9:  */
        !            10: 
        !            11: /*
        !            12:  *-IMPORTS:
        !            13:  *     <common/ccompat.h>
        !            14:  *             __USE_PROTO__
        !            15:  *             __ARGS ()
        !            16:  */
        !            17: 
        !            18: #include <common/ccompat.h>
        !            19: #include <sys/inline.h>
        !            20: 
        !            21: 
        !            22: #if    __COHERENT__
        !            23: #error This file is not for the Coherent version of STREAMS
        !            24: #endif
        !            25: 
        !            26: /*
        !            27:  *-STATUS:
        !            28:  *     DDI/DKI
        !            29:  *
        !            30:  *-NAME:
        !            31:  *     spl... ()       Block/allow interrupts on a processor.
        !            32:  *
        !            33:  *-SYNOPSIS:
        !            34:  *     #include <sys/inline.h>
        !            35:  *
        !            36:  *     pl_t splbase ();
        !            37:  *     pl_t spltimeout ();
        !            38:  *     pl_t spldisk ();
        !            39:  *     pl_t splstr ();
        !            40:  *     pl_t splhi ();
        !            41:  *     pl_t splx (pl_t oldlevel);
        !            42:  *
        !            43:  *-ARGUMENTS:
        !            44:  *     oldlevel        Last set priority value (only splx () has an input
        !            45:  *                     argument)
        !            46:  *
        !            47:  *-DESCRIPTION:
        !            48:  *     The spl... () functions block or allow servicing of interrupts on the
        !            49:  *     processor on which the function is called. Hardware devices are
        !            50:  *     assigned to interrupt priority levels depending on the type of device.
        !            51:  *     Each spl... () function which blocks interrupts is associated with
        !            52:  *     with some machine-dependent interrupt priority level and will prevent
        !            53:  *     interrupts occurring at or below this priority level from being
        !            54:  *     serviced on the processor on which the spl... () function is called.
        !            55:  *
        !            56:  *     On a multiprocessor system, interrupts may be serviced by more than
        !            57:  *     one processor, and therefore use of an spl... () function alone is not
        !            58:  *     sufficient to prevent interrupt code from executing and manipulating
        !            59:  *     driver data structures during a critical section. Drivers that must
        !            60:  *     prevent execution of interrupt-level code in order to protect the
        !            61:  *     integrity of their should use basic locks or read/write locks for
        !            62:  *     this purpose [see LOCK_ALLOC () or RW_ALLOC ()].
        !            63:  *
        !            64:  *     Calling a given spl... () function will block interrupts specified for
        !            65:  *     that function as well as all interrupts at equal an lower levels. The
        !            66:  *     notion of low vs. high levels assumes a defined order of priority
        !            67:  *     level. The following partial order is defined:
        !            68:  *             splbase <= spltimeout <= spldisk, splstr <= splhi
        !            69:  *
        !            70:  *     The ordering of spldisk () and splstr () relative to each other is not
        !            71:  *     defined.
        !            72:  *
        !            73:  *-RETURN VALUE:
        !            74:  *     All spl... () functions return the previous priority level.
        !            75:  *
        !            76:  *-LEVEL:
        !            77:  *     Base or Interrupt.
        !            78:  *
        !            79:  *-NOTES:
        !            80:  *     All spl... () functions do not sleep.
        !            81:  *
        !            82:  *     Driver-defined basic locks and read/write locks may be held across
        !            83:  *     calls to these functions, but the spl... () call must not cause the
        !            84:  *     priority level to be lowered below the level associated with the
        !            85:  *     lock.
        !            86:  *
        !            87:  *     Driver-defined sleep locks may be held across calls to these
        !            88:  *     functions.
        !            89:  *
        !            90:  *     When setting a given priority level, the previous level returned
        !            91:  *     should be saved and splx (), UNLOCK () or RW_UNLOCK () should be
        !            92:  *     used as appropriate to restore this level.
        !            93:  *
        !            94:  *     Interrupt-level code must never lower the interrupt priority level
        !            95:  *     below the level at which the interrupt handler was entered. For
        !            96:  *     example, is an interrupt handler is entered at the priority level
        !            97:  *     associated with spldisk (), the handler must not call spltimeout ().
        !            98:  */
        !            99: 
        !           100: #if    __USE_PROTO__
        !           101: pl_t (splbase) (void)
        !           102: #else
        !           103: pl_t
        !           104: splbase __ARGS (())
        !           105: #endif
        !           106: {
        !           107: #ifdef splbase
        !           108:        return splbase ();
        !           109: #else
        !           110:        return splx (plbase);
        !           111: #endif
        !           112: }
        !           113: 
        !           114: 
        !           115: #if    __USE_PROTO__
        !           116: pl_t (spltimeout) (void)
        !           117: #else
        !           118: pl_t
        !           119: spltimeout __ARGS (())
        !           120: #endif
        !           121: {
        !           122: #ifdef spltimeout
        !           123:        return spltimeout ();
        !           124: #else
        !           125:        return splx (pltimeout);
        !           126: #endif
        !           127: }
        !           128: 
        !           129: 
        !           130: #if    __USE_PROTO__
        !           131: pl_t (spldisk) (void)
        !           132: #else
        !           133: pl_t
        !           134: spldisk __ARGS (())
        !           135: #endif
        !           136: {
        !           137: #ifdef spldisk
        !           138:        return spldisk ();
        !           139: #else
        !           140:        return splx (pldisk);
        !           141: #endif
        !           142: }
        !           143: 
        !           144: 
        !           145: #if    __USE_PROTO__
        !           146: pl_t (splstr) (void)
        !           147: #else
        !           148: pl_t
        !           149: splstr __ARGS (())
        !           150: #endif
        !           151: {
        !           152: #ifdef splstr
        !           153:        return splstr ();
        !           154: #else
        !           155:        return splx (plstr);
        !           156: #endif
        !           157: }
        !           158: 
        !           159: 
        !           160: #if    __USE_PROTO__
        !           161: pl_t (splhi) (void)
        !           162: #else
        !           163: pl_t
        !           164: splhi __ARGS (())
        !           165: #endif
        !           166: {
        !           167: #ifdef splhi
        !           168:        return splhi ();
        !           169: #else
        !           170:        return splx (plhi);
        !           171: #endif
        !           172: }
        !           173: 
        !           174: #if    __USE_PROTO__
        !           175: pl_t (splx) (pl_t newpl)
        !           176: #else
        !           177: pl_t
        !           178: splx __ARGS ((newpl))
        !           179: pl_t           newpl;
        !           180: #endif
        !           181: {
        !           182: #ifdef splx
        !           183:        return splx (newpl);
        !           184: #else
        !           185:        pl_t            prev_pl;
        !           186:        intmask_t       mask = __GET_BASE_MASK () | _masktab [newpl];
        !           187: 
        !           188:        __OUT_IPL_MASK (mask);
        !           189: 
        !           190:        prev_pl = (pl_t) ddi_cpu_data ()->dc_ipl;
        !           191:        ddi_cpu_data ()->dc_ipl = newpl;
        !           192: 
        !           193:        return prev_pl;
        !           194: #endif
        !           195: }
        !           196: 
        !           197: 
        !           198: /*
        !           199:  *-STATUS:
        !           200:  *     Private internal (used by various assertions)
        !           201:  *
        !           202:  *-NAME:
        !           203:  *     splcmp          Compare processor priority levels
        !           204:  *
        !           205:  *-ARGUMENTS:
        !           206:  *     l               Processor priority level considered to be on the LHS
        !           207:  *                     of the l < r relational comparison.
        !           208:  *     r               Processor priority that "l" is to be compared with
        !           209:  *
        !           210:  *-DESCRIPTION:
        !           211:  *     This functions performs a relational comparison of processor priority
        !           212:  *     levels which can be used to test assertions about the relative order
        !           213:  *     in which priority levels are set. It is guaranteed that this function
        !           214:  *     will return values consistent with the partial order defined by the
        !           215:  *     DDI/DKI.
        !           216:  *
        !           217:  *     Note that attempting to compare the values "plstr" and "pldisk" is not
        !           218:  *     valid. In a system where processor priorities are implemented using
        !           219:  *     masks, "pldisk" and "plstr" may be genuinely unordered in that the
        !           220:  *     resulting masks may be disjoint. An implementation is free to diagnose
        !           221:  *     such a comparison by causing a kernel panic.
        !           222:  *
        !           223:  *     This function is intended for use in ASSERT () statements only. If it
        !           224:  *     is desired to set the processor priority level to the maximum of two
        !           225:  *     values, use splraise () instead so that in an implementation which
        !           226:  *     uses masks the logical union or intersection of the masks can be
        !           227:  *     taken.
        !           228:  *
        !           229:  *-RETURNS:
        !           230:  *     -1      if the level "l" compares less than "r"
        !           231:  *     0       if "l" and "r" specify the same actual priority level
        !           232:  *     1       if the level "l" compares greater that "r"
        !           233:  *
        !           234:  *-LEVEL:
        !           235:  *     Base or Interrupt.
        !           236:  *
        !           237:  *-NOTES:
        !           238:  *     This function does not sleep.
        !           239:  *
        !           240:  *     Driver-defined basic locks, read/write locks and sleep locks may be
        !           241:  *     held across calls to this function.
        !           242:  */
        !           243: 
        !           244: #if    __USE_PROTO__
        !           245: int (splcmp) (pl_t l, pl_t r)
        !           246: #else
        !           247: int
        !           248: splcmp __ARGS ((l, r))
        !           249: pl_t           l;
        !           250: pl_t           r;
        !           251: #endif
        !           252: {
        !           253:        return (l < r) ? -1 : l != r;
        !           254: }
        !           255: 
        !           256: 
        !           257: /*
        !           258:  *-STATUS:
        !           259:  *     Private internal (used by freezestr ())
        !           260:  *
        !           261:  *-NAME:
        !           262:  *     splraise        Raise processor priority level.
        !           263:  *
        !           264:  *-ARGUMENTS:
        !           265:  *     pl              Processor interrupt priority level to raise to.
        !           266:  *
        !           267:  *-DESCRIPTION:
        !           268:  *     splraise () changes the processor interrupt priority level to the
        !           269:  *     maximum value defined by the previous level and the current level.
        !           270:  *
        !           271:  *     If the previous and requested priority levels are "pldisk" and "plstr"
        !           272:  *     (in either order) this function does the appropriate action given that
        !           273:  *     the "maximum" level in a mask-based system is in the fact the union or
        !           274:  *     intersection of the two masks.
        !           275:  *
        !           276:  *-RETURNS:
        !           277:  *     The previous processor interrupt priority level.
        !           278:  *
        !           279:  *-LEVEL:
        !           280:  *     Base or Interrupt.
        !           281:  *
        !           282:  *-NOTES:
        !           283:  *     This function does not sleep.
        !           284:  *
        !           285:  *     Driver-defined basic locks, read/write locks and sleep locks may be
        !           286:  *     held across calls to this function.
        !           287:  */
        !           288: 
        !           289: #if    __USE_PROTO__
        !           290: pl_t (splraise) (pl_t newpl)
        !           291: #else
        !           292: pl_t
        !           293: splraise __ARGS ((newpl))
        !           294: pl_t           newpl;
        !           295: #endif
        !           296: {
        !           297: #ifdef splraise
        !           298:        return splraise (newpl);
        !           299: #else
        !           300:        pl_t            prev_pl;
        !           301: 
        !           302:        if (newpl > (prev_pl = (pl_t) ddi_cpu_data ()->dc_ipl)) {
        !           303:                intmask_t       mask = __GET_BASE_MASK () | _masktab [newpl];
        !           304: 
        !           305:                __OUT_IPL_MASK (mask);
        !           306:                ddi_cpu_data ()->dc_ipl = newpl;
        !           307:        }
        !           308: 
        !           309:        return prev_pl;
        !           310: #endif
        !           311: }

unix.superglobalmegacorp.com

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