Loading...
--- Libc/Libc-391/pthreads/lock.s
+++ Libc/Libc-262/pthreads/lock.s
@@ -1,25 +1,3 @@
-/*
- * Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- *
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- *
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- *
- * @APPLE_LICENSE_HEADER_END@
- */
/*
* Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991
* All Rights Reserved
@@ -41,12 +19,11 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/
+/*
+ * MkLinux
+ */
-#define __APPLE_API_PRIVATE
-#include <machine/cpu_capabilities.h>
-#undef __APPLE_API_PRIVATE
-
-#if defined(__ppc__) || defined(__ppc64__)
+#if defined(__ppc__)
#import <architecture/ppc/asm_help.h>
#import <architecture/ppc/pseudo_inst.h>
@@ -55,19 +32,40 @@
*
* Lock the lock pointed to by `p'. Spin (possibly forever) until
* the lock is available. Test and test and set logic used.
- * These routines have moved to the comm page.
*/
.text
-.align 2
+
LEAF(__spin_lock_try)
- ba _COMM_PAGE_SPINLOCK_TRY
+1:
+ lwarx r5,0,r3 // Read the lock
+ addi r4,0,0x1 // Lock value
+ cmpwi r5,0x0 // Is it busy?
+ bne- 2f // Yes, return 0
+ stwcx. r4,0,r3 // Try to lock the lock
+ bne- 1b // Lost reservation, try again
+ addi r3,0,1 // Got the lock
+ isync // Sync instruction stream
+ blr // Return 1
+2: addi r3,0,0 // Could not get the lock
+ blr // Return 0
END(__spin_lock_try)
.globl _spin_lock
LEAF(__spin_lock)
_spin_lock:
- ba _COMM_PAGE_SPINLOCK_LOCK
+1:
+ lwarx r5,0,r3 // Read the lock
+ addi r4,0,0x1 // Lock value
+ cmpwi r5,0x0 // Is it busy?
+ bne- 2f // Yes, goto retry logic
+ stwcx. r4,0,r3 // Try to lock the lock
+ bne- 1b // Lost reservation, try again
+ isync // Sync instruction stream
+ blr // Return
+2:
+ CALL_EXTERN(__spin_lock_retry)
+ blr // Return
END(__spin_lock)
/* void spin_unlock(int *p);
@@ -77,7 +75,10 @@
.globl _spin_unlock
LEAF(__spin_unlock)
_spin_unlock:
- ba _COMM_PAGE_SPINLOCK_UNLOCK
+ sync
+ li32 r4,0
+ stw r4,0(r3)
+ blr
END(__spin_unlock)
#elif defined(__i386__)
@@ -93,21 +94,33 @@
* lock is available.
*/
TEXT
- ALIGN
.globl _spin_lock_try
LEAF(__spin_lock_try, 0)
_spin_lock_try:
- movl $(_COMM_PAGE_SPINLOCK_TRY), %eax
- jmpl %eax
-
- ALIGN
+ movl 4(%esp),%ecx
+ movl $1,%eax
+ xchgl (%ecx),%eax
+ xorl $1,%eax
+END(__spin_lock_try)
.globl _spin_lock
LEAF(__spin_lock, 0)
_spin_lock:
- movl $(_COMM_PAGE_SPINLOCK_LOCK), %eax
- jmpl %eax
+ movl 4(%esp), %ecx
+ movl (%ecx), %eax
+ orl %eax, %eax
+ jnz 1f
+ movl $0xFFFFFFFF, %eax
+ xchgl %eax, (%ecx)
+ orl %eax, %eax
+ jz 2f
+1: pushl %ecx
+ CALL_EXTERN(__spin_lock_retry)
+ addl $4, %esp
+2:
+END(__spin_lock)
+
/*
* void
@@ -116,13 +129,13 @@
*
* Unlock the lock pointed to by p.
*/
- ALIGN
-
.globl _spin_unlock
LEAF(__spin_unlock, 0)
_spin_unlock:
- movl $(_COMM_PAGE_SPINLOCK_UNLOCK), %eax
- jmpl %eax
+ movl $0, %eax
+ movl 4(%esp), %ecx
+ xchgl %eax, (%ecx)
+END(__spin_unlock)
#else
#error spin_locks not defined for this architecture