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