X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/e3027f41d0120b4278cca462f397b6619dcd9ac5..55e303ae13a4cf49d70f2294092726f2fffb9ef2:/iokit/IOKit/ppc/IOSharedLockImp.h diff --git a/iokit/IOKit/ppc/IOSharedLockImp.h b/iokit/IOKit/ppc/IOSharedLockImp.h index 030fd4913..c6c062fd5 100644 --- a/iokit/IOKit/ppc/IOSharedLockImp.h +++ b/iokit/IOKit/ppc/IOSharedLockImp.h @@ -3,19 +3,22 @@ * * @APPLE_LICENSE_HEADER_START@ * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * 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 OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * 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@ */ @@ -93,20 +96,48 @@ #ifndef KERNEL LEAF(_ev_lock) -LEAF(_IOSpinLock) - li a6,1 // lock value - lwarx a7,0,a0 // CEMV10 -9: - sync - lwarx a7,0,a0 // read the lock - cmpwi cr0,a7,0 // is it busy? - bne- 9b // yes, spin - sync - stwcx. a6,0,a0 // try to get the lock - bne- 9b // failed, try again - isync - blr // got it, return + + li a6,1 // lock value + +8: lwz a7,0(a0) // Get lock word + mr. a7,a7 // Is it held? + bne-- 8b // Yup... + +9: lwarx a7,0,a0 // read the lock + mr. a7,a7 // Is it held? + bne-- 7f // yes, kill reservation + stwcx. a6,0,a0 // try to get the lock + bne-- 9b // failed, try again + isync + blr // got it, return + +7: li a7,-4 // Point to a spot in the red zone + stwcx. a7,a7,r1 // Kill reservation + b 8b // Go wait some more... + + END(_ev_lock) + +LEAF(_IOSpinLock) + + li a6,1 // lock value + +8: lwz a7,0(a0) // Get lock word + mr. a7,a7 // Is it held? + bne-- 8b // Yup... + +9: lwarx a7,0,a0 // read the lock + mr. a7,a7 // Is it held? + bne-- 7f // yes, kill reservation + stwcx. a6,0,a0 // try to get the lock + bne-- 9b // failed, try again + isync + blr // got it, return + +7: li a7,-4 // Point to a spot in the red zone + stwcx. a7,a7,r1 // Kill reservation + b 8b // Go wait some more... +END(_IOSpinLock) #endif /* @@ -118,7 +149,6 @@ END(_ev_lock) */ LEAF(_ev_unlock) -LEAF(_IOSpinUnlock) sync li a7,0 stw a7,0(a0) @@ -126,6 +156,14 @@ LEAF(_IOSpinUnlock) blr END(_ev_unlock) +LEAF(_IOSpinUnlock) + sync + li a7,0 + stw a7,0(a0) + ENABLE_PREEMPTION() + blr +END(_IOSpinUnlock) + /* * ev_try_lock(p) @@ -135,25 +173,61 @@ END(_ev_unlock) */ LEAF(_ev_try_lock) -LEAF(_IOTrySpinLock) - li a6,1 // lock value - DISABLE_PREEMPTION() - lwarx a7,0,a0 // CEMV10 -8: - sync - lwarx a7,0,a0 // read the lock - cmpwi cr0,a7,0 // is it busy? - bne- 9f // yes, give up - sync - stwcx. a6,0,a0 // try to get the lock - bne- 8b // failed, try again - li a0,1 // return TRUE - isync - blr -9: - ENABLE_PREEMPTION() - li a0,0 // return FALSE - blr + + DISABLE_PREEMPTION() + + li a6,1 // lock value + + lwz a7,0(a0) // Get lock word + mr. a7,a7 // Is it held? + bne-- 6f // Yup... + +9: lwarx a7,0,a0 // read the lock + mr. a7,a7 // Is it held? + bne-- 7f // yes, kill reservation + stwcx. a6,0,a0 // try to get the lock + bne-- 9b // failed, try again + li a0,1 // return TRUE + isync + blr // got it, return + +7: li a7,-4 // Point to a spot in the red zone + stwcx. a7,a7,r1 // Kill reservation + +6: + ENABLE_PREEMPTION() + li a0,0 // return FALSE + blr + END(_ev_try_lock) +LEAF(_IOTrySpinLock) + + DISABLE_PREEMPTION() + + li a6,1 // lock value + + lwz a7,0(a0) // Get lock word + mr. a7,a7 // Is it held? + bne-- 6f // Yup... + +9: lwarx a7,0,a0 // read the lock + mr. a7,a7 // Is it held? + bne-- 7f // yes, kill reservation + stwcx. a6,0,a0 // try to get the lock + bne-- 9b // failed, try again + li a0,1 // return TRUE + isync + blr // got it, return + +7: li a7,-4 // Point to a spot in the red zone + stwcx. a7,a7,r1 // Kill reservation + +6: + ENABLE_PREEMPTION() + li a0,0 // return FALSE + blr + +END(_IOTrySpinLock) + #endif /* ! _IOKIT_IOSHAREDLOCKIMP_H */