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