X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/0b4e3aa066abc0728aacb4bbeb86f53f9737156e..ff6e181ae92fc6f1e89841290f461d1f2f9badd9:/iokit/IOKit/ppc/IOSharedLockImp.h diff --git a/iokit/IOKit/ppc/IOSharedLockImp.h b/iokit/IOKit/ppc/IOSharedLockImp.h index 3bff4b078..544daba40 100644 --- a/iokit/IOKit/ppc/IOSharedLockImp.h +++ b/iokit/IOKit/ppc/IOSharedLockImp.h @@ -3,19 +3,20 @@ * * @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. + * 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. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * 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@ */ @@ -49,16 +50,10 @@ #define _IOKIT_IOSHAREDLOCKIMP_H #include - -// 'Till we're building in kernel -.macro DISABLE_PREEMPTION -#ifdef KERNEL -#endif -.endmacro -.macro ENABLE_PREEMPTION #ifdef KERNEL +#undef END +#include #endif -.endmacro /* * void @@ -72,33 +67,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 @@ -114,7 +123,6 @@ LEAF(_ev_unlock) sync li a7,0 stw a7,0(a0) - ENABLE_PREEMPTION() blr END(_ev_unlock) @@ -122,7 +130,6 @@ LEAF(_IOSpinUnlock) sync li a7,0 stw a7,0(a0) - ENABLE_PREEMPTION() blr END(_IOSpinUnlock) @@ -135,45 +142,53 @@ 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 + 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: + 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 + 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: + li a0,0 // return FALSE + blr + END(_IOTrySpinLock) #endif /* ! _IOKIT_IOSHAREDLOCKIMP_H */