Home | History | Annotate | Line # | Download | only in runtime
rtlock.c revision 1.1.1.1.10.2
      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