Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | /* * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991 * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appears in all copies and * that both the copyright notice and this permission notice appear in * supporting documentation. * * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * */ /* * MkLinux */ #if defined(__ppc__) #define __APPLE_API_PRIVATE #include <machine/cpu_capabilities.h> #undef __APPLE_API_PRIVATE #import <architecture/ppc/asm_help.h> #import <architecture/ppc/pseudo_inst.h> /* void spin_lock(int *p); * * Lock the lock pointed to by `p'. Spin (possibly forever) until * the lock is available. Test and test and set logic used. */ .text LEAF(__spin_lock_try) ba _COMM_PAGE_SPINLOCK_TRY END(__spin_lock_try) .globl _spin_lock LEAF(__spin_lock) _spin_lock: ba _COMM_PAGE_SPINLOCK_LOCK END(__spin_lock) /* void spin_unlock(int *p); * * Unlock the lock pointed to by p. */ .globl _spin_unlock LEAF(__spin_unlock) _spin_unlock: ba _COMM_PAGE_SPINLOCK_UNLOCK END(__spin_unlock) #elif defined(__i386__) #include <architecture/i386/asm_help.h> /* * void * _spin_lock(p) * int *p; * * Lock the lock pointed to by p. Spin (possibly forever) until the next * lock is available. */ TEXT .globl _spin_lock_try LEAF(__spin_lock_try, 0) _spin_lock_try: 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 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 * _spin_unlock(p) * int *p; * * Unlock the lock pointed to by p. */ .globl _spin_unlock LEAF(__spin_unlock, 0) _spin_unlock: movl $0, %eax movl 4(%esp), %ecx xchgl %eax, (%ecx) END(__spin_unlock) #else #error spin_locks not defined for this architecture #endif |