Home | History | Annotate | Line # | Download | only in lib
misc.c revision 1.1.1.1.6.2
      1  1.1.1.1.6.2  yamt /*	$NetBSD: misc.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     misc.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 
     14  1.1.1.1.6.2  yamt 
     15  1.1.1.1.6.2  yamt 
     16  1.1.1.1.6.2  yamt Revision History
     17  1.1.1.1.6.2  yamt 
     18  1.1.1.1.6.2  yamt --*/
     19  1.1.1.1.6.2  yamt 
     20  1.1.1.1.6.2  yamt #include "lib.h"
     21  1.1.1.1.6.2  yamt 
     22  1.1.1.1.6.2  yamt 
     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 
     27  1.1.1.1.6.2  yamt VOID *
     28  1.1.1.1.6.2  yamt AllocatePool (
     29  1.1.1.1.6.2  yamt     IN UINTN                Size
     30  1.1.1.1.6.2  yamt     )
     31  1.1.1.1.6.2  yamt {
     32  1.1.1.1.6.2  yamt     EFI_STATUS              Status;
     33  1.1.1.1.6.2  yamt     VOID                    *p;
     34  1.1.1.1.6.2  yamt 
     35  1.1.1.1.6.2  yamt     Status = uefi_call_wrapper(BS->AllocatePool, 3, PoolAllocationType, Size, &p);
     36  1.1.1.1.6.2  yamt     if (EFI_ERROR(Status)) {
     37  1.1.1.1.6.2  yamt         DEBUG((D_ERROR, "AllocatePool: out of pool  %x\n", Status));
     38  1.1.1.1.6.2  yamt         p = NULL;
     39  1.1.1.1.6.2  yamt     }
     40  1.1.1.1.6.2  yamt     return p;
     41  1.1.1.1.6.2  yamt }
     42  1.1.1.1.6.2  yamt 
     43  1.1.1.1.6.2  yamt VOID *
     44  1.1.1.1.6.2  yamt AllocateZeroPool (
     45  1.1.1.1.6.2  yamt     IN UINTN                Size
     46  1.1.1.1.6.2  yamt     )
     47  1.1.1.1.6.2  yamt {
     48  1.1.1.1.6.2  yamt     VOID                    *p;
     49  1.1.1.1.6.2  yamt 
     50  1.1.1.1.6.2  yamt     p = AllocatePool (Size);
     51  1.1.1.1.6.2  yamt     if (p) {
     52  1.1.1.1.6.2  yamt         ZeroMem (p, Size);
     53  1.1.1.1.6.2  yamt     }
     54  1.1.1.1.6.2  yamt 
     55  1.1.1.1.6.2  yamt     return p;
     56  1.1.1.1.6.2  yamt }
     57  1.1.1.1.6.2  yamt 
     58  1.1.1.1.6.2  yamt VOID *
     59  1.1.1.1.6.2  yamt ReallocatePool (
     60  1.1.1.1.6.2  yamt     IN VOID                 *OldPool,
     61  1.1.1.1.6.2  yamt     IN UINTN                OldSize,
     62  1.1.1.1.6.2  yamt     IN UINTN                NewSize
     63  1.1.1.1.6.2  yamt     )
     64  1.1.1.1.6.2  yamt {
     65  1.1.1.1.6.2  yamt     VOID                    *NewPool;
     66  1.1.1.1.6.2  yamt 
     67  1.1.1.1.6.2  yamt     NewPool = NULL;
     68  1.1.1.1.6.2  yamt     if (NewSize) {
     69  1.1.1.1.6.2  yamt         NewPool = AllocatePool (NewSize);
     70  1.1.1.1.6.2  yamt     }
     71  1.1.1.1.6.2  yamt 
     72  1.1.1.1.6.2  yamt     if (OldPool) {
     73  1.1.1.1.6.2  yamt         if (NewPool) {
     74  1.1.1.1.6.2  yamt             CopyMem (NewPool, OldPool, OldSize < NewSize ? OldSize : NewSize);
     75  1.1.1.1.6.2  yamt         }
     76  1.1.1.1.6.2  yamt 
     77  1.1.1.1.6.2  yamt         FreePool (OldPool);
     78  1.1.1.1.6.2  yamt     }
     79  1.1.1.1.6.2  yamt 
     80  1.1.1.1.6.2  yamt     return NewPool;
     81  1.1.1.1.6.2  yamt }
     82  1.1.1.1.6.2  yamt 
     83  1.1.1.1.6.2  yamt 
     84  1.1.1.1.6.2  yamt VOID
     85  1.1.1.1.6.2  yamt FreePool (
     86  1.1.1.1.6.2  yamt     IN VOID                 *Buffer
     87  1.1.1.1.6.2  yamt     )
     88  1.1.1.1.6.2  yamt {
     89  1.1.1.1.6.2  yamt     uefi_call_wrapper(BS->FreePool, 1, Buffer);
     90  1.1.1.1.6.2  yamt }
     91  1.1.1.1.6.2  yamt 
     92  1.1.1.1.6.2  yamt 
     93  1.1.1.1.6.2  yamt 
     94  1.1.1.1.6.2  yamt VOID
     95  1.1.1.1.6.2  yamt ZeroMem (
     96  1.1.1.1.6.2  yamt     IN VOID     *Buffer,
     97  1.1.1.1.6.2  yamt     IN UINTN    Size
     98  1.1.1.1.6.2  yamt     )
     99  1.1.1.1.6.2  yamt {
    100  1.1.1.1.6.2  yamt     RtZeroMem (Buffer, Size);
    101  1.1.1.1.6.2  yamt }
    102  1.1.1.1.6.2  yamt 
    103  1.1.1.1.6.2  yamt VOID
    104  1.1.1.1.6.2  yamt SetMem (
    105  1.1.1.1.6.2  yamt     IN VOID     *Buffer,
    106  1.1.1.1.6.2  yamt     IN UINTN    Size,
    107  1.1.1.1.6.2  yamt     IN UINT8    Value
    108  1.1.1.1.6.2  yamt     )
    109  1.1.1.1.6.2  yamt {
    110  1.1.1.1.6.2  yamt     RtSetMem (Buffer, Size, Value);
    111  1.1.1.1.6.2  yamt }
    112  1.1.1.1.6.2  yamt 
    113  1.1.1.1.6.2  yamt VOID
    114  1.1.1.1.6.2  yamt CopyMem (
    115  1.1.1.1.6.2  yamt     IN VOID     *Dest,
    116  1.1.1.1.6.2  yamt     IN VOID     *Src,
    117  1.1.1.1.6.2  yamt     IN UINTN    len
    118  1.1.1.1.6.2  yamt     )
    119  1.1.1.1.6.2  yamt {
    120  1.1.1.1.6.2  yamt     RtCopyMem (Dest, Src, len);
    121  1.1.1.1.6.2  yamt }
    122  1.1.1.1.6.2  yamt 
    123  1.1.1.1.6.2  yamt INTN
    124  1.1.1.1.6.2  yamt CompareMem (
    125  1.1.1.1.6.2  yamt     IN VOID     *Dest,
    126  1.1.1.1.6.2  yamt     IN VOID     *Src,
    127  1.1.1.1.6.2  yamt     IN UINTN    len
    128  1.1.1.1.6.2  yamt     )
    129  1.1.1.1.6.2  yamt {
    130  1.1.1.1.6.2  yamt     return RtCompareMem (Dest, Src, len);
    131  1.1.1.1.6.2  yamt }
    132  1.1.1.1.6.2  yamt 
    133  1.1.1.1.6.2  yamt BOOLEAN
    134  1.1.1.1.6.2  yamt GrowBuffer(
    135  1.1.1.1.6.2  yamt     IN OUT EFI_STATUS   *Status,
    136  1.1.1.1.6.2  yamt     IN OUT VOID         **Buffer,
    137  1.1.1.1.6.2  yamt     IN UINTN            BufferSize
    138  1.1.1.1.6.2  yamt     )
    139  1.1.1.1.6.2  yamt /*++
    140  1.1.1.1.6.2  yamt 
    141  1.1.1.1.6.2  yamt Routine Description:
    142  1.1.1.1.6.2  yamt 
    143  1.1.1.1.6.2  yamt     Helper function called as part of the code needed
    144  1.1.1.1.6.2  yamt     to allocate the proper sized buffer for various
    145  1.1.1.1.6.2  yamt     EFI interfaces.
    146  1.1.1.1.6.2  yamt 
    147  1.1.1.1.6.2  yamt Arguments:
    148  1.1.1.1.6.2  yamt 
    149  1.1.1.1.6.2  yamt     Status      - Current status
    150  1.1.1.1.6.2  yamt 
    151  1.1.1.1.6.2  yamt     Buffer      - Current allocated buffer, or NULL
    152  1.1.1.1.6.2  yamt 
    153  1.1.1.1.6.2  yamt     BufferSize  - Current buffer size needed
    154  1.1.1.1.6.2  yamt 
    155  1.1.1.1.6.2  yamt Returns:
    156  1.1.1.1.6.2  yamt 
    157  1.1.1.1.6.2  yamt     TRUE - if the buffer was reallocated and the caller
    158  1.1.1.1.6.2  yamt     should try the API again.
    159  1.1.1.1.6.2  yamt 
    160  1.1.1.1.6.2  yamt --*/
    161  1.1.1.1.6.2  yamt {
    162  1.1.1.1.6.2  yamt     BOOLEAN         TryAgain;
    163  1.1.1.1.6.2  yamt 
    164  1.1.1.1.6.2  yamt     //
    165  1.1.1.1.6.2  yamt     // If this is an initial request, buffer will be null with a new buffer size
    166  1.1.1.1.6.2  yamt     //
    167  1.1.1.1.6.2  yamt 
    168  1.1.1.1.6.2  yamt     if (!*Buffer && BufferSize) {
    169  1.1.1.1.6.2  yamt         *Status = EFI_BUFFER_TOO_SMALL;
    170  1.1.1.1.6.2  yamt     }
    171  1.1.1.1.6.2  yamt 
    172  1.1.1.1.6.2  yamt     //
    173  1.1.1.1.6.2  yamt     // If the status code is "buffer too small", resize the buffer
    174  1.1.1.1.6.2  yamt     //
    175  1.1.1.1.6.2  yamt 
    176  1.1.1.1.6.2  yamt     TryAgain = FALSE;
    177  1.1.1.1.6.2  yamt     if (*Status == EFI_BUFFER_TOO_SMALL) {
    178  1.1.1.1.6.2  yamt 
    179  1.1.1.1.6.2  yamt         if (*Buffer) {
    180  1.1.1.1.6.2  yamt             FreePool (*Buffer);
    181  1.1.1.1.6.2  yamt         }
    182  1.1.1.1.6.2  yamt 
    183  1.1.1.1.6.2  yamt         *Buffer = AllocatePool (BufferSize);
    184  1.1.1.1.6.2  yamt 
    185  1.1.1.1.6.2  yamt         if (*Buffer) {
    186  1.1.1.1.6.2  yamt             TryAgain = TRUE;
    187  1.1.1.1.6.2  yamt         } else {
    188  1.1.1.1.6.2  yamt             *Status = EFI_OUT_OF_RESOURCES;
    189  1.1.1.1.6.2  yamt         }
    190  1.1.1.1.6.2  yamt     }
    191  1.1.1.1.6.2  yamt 
    192  1.1.1.1.6.2  yamt     //
    193  1.1.1.1.6.2  yamt     // If there's an error, free the buffer
    194  1.1.1.1.6.2  yamt     //
    195  1.1.1.1.6.2  yamt 
    196  1.1.1.1.6.2  yamt     if (!TryAgain && EFI_ERROR(*Status) && *Buffer) {
    197  1.1.1.1.6.2  yamt         FreePool (*Buffer);
    198  1.1.1.1.6.2  yamt         *Buffer = NULL;
    199  1.1.1.1.6.2  yamt     }
    200  1.1.1.1.6.2  yamt 
    201  1.1.1.1.6.2  yamt     return TryAgain;
    202  1.1.1.1.6.2  yamt }
    203  1.1.1.1.6.2  yamt 
    204  1.1.1.1.6.2  yamt 
    205  1.1.1.1.6.2  yamt EFI_MEMORY_DESCRIPTOR *
    206  1.1.1.1.6.2  yamt LibMemoryMap (
    207  1.1.1.1.6.2  yamt     OUT UINTN               *NoEntries,
    208  1.1.1.1.6.2  yamt     OUT UINTN               *MapKey,
    209  1.1.1.1.6.2  yamt     OUT UINTN               *DescriptorSize,
    210  1.1.1.1.6.2  yamt     OUT UINT32              *DescriptorVersion
    211  1.1.1.1.6.2  yamt     )
    212  1.1.1.1.6.2  yamt {
    213  1.1.1.1.6.2  yamt     EFI_STATUS              Status;
    214  1.1.1.1.6.2  yamt     EFI_MEMORY_DESCRIPTOR   *Buffer;
    215  1.1.1.1.6.2  yamt     UINTN                   BufferSize;
    216  1.1.1.1.6.2  yamt 
    217  1.1.1.1.6.2  yamt     //
    218  1.1.1.1.6.2  yamt     // Initialize for GrowBuffer loop
    219  1.1.1.1.6.2  yamt     //
    220  1.1.1.1.6.2  yamt 
    221  1.1.1.1.6.2  yamt     Buffer = NULL;
    222  1.1.1.1.6.2  yamt     BufferSize = sizeof(EFI_MEMORY_DESCRIPTOR);
    223  1.1.1.1.6.2  yamt 
    224  1.1.1.1.6.2  yamt     //
    225  1.1.1.1.6.2  yamt     // Call the real function
    226  1.1.1.1.6.2  yamt     //
    227  1.1.1.1.6.2  yamt 
    228  1.1.1.1.6.2  yamt     while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) {
    229  1.1.1.1.6.2  yamt         Status = uefi_call_wrapper(BS->GetMemoryMap, 5, &BufferSize, Buffer, MapKey, DescriptorSize, DescriptorVersion);
    230  1.1.1.1.6.2  yamt     }
    231  1.1.1.1.6.2  yamt 
    232  1.1.1.1.6.2  yamt     //
    233  1.1.1.1.6.2  yamt     // Convert buffer size to NoEntries
    234  1.1.1.1.6.2  yamt     //
    235  1.1.1.1.6.2  yamt 
    236  1.1.1.1.6.2  yamt     if (!EFI_ERROR(Status)) {
    237  1.1.1.1.6.2  yamt         *NoEntries = BufferSize / *DescriptorSize;
    238  1.1.1.1.6.2  yamt     }
    239  1.1.1.1.6.2  yamt 
    240  1.1.1.1.6.2  yamt     return Buffer;
    241  1.1.1.1.6.2  yamt }
    242  1.1.1.1.6.2  yamt 
    243  1.1.1.1.6.2  yamt VOID *
    244  1.1.1.1.6.2  yamt LibGetVariableAndSize (
    245  1.1.1.1.6.2  yamt     IN CHAR16               *Name,
    246  1.1.1.1.6.2  yamt     IN EFI_GUID             *VendorGuid,
    247  1.1.1.1.6.2  yamt     OUT UINTN               *VarSize
    248  1.1.1.1.6.2  yamt     )
    249  1.1.1.1.6.2  yamt {
    250  1.1.1.1.6.2  yamt     EFI_STATUS              Status;
    251  1.1.1.1.6.2  yamt     VOID                    *Buffer;
    252  1.1.1.1.6.2  yamt     UINTN                   BufferSize;
    253  1.1.1.1.6.2  yamt 
    254  1.1.1.1.6.2  yamt     //
    255  1.1.1.1.6.2  yamt     // Initialize for GrowBuffer loop
    256  1.1.1.1.6.2  yamt     //
    257  1.1.1.1.6.2  yamt 
    258  1.1.1.1.6.2  yamt     Buffer = NULL;
    259  1.1.1.1.6.2  yamt     BufferSize = 100;
    260  1.1.1.1.6.2  yamt 
    261  1.1.1.1.6.2  yamt     //
    262  1.1.1.1.6.2  yamt     // Call the real function
    263  1.1.1.1.6.2  yamt     //
    264  1.1.1.1.6.2  yamt 
    265  1.1.1.1.6.2  yamt     while (GrowBuffer (&Status, &Buffer, BufferSize)) {
    266  1.1.1.1.6.2  yamt         Status = uefi_call_wrapper(
    267  1.1.1.1.6.2  yamt 		    RT->GetVariable,
    268  1.1.1.1.6.2  yamt 			5,
    269  1.1.1.1.6.2  yamt                     Name,
    270  1.1.1.1.6.2  yamt                     VendorGuid,
    271  1.1.1.1.6.2  yamt                     NULL,
    272  1.1.1.1.6.2  yamt                     &BufferSize,
    273  1.1.1.1.6.2  yamt                     Buffer
    274  1.1.1.1.6.2  yamt                     );
    275  1.1.1.1.6.2  yamt     }
    276  1.1.1.1.6.2  yamt     if (Buffer) {
    277  1.1.1.1.6.2  yamt         *VarSize = BufferSize;
    278  1.1.1.1.6.2  yamt     } else {
    279  1.1.1.1.6.2  yamt         *VarSize = 0;
    280  1.1.1.1.6.2  yamt     }
    281  1.1.1.1.6.2  yamt     return Buffer;
    282  1.1.1.1.6.2  yamt }
    283  1.1.1.1.6.2  yamt 
    284  1.1.1.1.6.2  yamt VOID *
    285  1.1.1.1.6.2  yamt LibGetVariable (
    286  1.1.1.1.6.2  yamt     IN CHAR16               *Name,
    287  1.1.1.1.6.2  yamt     IN EFI_GUID             *VendorGuid
    288  1.1.1.1.6.2  yamt     )
    289  1.1.1.1.6.2  yamt {
    290  1.1.1.1.6.2  yamt     UINTN   VarSize;
    291  1.1.1.1.6.2  yamt 
    292  1.1.1.1.6.2  yamt     return LibGetVariableAndSize (Name, VendorGuid, &VarSize);
    293  1.1.1.1.6.2  yamt }
    294  1.1.1.1.6.2  yamt 
    295  1.1.1.1.6.2  yamt EFI_STATUS
    296  1.1.1.1.6.2  yamt LibDeleteVariable (
    297  1.1.1.1.6.2  yamt     IN CHAR16   *VarName,
    298  1.1.1.1.6.2  yamt     IN EFI_GUID *VarGuid
    299  1.1.1.1.6.2  yamt     )
    300  1.1.1.1.6.2  yamt {
    301  1.1.1.1.6.2  yamt     VOID        *VarBuf;
    302  1.1.1.1.6.2  yamt     EFI_STATUS  Status;
    303  1.1.1.1.6.2  yamt 
    304  1.1.1.1.6.2  yamt     VarBuf = LibGetVariable(VarName,VarGuid);
    305  1.1.1.1.6.2  yamt 
    306  1.1.1.1.6.2  yamt     Status = EFI_NOT_FOUND;
    307  1.1.1.1.6.2  yamt 
    308  1.1.1.1.6.2  yamt     if (VarBuf) {
    309  1.1.1.1.6.2  yamt         //
    310  1.1.1.1.6.2  yamt         // Delete variable from Storage
    311  1.1.1.1.6.2  yamt         //
    312  1.1.1.1.6.2  yamt         Status = uefi_call_wrapper(
    313  1.1.1.1.6.2  yamt 		    RT->SetVariable,
    314  1.1.1.1.6.2  yamt 			5,
    315  1.1.1.1.6.2  yamt                     VarName, VarGuid,
    316  1.1.1.1.6.2  yamt                     EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
    317  1.1.1.1.6.2  yamt                     0, NULL
    318  1.1.1.1.6.2  yamt                  );
    319  1.1.1.1.6.2  yamt         ASSERT (!EFI_ERROR(Status));
    320  1.1.1.1.6.2  yamt         FreePool(VarBuf);
    321  1.1.1.1.6.2  yamt     }
    322  1.1.1.1.6.2  yamt 
    323  1.1.1.1.6.2  yamt     return (Status);
    324  1.1.1.1.6.2  yamt }
    325  1.1.1.1.6.2  yamt 
    326  1.1.1.1.6.2  yamt EFI_STATUS
    327  1.1.1.1.6.2  yamt LibInsertToTailOfBootOrder (
    328  1.1.1.1.6.2  yamt     IN  UINT16  BootOption,
    329  1.1.1.1.6.2  yamt     IN  BOOLEAN OnlyInsertIfEmpty
    330  1.1.1.1.6.2  yamt     )
    331  1.1.1.1.6.2  yamt {
    332  1.1.1.1.6.2  yamt     UINT16      *BootOptionArray;
    333  1.1.1.1.6.2  yamt     UINT16      *NewBootOptionArray;
    334  1.1.1.1.6.2  yamt     UINTN       VarSize;
    335  1.1.1.1.6.2  yamt     UINTN       Index;
    336  1.1.1.1.6.2  yamt     EFI_STATUS  Status;
    337  1.1.1.1.6.2  yamt 
    338  1.1.1.1.6.2  yamt     BootOptionArray = LibGetVariableAndSize (VarBootOrder, &EfiGlobalVariable, &VarSize);
    339  1.1.1.1.6.2  yamt     if (VarSize != 0 && OnlyInsertIfEmpty) {
    340  1.1.1.1.6.2  yamt         if (BootOptionArray) {
    341  1.1.1.1.6.2  yamt             FreePool (BootOptionArray);
    342  1.1.1.1.6.2  yamt         }
    343  1.1.1.1.6.2  yamt         return EFI_UNSUPPORTED;
    344  1.1.1.1.6.2  yamt     }
    345  1.1.1.1.6.2  yamt 
    346  1.1.1.1.6.2  yamt     VarSize += sizeof(UINT16);
    347  1.1.1.1.6.2  yamt     NewBootOptionArray = AllocatePool (VarSize);
    348  1.1.1.1.6.2  yamt 
    349  1.1.1.1.6.2  yamt     for (Index = 0; Index < ((VarSize/sizeof(UINT16)) - 1); Index++) {
    350  1.1.1.1.6.2  yamt         NewBootOptionArray[Index] = BootOptionArray[Index];
    351  1.1.1.1.6.2  yamt     }
    352  1.1.1.1.6.2  yamt     //
    353  1.1.1.1.6.2  yamt     // Insert in the tail of the array
    354  1.1.1.1.6.2  yamt     //
    355  1.1.1.1.6.2  yamt     NewBootOptionArray[Index] = BootOption;
    356  1.1.1.1.6.2  yamt 
    357  1.1.1.1.6.2  yamt     Status = uefi_call_wrapper(
    358  1.1.1.1.6.2  yamt 		RT->SetVariable,
    359  1.1.1.1.6.2  yamt 		5,
    360  1.1.1.1.6.2  yamt                 VarBootOrder, &EfiGlobalVariable,
    361  1.1.1.1.6.2  yamt                 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
    362  1.1.1.1.6.2  yamt                 VarSize, (VOID*) NewBootOptionArray
    363  1.1.1.1.6.2  yamt                 );
    364  1.1.1.1.6.2  yamt 
    365  1.1.1.1.6.2  yamt     if (NewBootOptionArray) {
    366  1.1.1.1.6.2  yamt         FreePool (NewBootOptionArray);
    367  1.1.1.1.6.2  yamt     }
    368  1.1.1.1.6.2  yamt     if (BootOptionArray) {
    369  1.1.1.1.6.2  yamt         FreePool (BootOptionArray);
    370  1.1.1.1.6.2  yamt     }
    371  1.1.1.1.6.2  yamt     return Status;
    372  1.1.1.1.6.2  yamt }
    373  1.1.1.1.6.2  yamt 
    374  1.1.1.1.6.2  yamt 
    375  1.1.1.1.6.2  yamt BOOLEAN
    376  1.1.1.1.6.2  yamt ValidMBR(
    377  1.1.1.1.6.2  yamt     IN  MASTER_BOOT_RECORD  *Mbr,
    378  1.1.1.1.6.2  yamt     IN  EFI_BLOCK_IO        *BlkIo
    379  1.1.1.1.6.2  yamt     )
    380  1.1.1.1.6.2  yamt {
    381  1.1.1.1.6.2  yamt     UINT32      StartingLBA, EndingLBA;
    382  1.1.1.1.6.2  yamt     UINT32      NewEndingLBA;
    383  1.1.1.1.6.2  yamt     INTN        i, j;
    384  1.1.1.1.6.2  yamt     BOOLEAN     ValidMbr;
    385  1.1.1.1.6.2  yamt 
    386  1.1.1.1.6.2  yamt     if (Mbr->Signature != MBR_SIGNATURE) {
    387  1.1.1.1.6.2  yamt         //
    388  1.1.1.1.6.2  yamt         // The BPB also has this signature, so it can not be used alone.
    389  1.1.1.1.6.2  yamt         //
    390  1.1.1.1.6.2  yamt         return FALSE;
    391  1.1.1.1.6.2  yamt     }
    392  1.1.1.1.6.2  yamt 
    393  1.1.1.1.6.2  yamt     ValidMbr = FALSE;
    394  1.1.1.1.6.2  yamt     for (i=0; i<MAX_MBR_PARTITIONS; i++) {
    395  1.1.1.1.6.2  yamt         if ( Mbr->Partition[i].OSIndicator == 0x00 || EXTRACT_UINT32(Mbr->Partition[i].SizeInLBA) == 0 ) {
    396  1.1.1.1.6.2  yamt             continue;
    397  1.1.1.1.6.2  yamt         }
    398  1.1.1.1.6.2  yamt         ValidMbr = TRUE;
    399  1.1.1.1.6.2  yamt         StartingLBA = EXTRACT_UINT32(Mbr->Partition[i].StartingLBA);
    400  1.1.1.1.6.2  yamt         EndingLBA = StartingLBA + EXTRACT_UINT32(Mbr->Partition[i].SizeInLBA) - 1;
    401  1.1.1.1.6.2  yamt         if (EndingLBA > BlkIo->Media->LastBlock) {
    402  1.1.1.1.6.2  yamt             //
    403  1.1.1.1.6.2  yamt             // Compatability Errata:
    404  1.1.1.1.6.2  yamt             //  Some systems try to hide drive space with thier INT 13h driver
    405  1.1.1.1.6.2  yamt             //  This does not hide space from the OS driver. This means the MBR
    406  1.1.1.1.6.2  yamt             //  that gets created from DOS is smaller than the MBR created from
    407  1.1.1.1.6.2  yamt             //  a real OS (NT & Win98). This leads to BlkIo->LastBlock being
    408  1.1.1.1.6.2  yamt             //  wrong on some systems FDISKed by the OS.
    409  1.1.1.1.6.2  yamt             //
    410  1.1.1.1.6.2  yamt             //
    411  1.1.1.1.6.2  yamt             if (BlkIo->Media->LastBlock < MIN_MBR_DEVICE_SIZE) {
    412  1.1.1.1.6.2  yamt                 //
    413  1.1.1.1.6.2  yamt                 // If this is a very small device then trust the BlkIo->LastBlock
    414  1.1.1.1.6.2  yamt                 //
    415  1.1.1.1.6.2  yamt                 return FALSE;
    416  1.1.1.1.6.2  yamt             }
    417  1.1.1.1.6.2  yamt 
    418  1.1.1.1.6.2  yamt             if (EndingLBA > (BlkIo->Media->LastBlock + MBR_ERRATA_PAD)) {
    419  1.1.1.1.6.2  yamt                 return FALSE;
    420  1.1.1.1.6.2  yamt             }
    421  1.1.1.1.6.2  yamt 
    422  1.1.1.1.6.2  yamt         }
    423  1.1.1.1.6.2  yamt         for (j=i+1; j<MAX_MBR_PARTITIONS; j++) {
    424  1.1.1.1.6.2  yamt             if (Mbr->Partition[j].OSIndicator == 0x00 || EXTRACT_UINT32(Mbr->Partition[j].SizeInLBA) == 0) {
    425  1.1.1.1.6.2  yamt                 continue;
    426  1.1.1.1.6.2  yamt             }
    427  1.1.1.1.6.2  yamt             if (   EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) >= StartingLBA &&
    428  1.1.1.1.6.2  yamt                    EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) <= EndingLBA       ) {
    429  1.1.1.1.6.2  yamt                 //
    430  1.1.1.1.6.2  yamt                 // The Start of this region overlaps with the i'th region
    431  1.1.1.1.6.2  yamt                 //
    432  1.1.1.1.6.2  yamt                 return FALSE;
    433  1.1.1.1.6.2  yamt             }
    434  1.1.1.1.6.2  yamt             NewEndingLBA = EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) + EXTRACT_UINT32(Mbr->Partition[j].SizeInLBA) - 1;
    435  1.1.1.1.6.2  yamt             if ( NewEndingLBA >= StartingLBA && NewEndingLBA <= EndingLBA ) {
    436  1.1.1.1.6.2  yamt                 //
    437  1.1.1.1.6.2  yamt                 // The End of this region overlaps with the i'th region
    438  1.1.1.1.6.2  yamt                 //
    439  1.1.1.1.6.2  yamt                 return FALSE;
    440  1.1.1.1.6.2  yamt             }
    441  1.1.1.1.6.2  yamt         }
    442  1.1.1.1.6.2  yamt     }
    443  1.1.1.1.6.2  yamt     //
    444  1.1.1.1.6.2  yamt     // Non of the regions overlapped so MBR is O.K.
    445  1.1.1.1.6.2  yamt     //
    446  1.1.1.1.6.2  yamt     return ValidMbr;
    447  1.1.1.1.6.2  yamt }
    448  1.1.1.1.6.2  yamt 
    449  1.1.1.1.6.2  yamt 
    450  1.1.1.1.6.2  yamt UINT8
    451  1.1.1.1.6.2  yamt DecimaltoBCD(
    452  1.1.1.1.6.2  yamt     IN  UINT8 DecValue
    453  1.1.1.1.6.2  yamt     )
    454  1.1.1.1.6.2  yamt {
    455  1.1.1.1.6.2  yamt     return RtDecimaltoBCD (DecValue);
    456  1.1.1.1.6.2  yamt }
    457  1.1.1.1.6.2  yamt 
    458  1.1.1.1.6.2  yamt 
    459  1.1.1.1.6.2  yamt UINT8
    460  1.1.1.1.6.2  yamt BCDtoDecimal(
    461  1.1.1.1.6.2  yamt     IN  UINT8 BcdValue
    462  1.1.1.1.6.2  yamt     )
    463  1.1.1.1.6.2  yamt {
    464  1.1.1.1.6.2  yamt     return RtBCDtoDecimal (BcdValue);
    465  1.1.1.1.6.2  yamt }
    466  1.1.1.1.6.2  yamt 
    467  1.1.1.1.6.2  yamt EFI_STATUS
    468  1.1.1.1.6.2  yamt LibGetSystemConfigurationTable(
    469  1.1.1.1.6.2  yamt     IN EFI_GUID *TableGuid,
    470  1.1.1.1.6.2  yamt     IN OUT VOID **Table
    471  1.1.1.1.6.2  yamt     )
    472  1.1.1.1.6.2  yamt 
    473  1.1.1.1.6.2  yamt {
    474  1.1.1.1.6.2  yamt     UINTN Index;
    475  1.1.1.1.6.2  yamt 
    476  1.1.1.1.6.2  yamt     for(Index=0;Index<ST->NumberOfTableEntries;Index++) {
    477  1.1.1.1.6.2  yamt         if (CompareGuid(TableGuid,&(ST->ConfigurationTable[Index].VendorGuid))==0) {
    478  1.1.1.1.6.2  yamt             *Table = ST->ConfigurationTable[Index].VendorTable;
    479  1.1.1.1.6.2  yamt             return EFI_SUCCESS;
    480  1.1.1.1.6.2  yamt         }
    481  1.1.1.1.6.2  yamt     }
    482  1.1.1.1.6.2  yamt     return EFI_NOT_FOUND;
    483  1.1.1.1.6.2  yamt }
    484  1.1.1.1.6.2  yamt 
    485  1.1.1.1.6.2  yamt 
    486  1.1.1.1.6.2  yamt CHAR16 *
    487  1.1.1.1.6.2  yamt LibGetUiString (
    488  1.1.1.1.6.2  yamt     IN  EFI_HANDLE      Handle,
    489  1.1.1.1.6.2  yamt     IN  UI_STRING_TYPE  StringType,
    490  1.1.1.1.6.2  yamt     IN  ISO_639_2       *LangCode,
    491  1.1.1.1.6.2  yamt     IN  BOOLEAN         ReturnDevicePathStrOnMismatch
    492  1.1.1.1.6.2  yamt     )
    493  1.1.1.1.6.2  yamt {
    494  1.1.1.1.6.2  yamt     UI_INTERFACE    *Ui;
    495  1.1.1.1.6.2  yamt     UI_STRING_TYPE  Index;
    496  1.1.1.1.6.2  yamt     UI_STRING_ENTRY *Array;
    497  1.1.1.1.6.2  yamt     EFI_STATUS      Status;
    498  1.1.1.1.6.2  yamt 
    499  1.1.1.1.6.2  yamt     Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handle, &UiProtocol, (VOID *)&Ui);
    500  1.1.1.1.6.2  yamt     if (EFI_ERROR(Status)) {
    501  1.1.1.1.6.2  yamt         return (ReturnDevicePathStrOnMismatch) ? DevicePathToStr(DevicePathFromHandle(Handle)) : NULL;
    502  1.1.1.1.6.2  yamt     }
    503  1.1.1.1.6.2  yamt 
    504  1.1.1.1.6.2  yamt     //
    505  1.1.1.1.6.2  yamt     // Skip the first strings
    506  1.1.1.1.6.2  yamt     //
    507  1.1.1.1.6.2  yamt     for (Index = UiDeviceString, Array = Ui->Entry; Index < StringType; Index++, Array++) {
    508  1.1.1.1.6.2  yamt         while (Array->LangCode) {
    509  1.1.1.1.6.2  yamt             Array++;
    510  1.1.1.1.6.2  yamt         }
    511  1.1.1.1.6.2  yamt     }
    512  1.1.1.1.6.2  yamt 
    513  1.1.1.1.6.2  yamt     //
    514  1.1.1.1.6.2  yamt     // Search for the match
    515  1.1.1.1.6.2  yamt     //
    516  1.1.1.1.6.2  yamt     while (Array->LangCode) {
    517  1.1.1.1.6.2  yamt         if (strcmpa (Array->LangCode, LangCode) == 0) {
    518  1.1.1.1.6.2  yamt             return Array->UiString;
    519  1.1.1.1.6.2  yamt         }
    520  1.1.1.1.6.2  yamt     }
    521  1.1.1.1.6.2  yamt     return (ReturnDevicePathStrOnMismatch) ? DevicePathToStr(DevicePathFromHandle(Handle)) : NULL;
    522  1.1.1.1.6.2  yamt }
    523