1*b2c829d7Sjakllsch /* $NetBSD: rtlock.c,v 1.1.1.1 2014/04/01 16:16:07 jakllsch Exp $ */ 2*b2c829d7Sjakllsch 3*b2c829d7Sjakllsch /*++ 4*b2c829d7Sjakllsch 5*b2c829d7Sjakllsch Copyright (c) 1998 Intel Corporation 6*b2c829d7Sjakllsch 7*b2c829d7Sjakllsch Module Name: 8*b2c829d7Sjakllsch 9*b2c829d7Sjakllsch lock.c 10*b2c829d7Sjakllsch 11*b2c829d7Sjakllsch Abstract: 12*b2c829d7Sjakllsch 13*b2c829d7Sjakllsch Implements FLOCK 14*b2c829d7Sjakllsch 15*b2c829d7Sjakllsch 16*b2c829d7Sjakllsch 17*b2c829d7Sjakllsch Revision History 18*b2c829d7Sjakllsch 19*b2c829d7Sjakllsch --*/ 20*b2c829d7Sjakllsch 21*b2c829d7Sjakllsch 22*b2c829d7Sjakllsch #include "lib.h" 23*b2c829d7Sjakllsch 24*b2c829d7Sjakllsch 25*b2c829d7Sjakllsch 26*b2c829d7Sjakllsch #ifndef __GNUC__ 27*b2c829d7Sjakllsch #pragma RUNTIME_CODE(RtAcquireLock) 28*b2c829d7Sjakllsch #endif 29*b2c829d7Sjakllsch VOID RtAcquireLock(IN FLOCK * Lock)30*b2c829d7SjakllschRtAcquireLock ( 31*b2c829d7Sjakllsch IN FLOCK *Lock 32*b2c829d7Sjakllsch ) 33*b2c829d7Sjakllsch /*++ 34*b2c829d7Sjakllsch 35*b2c829d7Sjakllsch Routine Description: 36*b2c829d7Sjakllsch 37*b2c829d7Sjakllsch Raising to the task priority level of the mutual exclusion 38*b2c829d7Sjakllsch lock, and then acquires ownership of the lock. 39*b2c829d7Sjakllsch 40*b2c829d7Sjakllsch Arguments: 41*b2c829d7Sjakllsch 42*b2c829d7Sjakllsch Lock - The lock to acquire 43*b2c829d7Sjakllsch 44*b2c829d7Sjakllsch Returns: 45*b2c829d7Sjakllsch 46*b2c829d7Sjakllsch Lock owned 47*b2c829d7Sjakllsch 48*b2c829d7Sjakllsch --*/ 49*b2c829d7Sjakllsch { 50*b2c829d7Sjakllsch if (BS) { 51*b2c829d7Sjakllsch if (BS->RaiseTPL != NULL) { 52*b2c829d7Sjakllsch Lock->OwnerTpl = uefi_call_wrapper(BS->RaiseTPL, 1, Lock->Tpl); 53*b2c829d7Sjakllsch } 54*b2c829d7Sjakllsch } 55*b2c829d7Sjakllsch else { 56*b2c829d7Sjakllsch if (LibRuntimeRaiseTPL != NULL) { 57*b2c829d7Sjakllsch Lock->OwnerTpl = LibRuntimeRaiseTPL(Lock->Tpl); 58*b2c829d7Sjakllsch } 59*b2c829d7Sjakllsch } 60*b2c829d7Sjakllsch Lock->Lock += 1; 61*b2c829d7Sjakllsch ASSERT (Lock->Lock == 1); 62*b2c829d7Sjakllsch } 63*b2c829d7Sjakllsch 64*b2c829d7Sjakllsch 65*b2c829d7Sjakllsch #ifndef __GNUC__ 66*b2c829d7Sjakllsch #pragma RUNTIME_CODE(RtAcquireLock) 67*b2c829d7Sjakllsch #endif 68*b2c829d7Sjakllsch VOID RtReleaseLock(IN FLOCK * Lock)69*b2c829d7SjakllschRtReleaseLock ( 70*b2c829d7Sjakllsch IN FLOCK *Lock 71*b2c829d7Sjakllsch ) 72*b2c829d7Sjakllsch /*++ 73*b2c829d7Sjakllsch 74*b2c829d7Sjakllsch Routine Description: 75*b2c829d7Sjakllsch 76*b2c829d7Sjakllsch Releases ownership of the mutual exclusion lock, and 77*b2c829d7Sjakllsch restores the previous task priority level. 78*b2c829d7Sjakllsch 79*b2c829d7Sjakllsch Arguments: 80*b2c829d7Sjakllsch 81*b2c829d7Sjakllsch Lock - The lock to release 82*b2c829d7Sjakllsch 83*b2c829d7Sjakllsch Returns: 84*b2c829d7Sjakllsch 85*b2c829d7Sjakllsch Lock unowned 86*b2c829d7Sjakllsch 87*b2c829d7Sjakllsch --*/ 88*b2c829d7Sjakllsch { 89*b2c829d7Sjakllsch EFI_TPL Tpl; 90*b2c829d7Sjakllsch 91*b2c829d7Sjakllsch Tpl = Lock->OwnerTpl; 92*b2c829d7Sjakllsch ASSERT(Lock->Lock == 1); 93*b2c829d7Sjakllsch Lock->Lock -= 1; 94*b2c829d7Sjakllsch if (BS) { 95*b2c829d7Sjakllsch if (BS->RestoreTPL != NULL) { 96*b2c829d7Sjakllsch uefi_call_wrapper(BS->RestoreTPL, 1, Tpl); 97*b2c829d7Sjakllsch } 98*b2c829d7Sjakllsch } 99*b2c829d7Sjakllsch else { 100*b2c829d7Sjakllsch if (LibRuntimeRestoreTPL != NULL) { 101*b2c829d7Sjakllsch LibRuntimeRestoreTPL(Tpl); 102*b2c829d7Sjakllsch } 103*b2c829d7Sjakllsch } 104*b2c829d7Sjakllsch } 105