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