1 /*++ 2 3 Copyright (c) 1998 Intel Corporation 4 5 Module Name: 6 7 8 Abstract: 9 10 11 12 13 Revision History 14 15 --*/ 16 17 #include "lib.h" 18 19 VOID 20 EFIDebugVariable ( 21 VOID 22 ); 23 24 VOID 25 InitializeLib ( 26 IN EFI_HANDLE ImageHandle, 27 IN EFI_SYSTEM_TABLE *SystemTable 28 ) 29 /*++ 30 31 Routine Description: 32 33 Initializes EFI library for use 34 35 Arguments: 36 37 Firmware's EFI system table 38 39 Returns: 40 41 None 42 43 --*/ 44 { 45 EFI_LOADED_IMAGE *LoadedImage; 46 EFI_STATUS Status; 47 CHAR8 *LangCode; 48 49 if (!LibInitialized) { 50 LibInitialized = TRUE; 51 LibFwInstance = FALSE; 52 53 // 54 // Set up global pointer to the system table, boot services table, 55 // and runtime services table 56 // 57 58 ST = SystemTable; 59 BS = SystemTable->BootServices; 60 RT = SystemTable->RuntimeServices; 61 // ASSERT (CheckCrc(0, &ST->Hdr)); 62 // ASSERT (CheckCrc(0, &BS->Hdr)); 63 // ASSERT (CheckCrc(0, &RT->Hdr)); 64 65 66 // 67 // Initialize pool allocation type 68 // 69 70 if (ImageHandle) { 71 Status = uefi_call_wrapper( 72 BS->HandleProtocol, 73 3, 74 ImageHandle, 75 &LoadedImageProtocol, 76 (VOID*)&LoadedImage 77 ); 78 79 if (!EFI_ERROR(Status)) { 80 PoolAllocationType = LoadedImage->ImageDataType; 81 } 82 83 EFIDebugVariable (); 84 } 85 86 // 87 // Initialize Guid table 88 // 89 90 InitializeGuid(); 91 92 InitializeLibPlatform(ImageHandle,SystemTable); 93 } 94 95 // 96 // 97 // 98 99 if (ImageHandle && UnicodeInterface == &LibStubUnicodeInterface) { 100 LangCode = LibGetVariable (VarLanguage, &EfiGlobalVariable); 101 InitializeUnicodeSupport (LangCode); 102 if (LangCode) { 103 FreePool (LangCode); 104 } 105 } 106 } 107 108 VOID 109 InitializeUnicodeSupport ( 110 CHAR8 *LangCode 111 ) 112 { 113 EFI_UNICODE_COLLATION_INTERFACE *Ui; 114 EFI_STATUS Status; 115 CHAR8 *Languages; 116 UINTN Index, Position, Length; 117 UINTN NoHandles; 118 EFI_HANDLE *Handles; 119 120 // 121 // If we don't know it, lookup the current language code 122 // 123 124 LibLocateHandle (ByProtocol, &UnicodeCollationProtocol, NULL, &NoHandles, &Handles); 125 if (!LangCode || !NoHandles) { 126 goto Done; 127 } 128 129 // 130 // Check all driver's for a matching language code 131 // 132 133 for (Index=0; Index < NoHandles; Index++) { 134 Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handles[Index], &UnicodeCollationProtocol, (VOID*)&Ui); 135 if (EFI_ERROR(Status)) { 136 continue; 137 } 138 139 // 140 // Check for a matching language code 141 // 142 143 Languages = Ui->SupportedLanguages; 144 Length = strlena(Languages); 145 for (Position=0; Position < Length; Position += ISO_639_2_ENTRY_SIZE) { 146 147 // 148 // If this code matches, use this driver 149 // 150 151 if (CompareMem (Languages+Position, LangCode, ISO_639_2_ENTRY_SIZE) == 0) { 152 UnicodeInterface = Ui; 153 goto Done; 154 } 155 } 156 } 157 158 Done: 159 // 160 // Cleanup 161 // 162 163 if (Handles) { 164 FreePool (Handles); 165 } 166 } 167 168 VOID 169 EFIDebugVariable ( 170 VOID 171 ) 172 { 173 EFI_STATUS Status; 174 UINT32 Attributes; 175 UINTN DataSize; 176 UINTN NewEFIDebug; 177 178 DataSize = sizeof(EFIDebug); 179 Status = uefi_call_wrapper(RT->GetVariable, 5, L"EFIDebug", &EfiGlobalVariable, &Attributes, &DataSize, &NewEFIDebug); 180 if (!EFI_ERROR(Status)) { 181 EFIDebug = NewEFIDebug; 182 } 183 } 184