1 /* $NetBSD: init.c,v 1.1.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