xref: /netbsd-src/sys/external/bsd/gnu-efi/dist/lib/runtime/rtlock.c (revision b2c829d73acfa2ef1ac1967460ebcec8f439b096)
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*b2c829d7Sjakllsch RtAcquireLock (
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*b2c829d7Sjakllsch RtReleaseLock (
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