3 Copyright (c) 1998 Intel Corporation
26 IN EFI_HANDLE ImageHandle
,
27 IN EFI_SYSTEM_TABLE
*SystemTable
33 Initializes EFI library for use
37 Firmware's EFI system table
45 EFI_LOADED_IMAGE
*LoadedImage
;
49 if (!LibInitialized
) {
50 LibInitialized
= TRUE
;
51 LibFwInstance
= FALSE
;
52 LibImageHandle
= ImageHandle
;
56 // Set up global pointer to the system table, boot services table,
57 // and runtime services table
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));
69 // Initialize pool allocation type
73 Status
= uefi_call_wrapper(
81 if (!EFI_ERROR(Status
)) {
82 PoolAllocationType
= LoadedImage
->ImageDataType
;
88 // Initialize Guid table
93 InitializeLibPlatform(ImageHandle
,SystemTable
);
100 if (ImageHandle
&& UnicodeInterface
== &LibStubUnicodeInterface
) {
101 LangCode
= LibGetVariable (VarLanguage
, &EfiGlobalVariable
);
102 InitializeUnicodeSupport (LangCode
);
109 #define strlen(s1) __builtin_strlen(s1)
112 InitializeUnicodeSupport (
116 EFI_UNICODE_COLLATION_INTERFACE
*Ui
;
119 UINTN Index
, Position
, Length
;
124 // If we don't know it, lookup the current language code
127 LibLocateHandle (ByProtocol
, &UnicodeCollationProtocol
, NULL
, &NoHandles
, &Handles
);
128 if (!LangCode
|| !NoHandles
) {
133 // Check all driver's for a matching language code
136 for (Index
=0; Index
< NoHandles
; Index
++) {
137 Status
= uefi_call_wrapper(BS
->HandleProtocol
, 3, Handles
[Index
], &UnicodeCollationProtocol
, (VOID
*)&Ui
);
138 if (EFI_ERROR(Status
)) {
143 // Check for a matching language code
146 Languages
= Ui
->SupportedLanguages
;
147 Length
= strlen(Languages
);
148 for (Position
=0; Position
< Length
; Position
+= ISO_639_2_ENTRY_SIZE
) {
151 // If this code matches, use this driver
154 if (CompareMem (Languages
+Position
, LangCode
, ISO_639_2_ENTRY_SIZE
) == 0) {
155 UnicodeInterface
= Ui
;
181 DataSize
= sizeof(EFIDebug
);
182 Status
= uefi_call_wrapper(RT
->GetVariable
, 5, L
"EFIDebug", &EfiGlobalVariable
, &Attributes
, &DataSize
, &NewEFIDebug
);
183 if (!EFI_ERROR(Status
)) {
184 EFIDebug
= NewEFIDebug
;
189 * Calls to memset/memcpy may be emitted implicitly by GCC or MSVC
190 * even when -ffreestanding or /NODEFAULTLIB are in effect.
193 #ifndef __SIZE_TYPE__
194 #define __SIZE_TYPE__ UINTN
197 void *memset(void *s
, int c
, __SIZE_TYPE__ n
)
199 unsigned char *p
= s
;
207 void *memcpy(void *dest
, const void *src
, __SIZE_TYPE__ n
)
209 const unsigned char *q
= src
;
210 unsigned char *p
= dest
;