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