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