xref: /netbsd-src/sys/external/bsd/gnu-efi/dist/lib/init.c (revision 4c93691ae845efd2c3b8333ddc997c12fad13435)
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