Home | History | Annotate | Line # | Download | only in lib
init.c revision 1.1.1.1.36.1
      1  1.1.1.1.36.1  christos /*	$NetBSD: init.c,v 1.1.1.1.36.1 2019/06/10 22:08:36 christos 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.1.36.1  christos         LibImageHandle = ImageHandle;
     55  1.1.1.1.36.1  christos 
     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.1.36.1  christos                 BS->HandleProtocol,
     77  1.1.1.1.36.1  christos                 3,
     78  1.1.1.1.36.1  christos                 ImageHandle,
     79  1.1.1.1.36.1  christos                 &LoadedImageProtocol,
     80  1.1.1.1.36.1  christos                 (VOID*)&LoadedImage
     81  1.1.1.1.36.1  christos             );
     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.1.36.1  christos     }
    186  1.1.1.1.36.1  christos }
    187  1.1.1.1.36.1  christos 
    188  1.1.1.1.36.1  christos #if !defined(__NetBSD__)
    189  1.1.1.1.36.1  christos /*
    190  1.1.1.1.36.1  christos  * Calls to memset/memcpy may be emitted implicitly by GCC or MSVC
    191  1.1.1.1.36.1  christos  * even when -ffreestanding or /NODEFAULTLIB are in effect.
    192  1.1.1.1.36.1  christos  */
    193  1.1.1.1.36.1  christos 
    194  1.1.1.1.36.1  christos #ifndef __SIZE_TYPE__
    195  1.1.1.1.36.1  christos #define __SIZE_TYPE__ UINTN
    196  1.1.1.1.36.1  christos #endif
    197  1.1.1.1.36.1  christos 
    198  1.1.1.1.36.1  christos void *memset(void *s, int c, __SIZE_TYPE__ n)
    199  1.1.1.1.36.1  christos {
    200  1.1.1.1.36.1  christos     unsigned char *p = s;
    201  1.1.1.1.36.1  christos 
    202  1.1.1.1.36.1  christos     while (n--)
    203  1.1.1.1.36.1  christos         *p++ = c;
    204  1.1.1.1.36.1  christos 
    205  1.1.1.1.36.1  christos     return s;
    206  1.1.1.1.36.1  christos }
    207  1.1.1.1.36.1  christos 
    208  1.1.1.1.36.1  christos void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n)
    209  1.1.1.1.36.1  christos {
    210  1.1.1.1.36.1  christos     const unsigned char *q = src;
    211  1.1.1.1.36.1  christos     unsigned char *p = dest;
    212  1.1.1.1.36.1  christos 
    213  1.1.1.1.36.1  christos     while (n--)
    214  1.1.1.1.36.1  christos         *p++ = *q++;
    215  1.1.1.1.36.1  christos 
    216  1.1.1.1.36.1  christos     return dest;
    217           1.1  jakllsch }
    218  1.1.1.1.36.1  christos #endif
    219