Annotation of coherent/b/STREAMS/conf/streams/src/xcohspl.s, revision 1.1

1.1     ! root        1: / This file contains assembly-language implementations of processor priority-
        !             2: / level manipulation functions that would be in-lined using GCC or typical
        !             3: / MS-DOS tools. See "spl.c" for routine documentation.
        !             4: 
        !             5:                .unixorder
        !             6:                .include        struct.inc
        !             7:                .include        pl.inc
        !             8: 
        !             9: / Because the DDI/DKI processor-priority manipulation system I have chosen
        !            10: / to implement uses interrupt masks, we need access to a reasonable amount
        !            11: / of per-CPU global information...
        !            12: /
        !            13: /      The current abstract IPL.
        !            14: /      The current mask for the 'plbase' abstract IPL.
        !            15: /      The table of additional masks for abstract IPLs.
        !            16: /
        !            17: / This implementation is for Coherent, uniprocessor only. To make life easier
        !            18: / for this code we have put the relevant parts of the "ddi_cpu_data" structure
        !            19: / at the front. Coherent 'as' has no structure facility, so we use .set
        !            20: / Wouldn't this be easier if there was a .struct facility that knew about
        !            21: / the COFF/ABI structure alignment rules?
        !            22: 
        !            23: / struct defcpu {
        !            24:                .struct defer
        !            25:                .member         df_tab,ptr
        !            26:                .member         df_read,uchar
        !            27:                .member         df_max,uchar
        !            28:                .member         df_write,uchar
        !            29:                .member         df_rlock,uchar
        !            30:                .member         df_wlock,ptr
        !            31:                .ends   defer
        !            32: / };
        !            33:                .typedef        defer_t,defer
        !            34: 
        !            35: / struct dcdata {
        !            36:                .struct dcdata
        !            37:                .member         dc_cpu_id,uint
        !            38:                .member         dc_base_mask,ulong
        !            39:                .member         dc_int_level,uchar
        !            40:                .member         dc_user_level,uchar
        !            41:                .member         dc_ipl,uchar
        !            42:                .member         dc_defint,defer_t
        !            43:                .member         dc_defproc,defer_t
        !            44:                .ends   dcdata
        !            45: / };
        !            46:                .typedef        dcdata_t,dcdata
        !            47: / struct dgdata {
        !            48:                                        / member offsets
        !            49:                .struct dgdata
        !            50:                .member         dg_defint,defer_t
        !            51:                .ends   dgdata
        !            52: / };
        !            53:                .typedef        dgdata_t,dgdata
        !            54: 
        !            55: cpu            .define __ddi_cpu_data
        !            56: glob           .define __ddi_global_data
        !            57: 
        !            58:                .extern cpu,dcdata_t
        !            59:                .extern glob,dgdata_t
        !            60: 
        !            61:                .set    PICM,0x21
        !            62:                .set    SPICM,0xA1
        !            63: 
        !            64:                .globl  _masktab                        / array of longs
        !            65: 
        !            66:                .text
        !            67: 
        !            68:                .globl  splbase
        !            69:                .globl  spltimeout
        !            70:                .globl  spldisk
        !            71:                .globl  splstr
        !            72:                .globl  splhi
        !            73:                .globl  splx
        !            74:                .globl  splraise
        !            75:                .globl  splcmp
        !            76:                .globl  __SET_BASE_MASK
        !            77:                .globl  __CHEAP_DISABLE_INTS
        !            78:                .globl  __CHEAP_ENABLE_INTS
        !            79:                .globl  DDI_BASE_SLAVE_MASK
        !            80:                .globl  DDI_BASE_MASTER_MASK
        !            81: 
        !            82: / pl_t splbase (void)
        !            83: splbase:       mov     $plbase, %ecx
        !            84:                jmp     setnew
        !            85: 
        !            86: spltimeout:    mov     $pltimeout, %ecx
        !            87:                jmp     setnew
        !            88: 
        !            89: spldisk:       mov     $pldisk, %ecx
        !            90:                jmp     setnew
        !            91: 
        !            92: splstr:                mov     $plstr, %ecx
        !            93:                jmp     setnew
        !            94: 
        !            95: splhi:         mov     $plhi, %ecx
        !            96:                jmp     setnew
        !            97: 
        !            98: / pl_t splx (pl_t _newpl)
        !            99: splx:
        !           100:                movzxb  4(%esp), %ecx                   / new pl
        !           101: setnew:
        !           102:                movl    _masktab(%ecx,4), %eax          / new mask
        !           103: 
        !           104:        / send the mask out to the PICs after including the base mask info.
        !           105:                orl     cpu+dc_base_mask, %eax
        !           106:                outb    $PICM
        !           107:                xchgb   %ah,%al
        !           108:                outb    $SPICM
        !           109: 
        !           110:        / swap the new IPL for the old one, and return the old one.
        !           111:                movzxb  cpu+dc_ipl, %eax
        !           112:                movb    %cl, cpu+dc_ipl
        !           113: 
        !           114:                ret
        !           115: 
        !           116: / pl_t splraise (pl_t _newpl)
        !           117: splraise:
        !           118:                movzxb  4(%esp), %ecx                   / new pl
        !           119: 
        !           120:                cmpb    cpu+dc_ipl, %cl
        !           121:                jg      setnew
        !           122: 
        !           123:                movzxb  cpu+dc_ipl, %eax                / just return old
        !           124:                ret
        !           125: 
        !           126: / int splcmp (pl_t l, pl_t r)
        !           127: splcmp:                movzxb  4(%esp), %eax                   / left
        !           128:                sub     4(%esp), %eax                   / - right
        !           129:                jz      l_eq_r                          / if eq, %eax == 0
        !           130: / take advantage of 80x86 mov not changing condition codes.
        !           131:                mov     $-1, %eax
        !           132:                jl      l_lt_r                          / if <, %eax == -1
        !           133:                mov     $1, %eax                        / if >, %eax == 1
        !           134: l_eq_r:
        !           135: l_lt_r:
        !           136:                ret
        !           137: 
        !           138: / void __SET_BASE_MASK (intmask_t newmask)
        !           139: __SET_BASE_MASK:
        !           140:                mov     4(%esp), %eax                   / new mask
        !           141:                mov     %eax, cpu+dc_base_mask          / store it
        !           142:                outb    $PICM                           / mask low
        !           143:                mov     %ah, %al
        !           144:                outb    $SPICM                          / mask high
        !           145:                ret
        !           146: 
        !           147: / void __CHEAP_DISABLE_INTS (void)
        !           148: __CHEAP_DISABLE_INTS:
        !           149:                cli
        !           150:                ret
        !           151: 
        !           152: / void __CHEAP_ENABLE_INTS (void)
        !           153: __CHEAP_ENABLE_INTS:
        !           154:                sti
        !           155:                ret
        !           156: 
        !           157: / These function should only be called from base level, so that we don't
        !           158: / have to iterate over all kinds of junk to work out what the real mask
        !           159: / level should be. This condition is trivially satisfied at the moment because
        !           160: / these are only called by a Coherent's functions, which aren't protected by
        !           161: / any kind of spl... (), just (possibly) an sphi ()/spl ().
        !           162: 
        !           163: / void DDI_BASE_MASTER_MASK (uchar_t mask)
        !           164: DDI_BASE_MASTER_MASK:
        !           165:                mov     4(%esp), %al
        !           166:                mov     %al, cpu+dc_base_mask
        !           167:                outb    $PICM
        !           168:                ret
        !           169: 
        !           170: / void DDI_BASE_SLAVE_MASK (uchar_t mask)
        !           171: DDI_BASE_SLAVE_MASK:
        !           172:                mov     4(%esp), %al
        !           173:                mov     %al, cpu+dc_base_mask+1
        !           174:                outb    $SPICM
        !           175:                ret

unix.superglobalmegacorp.com

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