Home | History | Annotate | Line # | Download | only in lib
      1 /*	$NetBSD: init.c,v 1.2 2018/08/16 18:25:45 jmcneill Exp $	*/
      2 
      3 /*++
      4 
      5 Copyright (c) 1998  Intel Corporation
      6 
      7 Module Name:
      8 
      9 
     10 Abstract:
     11 
     12 
     13 
     14 
     15 Revision History
     16 
     17 --*/
     18 
     19 #include "lib.h"
     20 
     21 VOID
     22 EFIDebugVariable (
     23     VOID
     24     );
     25 
     26 VOID
     27 InitializeLib (
     28     IN EFI_HANDLE           ImageHandle,
     29     IN EFI_SYSTEM_TABLE     *SystemTable
     30     )
     31 /*++
     32 
     33 Routine Description:
     34 
     35     Initializes EFI library for use
     36 
     37 Arguments:
     38 
     39     Firmware's EFI system table
     40 
     41 Returns:
     42 
     43     None
     44 
     45 --*/
     46 {
     47     EFI_LOADED_IMAGE        *LoadedImage;
     48     EFI_STATUS              Status;
     49     CHAR8                   *LangCode;
     50 
     51     if (!LibInitialized) {
     52         LibInitialized = TRUE;
     53         LibFwInstance = FALSE;
     54         LibImageHandle = ImageHandle;
     55 
     56 
     57         //
     58         // Set up global pointer to the system table, boot services table,
     59         // and runtime services table
     60         //
     61 
     62         ST = SystemTable;
     63         BS = SystemTable->BootServices;
     64         RT = SystemTable->RuntimeServices;
     65 //        ASSERT (CheckCrc(0, &ST->Hdr));
     66 //        ASSERT (CheckCrc(0, &BS->Hdr));
     67 //        ASSERT (CheckCrc(0, &RT->Hdr));
     68 
     69 
     70         //
     71         // Initialize pool allocation type
     72         //
     73 
     74         if (ImageHandle) {
     75             Status = uefi_call_wrapper(
     76                 BS->HandleProtocol,
     77                 3,
     78                 ImageHandle,
     79                 &LoadedImageProtocol,
     80                 (VOID*)&LoadedImage
     81             );
     82 
     83             if (!EFI_ERROR(Status)) {
     84                 PoolAllocationType = LoadedImage->ImageDataType;
     85             }
     86             EFIDebugVariable ();
     87         }
     88 
     89         //
     90         // Initialize Guid table
     91         //
     92 
     93         InitializeGuid();
     94 
     95         InitializeLibPlatform(ImageHandle,SystemTable);
     96     }
     97 
     98     //
     99     //
    100     //
    101 
    102     if (ImageHandle && UnicodeInterface == &LibStubUnicodeInterface) {
    103         LangCode = LibGetVariable (VarLanguage, &EfiGlobalVariable);
    104         InitializeUnicodeSupport (LangCode);
    105         if (LangCode) {
    106             FreePool (LangCode);
    107         }
    108     }
    109 }
    110 
    111 VOID
    112 InitializeUnicodeSupport (
    113     CHAR8 *LangCode
    114     )
    115 {
    116     EFI_UNICODE_COLLATION_INTERFACE *Ui;
    117     EFI_STATUS                      Status;
    118     CHAR8                           *Languages;
    119     UINTN                           Index, Position, Length;
    120     UINTN                           NoHandles;
    121     EFI_HANDLE                      *Handles;
    122 
    123     //
    124     // If we don't know it, lookup the current language code
    125     //
    126 
    127     LibLocateHandle (ByProtocol, &UnicodeCollationProtocol, NULL, &NoHandles, &Handles);
    128     if (!LangCode || !NoHandles) {
    129         goto Done;
    130     }
    131 
    132     //
    133     // Check all driver's for a matching language code
    134     //
    135 
    136     for (Index=0; Index < NoHandles; Index++) {
    137         Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handles[Index], &UnicodeCollationProtocol, (VOID*)&Ui);
    138         if (EFI_ERROR(Status)) {
    139             continue;
    140         }
    141 
    142         //
    143         // Check for a matching language code
    144         //
    145 
    146         Languages = Ui->SupportedLanguages;
    147         Length = strlena(Languages);
    148         for (Position=0; Position < Length; Position += ISO_639_2_ENTRY_SIZE) {
    149 
    150             //
    151             // If this code matches, use this driver
    152             //
    153 
    154             if (CompareMem (Languages+Position, LangCode, ISO_639_2_ENTRY_SIZE) == 0) {
    155                 UnicodeInterface = Ui;
    156                 goto Done;
    157             }
    158         }
    159     }
    160 
    161 Done:
    162     //
    163     // Cleanup
    164     //
    165 
    166     if (Handles) {
    167         FreePool (Handles);
    168     }
    169 }
    170 
    171 VOID
    172 EFIDebugVariable (
    173     VOID
    174     )
    175 {
    176     EFI_STATUS      Status;
    177     UINT32          Attributes;
    178     UINTN           DataSize;
    179     UINTN           NewEFIDebug;
    180 
    181     DataSize = sizeof(EFIDebug);
    182     Status = uefi_call_wrapper(RT->GetVariable, 5, L"EFIDebug", &EfiGlobalVariable, &Attributes, &DataSize, &NewEFIDebug);
    183     if (!EFI_ERROR(Status)) {
    184         EFIDebug = NewEFIDebug;
    185     }
    186 }
    187 
    188 #if !defined(__NetBSD__)
    189 /*
    190  * Calls to memset/memcpy may be emitted implicitly by GCC or MSVC
    191  * even when -ffreestanding or /NODEFAULTLIB are in effect.
    192  */
    193 
    194 #ifndef __SIZE_TYPE__
    195 #define __SIZE_TYPE__ UINTN
    196 #endif
    197 
    198 void *memset(void *s, int c, __SIZE_TYPE__ n)
    199 {
    200     unsigned char *p = s;
    201 
    202     while (n--)
    203         *p++ = c;
    204 
    205     return s;
    206 }
    207 
    208 void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n)
    209 {
    210     const unsigned char *q = src;
    211     unsigned char *p = dest;
    212 
    213     while (n--)
    214         *p++ = *q++;
    215 
    216     return dest;
    217 }
    218 #endif
    219