Home | History | Annotate | Line # | Download | only in lib
init.c revision 1.1
      1 /*	$NetBSD: init.c,v 1.1 2014/04/01 16:16:06 jakllsch 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 
     55         //
     56         // Set up global pointer to the system table, boot services table,
     57         // and runtime services table
     58         //
     59 
     60         ST = SystemTable;
     61         BS = SystemTable->BootServices;
     62         RT = SystemTable->RuntimeServices;
     63 //        ASSERT (CheckCrc(0, &ST->Hdr));
     64 //        ASSERT (CheckCrc(0, &BS->Hdr));
     65 //        ASSERT (CheckCrc(0, &RT->Hdr));
     66 
     67 
     68         //
     69         // Initialize pool allocation type
     70         //
     71 
     72         if (ImageHandle) {
     73             Status = uefi_call_wrapper(
     74 			    BS->HandleProtocol,
     75 				3,
     76                             ImageHandle,
     77                             &LoadedImageProtocol,
     78                             (VOID*)&LoadedImage
     79                             );
     80 
     81             if (!EFI_ERROR(Status)) {
     82                 PoolAllocationType = LoadedImage->ImageDataType;
     83             }
     84 
     85             EFIDebugVariable ();
     86         }
     87 
     88         //
     89         // Initialize Guid table
     90         //
     91 
     92         InitializeGuid();
     93 
     94         InitializeLibPlatform(ImageHandle,SystemTable);
     95     }
     96 
     97     //
     98     //
     99     //
    100 
    101     if (ImageHandle && UnicodeInterface == &LibStubUnicodeInterface) {
    102         LangCode = LibGetVariable (VarLanguage, &EfiGlobalVariable);
    103         InitializeUnicodeSupport (LangCode);
    104         if (LangCode) {
    105             FreePool (LangCode);
    106         }
    107     }
    108 }
    109 
    110 VOID
    111 InitializeUnicodeSupport (
    112     CHAR8 *LangCode
    113     )
    114 {
    115     EFI_UNICODE_COLLATION_INTERFACE *Ui;
    116     EFI_STATUS                      Status;
    117     CHAR8                           *Languages;
    118     UINTN                           Index, Position, Length;
    119     UINTN                           NoHandles;
    120     EFI_HANDLE                      *Handles;
    121 
    122     //
    123     // If we don't know it, lookup the current language code
    124     //
    125 
    126     LibLocateHandle (ByProtocol, &UnicodeCollationProtocol, NULL, &NoHandles, &Handles);
    127     if (!LangCode || !NoHandles) {
    128         goto Done;
    129     }
    130 
    131     //
    132     // Check all driver's for a matching language code
    133     //
    134 
    135     for (Index=0; Index < NoHandles; Index++) {
    136         Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handles[Index], &UnicodeCollationProtocol, (VOID*)&Ui);
    137         if (EFI_ERROR(Status)) {
    138             continue;
    139         }
    140 
    141         //
    142         // Check for a matching language code
    143         //
    144 
    145         Languages = Ui->SupportedLanguages;
    146         Length = strlena(Languages);
    147         for (Position=0; Position < Length; Position += ISO_639_2_ENTRY_SIZE) {
    148 
    149             //
    150             // If this code matches, use this driver
    151             //
    152 
    153             if (CompareMem (Languages+Position, LangCode, ISO_639_2_ENTRY_SIZE) == 0) {
    154                 UnicodeInterface = Ui;
    155                 goto Done;
    156             }
    157         }
    158     }
    159 
    160 Done:
    161     //
    162     // Cleanup
    163     //
    164 
    165     if (Handles) {
    166         FreePool (Handles);
    167     }
    168 }
    169 
    170 VOID
    171 EFIDebugVariable (
    172     VOID
    173     )
    174 {
    175     EFI_STATUS      Status;
    176     UINT32          Attributes;
    177     UINTN           DataSize;
    178     UINTN           NewEFIDebug;
    179 
    180     DataSize = sizeof(EFIDebug);
    181     Status = uefi_call_wrapper(RT->GetVariable, 5, L"EFIDebug", &EfiGlobalVariable, &Attributes, &DataSize, &NewEFIDebug);
    182     if (!EFI_ERROR(Status)) {
    183         EFIDebug = NewEFIDebug;
    184     }
    185 }
    186