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