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