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