1 /* $NetBSD: init.c,v 1.2 2018/08/16 18:25:45 jmcneill 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
InitializeLib(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)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 LibImageHandle = ImageHandle;
55
56
57 //
58 // Set up global pointer to the system table, boot services table,
59 // and runtime services table
60 //
61
62 ST = SystemTable;
63 BS = SystemTable->BootServices;
64 RT = SystemTable->RuntimeServices;
65 // ASSERT (CheckCrc(0, &ST->Hdr));
66 // ASSERT (CheckCrc(0, &BS->Hdr));
67 // ASSERT (CheckCrc(0, &RT->Hdr));
68
69
70 //
71 // Initialize pool allocation type
72 //
73
74 if (ImageHandle) {
75 Status = uefi_call_wrapper(
76 BS->HandleProtocol,
77 3,
78 ImageHandle,
79 &LoadedImageProtocol,
80 (VOID*)&LoadedImage
81 );
82
83 if (!EFI_ERROR(Status)) {
84 PoolAllocationType = LoadedImage->ImageDataType;
85 }
86 EFIDebugVariable ();
87 }
88
89 //
90 // Initialize Guid table
91 //
92
93 InitializeGuid();
94
95 InitializeLibPlatform(ImageHandle,SystemTable);
96 }
97
98 //
99 //
100 //
101
102 if (ImageHandle && UnicodeInterface == &LibStubUnicodeInterface) {
103 LangCode = LibGetVariable (VarLanguage, &EfiGlobalVariable);
104 InitializeUnicodeSupport (LangCode);
105 if (LangCode) {
106 FreePool (LangCode);
107 }
108 }
109 }
110
111 VOID
InitializeUnicodeSupport(CHAR8 * LangCode)112 InitializeUnicodeSupport (
113 CHAR8 *LangCode
114 )
115 {
116 EFI_UNICODE_COLLATION_INTERFACE *Ui;
117 EFI_STATUS Status;
118 CHAR8 *Languages;
119 UINTN Index, Position, Length;
120 UINTN NoHandles;
121 EFI_HANDLE *Handles;
122
123 //
124 // If we don't know it, lookup the current language code
125 //
126
127 LibLocateHandle (ByProtocol, &UnicodeCollationProtocol, NULL, &NoHandles, &Handles);
128 if (!LangCode || !NoHandles) {
129 goto Done;
130 }
131
132 //
133 // Check all driver's for a matching language code
134 //
135
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)) {
139 continue;
140 }
141
142 //
143 // Check for a matching language code
144 //
145
146 Languages = Ui->SupportedLanguages;
147 Length = strlena(Languages);
148 for (Position=0; Position < Length; Position += ISO_639_2_ENTRY_SIZE) {
149
150 //
151 // If this code matches, use this driver
152 //
153
154 if (CompareMem (Languages+Position, LangCode, ISO_639_2_ENTRY_SIZE) == 0) {
155 UnicodeInterface = Ui;
156 goto Done;
157 }
158 }
159 }
160
161 Done:
162 //
163 // Cleanup
164 //
165
166 if (Handles) {
167 FreePool (Handles);
168 }
169 }
170
171 VOID
EFIDebugVariable(VOID)172 EFIDebugVariable (
173 VOID
174 )
175 {
176 EFI_STATUS Status;
177 UINT32 Attributes;
178 UINTN DataSize;
179 UINTN NewEFIDebug;
180
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;
185 }
186 }
187
188 #if !defined(__NetBSD__)
189 /*
190 * Calls to memset/memcpy may be emitted implicitly by GCC or MSVC
191 * even when -ffreestanding or /NODEFAULTLIB are in effect.
192 */
193
194 #ifndef __SIZE_TYPE__
195 #define __SIZE_TYPE__ UINTN
196 #endif
197
memset(void * s,int c,__SIZE_TYPE__ n)198 void *memset(void *s, int c, __SIZE_TYPE__ n)
199 {
200 unsigned char *p = s;
201
202 while (n--)
203 *p++ = c;
204
205 return s;
206 }
207
memcpy(void * dest,const void * src,__SIZE_TYPE__ n)208 void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n)
209 {
210 const unsigned char *q = src;
211 unsigned char *p = dest;
212
213 while (n--)
214 *p++ = *q++;
215
216 return dest;
217 }
218 #endif
219