[BACK]Return to mutex.S CVS log [TXT][DIR] Up to [local] / sys / arch / powerpc / powerpc

Annotation of sys/arch/powerpc/powerpc/mutex.S, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: mutex.S,v 1.3 2007/05/31 23:50:25 drahn Exp $ */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2007 Dale Rahn
        !             5:  * Copyright (c) 2007 Mark Kettenis
        !             6:  *
        !             7:  * Permission to use, copy, modify, and distribute this software for any
        !             8:  * purpose with or without fee is hereby granted, provided that the above
        !             9:  * copyright notice and this permission notice appear in all copies.
        !            10:  *
        !            11:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            12:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            13:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            14:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            15:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            16:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
        !            17:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            18:  */
        !            19:
        !            20: #include "assym.h"
        !            21:
        !            22: #include <machine/asm.h>
        !            23:
        !            24: /* XXX */
        !            25: #define GET_CPUINFO(r) mfsprg r,0
        !            26:
        !            27: ENTRY(mtx_init)
        !            28:        li      %r5,0
        !            29:        stw     %r4,MTX_WANTIPL(%r3)
        !            30:        stw     %r5,MTX_OLDCPL(%r3)
        !            31:        stw     %r5,MTX_OWNER(%r3)
        !            32:        blr
        !            33:
        !            34:
        !            35: ENTRY(mtx_enter)
        !            36:        stwu    %r1,-32(%r1)                    # reserve stack
        !            37:        mflr    %r0
        !            38:        stw     %r0,36(%r1)                     # save return address
        !            39: .L_retry:
        !            40:        GET_CPUINFO(%r4)
        !            41:        lwz     %r5,MTX_WANTIPL(%r3)            # load new ipl
        !            42:        lis     %r6,_C_LABEL(imask)@ha          # convert into cpl
        !            43:        slwi    %r5,%r5,2
        !            44:        addi    %r5,%r5,_C_LABEL(imask)@l
        !            45:        lwzx    %r5,%r5,%r6
        !            46:        lwz     %r7,CI_CPL(%r4)                 # load current cpl
        !            47:        or      %r6,%r5,%r7                     # raise cpl
        !            48:        stw     %r6,CI_CPL(%r4)                 # store new cpl
        !            49:        li      %r5,MTX_OWNER                   # load offset constant
        !            50:        lwarx   %r6,%r5,%r3                     # load reserve owner
        !            51:        cmpwi   0,%r6,0                         # test owner == 0
        !            52:        beq+    0,.L_mutex_free                 # if owner == 0 branch free
        !            53: .L_mutex_locked:
        !            54: #ifdef DIAGNOSTIC
        !            55:        cmpl    0,%r4,%r6
        !            56:        beq-    .L_mutex_selflocked
        !            57: #endif
        !            58:        stw     %r3,28(%r1)                     # save mtx during lcsplx
        !            59:        la      %r4,28(%r1)
        !            60:        stwcx.  %r3,0,%r4                       # unreserve owner
        !            61:        mr      %r3,%r7                         # move old cpl to arg0
        !            62:        bl      _C_LABEL(lcsplx)                # call splx on old cpl
        !            63:        lwz     %r3,28(%r1)
        !            64:        b       .L_retry
        !            65:
        !            66: .L_mutex_free:
        !            67:        stwcx.  %r4,%r5,%r3                     # old owner was 0 cond store
        !            68:        bne-    .L_mutex_locked                 # branch if reserve cancelled
        !            69:        stw     %r7,MTX_OLDCPL(%r3)             # save old ipl
        !            70:        lwz     %r0,36(%r1)                     # load return address
        !            71:        mtlr    %r0
        !            72:        addi    %r1,%r1,32                      # restore stack
        !            73:        blr
        !            74:
        !            75: #ifdef DIAGNOSTIC
        !            76: .L_mutex_selflocked:
        !            77:        mr      %r5, %r3
        !            78:        lis     %r3,.L_paniclocked@ha
        !            79:        la      %r3,.L_paniclocked@l(%r3)
        !            80:        bl      panic
        !            81: .L_paniclocked:
        !            82:        .string "mtx_enter: recursed %x %x\n"
        !            83: #endif
        !            84:
        !            85:
        !            86: ENTRY(mtx_leave)
        !            87: #ifdef DIAGNOSTIC
        !            88:        lwz     %r6,MTX_OWNER(%r3)
        !            89:        cmpwi   0,%r6,0                         # test owner == 0
        !            90:
        !            91:        beq-    .L_mutex_notlocked
        !            92: #endif
        !            93:        li      %r4,0
        !            94:        lwz     %r5,MTX_OLDCPL(%r3)
        !            95:        stw     %r4,MTX_OLDCPL(%r3)
        !            96:        stw     %r4,MTX_OWNER(%r3)
        !            97:        GET_CPUINFO(%r4)
        !            98:        mr      %r3,%r5
        !            99:        lwz     %r5,CI_CPL(%r4)
        !           100:        cmpl    0,%r3,%r5
        !           101:        beq     1f
        !           102:        b       _C_LABEL(lcsplx)
        !           103: 1:
        !           104:        blr
        !           105:
        !           106: #ifdef DIAGNOSTIC
        !           107: .L_mutex_notlocked:
        !           108:        GET_CPUINFO(%r4)
        !           109:        mr      %r5, %r3
        !           110:        lis     %r3,.L_panicnotlocked@ha
        !           111:        la      %r3,.L_panicnotlocked@l(%r3)
        !           112:        bl      panic
        !           113: .L_panicnotlocked:
        !           114:        .string "mtx_leave: not locked %x %x\n"
        !           115: #endif

CVSweb