X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/7b1edb791d9ca667b95988cb5638c4c88416cd17..55e303ae13a4cf49d70f2294092726f2fffb9ef2:/iokit/IOKit/ppc/IOSharedLockImp.h diff --git a/iokit/IOKit/ppc/IOSharedLockImp.h b/iokit/IOKit/ppc/IOSharedLockImp.h index 01bb64e76..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,33 +96,47 @@ #ifndef KERNEL LEAF(_ev_lock) - 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 - 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(_IOSpinLock) #endif @@ -156,45 +173,61 @@ END(_IOSpinUnlock) */ LEAF(_ev_try_lock) - 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) - 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(_IOTrySpinLock) #endif /* ! _IOKIT_IOSHAREDLOCKIMP_H */