Annotation of sys/arch/i386/i386/mutex.S, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: mutex.S,v 1.4 2007/05/27 18:34:01 art Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 2004 Artur Grabowski <art@openbsd.org>
! 5: * All rights reserved.
! 6: *
! 7: * Redistribution and use in source and binary forms, with or without
! 8: * modification, are permitted provided that the following conditions
! 9: * are met:
! 10: *
! 11: * 1. Redistributions of source code must retain the above copyright
! 12: * notice, this list of conditions and the following disclaimer.
! 13: * 2. The name of the author may not be used to endorse or promote products
! 14: * derived from this software without specific prior written permission.
! 15: *
! 16: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
! 17: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
! 18: * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
! 19: * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
! 20: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
! 21: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
! 22: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
! 23: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
! 24: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
! 25: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 26: */
! 27:
! 28: #include "assym.h"
! 29: /*
! 30: * Yeah, we don't really need to implement mtx_init here, but let's keep
! 31: * all the functions in the same place.
! 32: */
! 33: ENTRY(mtx_init)
! 34: pushl %ebp
! 35: movl %esp, %ebp
! 36: movl 8(%esp), %eax
! 37: movl 12(%esp), %edx
! 38: movl %edx, MTX_WANTIPL(%eax)
! 39: xorl %edx, %edx
! 40: movl %edx, MTX_OLDIPL(%eax)
! 41: movl %edx, MTX_LOCK(%eax)
! 42: movl %edx, MTX_OWNER(%eax)
! 43: leave
! 44: ret
! 45:
! 46: #define SOFF 8
! 47:
! 48: ENTRY(mtx_enter)
! 49: pushl %ebp
! 50: movl %esp, %ebp
! 51: 1: movl SOFF(%ebp), %ecx
! 52: movl MTX_WANTIPL(%ecx), %eax
! 53: movl CPL, %edx # oipl = cpl;
! 54: cmpl %edx, %eax # if (cpl < mtx->mtx_wantipl)
! 55: jle 2f
! 56: movl %eax, CPL # cpl = mtx->mtx_wantipl;
! 57: 2: /*
! 58: * %edx now contains the oldipl.
! 59: * %ecx contains the mtx.
! 60: */
! 61: movl $1, %eax
! 62: xchgl %eax, MTX_LOCK(%ecx) # test_and_set(mtx->mtx_lock)
! 63: testl %eax, %eax # if (already held)
! 64: jnz 3f
! 65: movl CPUVAR(SELF), %eax
! 66: movl %eax, MTX_OWNER(%ecx)
! 67: movl %edx, MTX_OLDIPL(%ecx)
! 68: leave
! 69: ret
! 70:
! 71: /* We failed to obtain the lock. splx, spin and retry. */
! 72: 3: pushl %edx
! 73: call _C_LABEL(splx)
! 74: movl %ebp, %esp
! 75: movl SOFF(%ebp), %ecx # %ecx clobbered
! 76: 4:
! 77: #ifdef DIAGNOSTIC
! 78: movl CPUVAR(SELF), %edx
! 79: cmpl MTX_OWNER(%ecx), %edx
! 80: je 5f
! 81: #endif
! 82: movl MTX_LOCK(%ecx), %eax
! 83: testl %eax, %eax
! 84: jz 1b
! 85: jmp 4b
! 86: #ifdef DIAGNOSTIC
! 87: 5: pushl $6f
! 88: call _C_LABEL(panic)
! 89: 6: .asciz "mtx_enter: locking against myself"
! 90: #endif
! 91:
! 92: ENTRY(mtx_leave)
! 93: pushl %ebp
! 94: movl %esp, %ebp
! 95: movl SOFF(%ebp), %ecx
! 96: xorl %eax, %eax
! 97: movl %eax, MTX_OWNER(%ecx)
! 98: pushl MTX_OLDIPL(%ecx)
! 99: movl %eax, MTX_OLDIPL(%ecx)
! 100: movl %eax, MTX_LOCK(%ecx)
! 101: call _C_LABEL(splx)
! 102: leave
! 103: ret
CVSweb