init.c revision 1.1 1 1.1 jakllsch /* $NetBSD: init.c,v 1.1 2014/04/01 16:16:06 jakllsch 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 jakllsch
55 1.1 jakllsch //
56 1.1 jakllsch // Set up global pointer to the system table, boot services table,
57 1.1 jakllsch // and runtime services table
58 1.1 jakllsch //
59 1.1 jakllsch
60 1.1 jakllsch ST = SystemTable;
61 1.1 jakllsch BS = SystemTable->BootServices;
62 1.1 jakllsch RT = SystemTable->RuntimeServices;
63 1.1 jakllsch // ASSERT (CheckCrc(0, &ST->Hdr));
64 1.1 jakllsch // ASSERT (CheckCrc(0, &BS->Hdr));
65 1.1 jakllsch // ASSERT (CheckCrc(0, &RT->Hdr));
66 1.1 jakllsch
67 1.1 jakllsch
68 1.1 jakllsch //
69 1.1 jakllsch // Initialize pool allocation type
70 1.1 jakllsch //
71 1.1 jakllsch
72 1.1 jakllsch if (ImageHandle) {
73 1.1 jakllsch Status = uefi_call_wrapper(
74 1.1 jakllsch BS->HandleProtocol,
75 1.1 jakllsch 3,
76 1.1 jakllsch ImageHandle,
77 1.1 jakllsch &LoadedImageProtocol,
78 1.1 jakllsch (VOID*)&LoadedImage
79 1.1 jakllsch );
80 1.1 jakllsch
81 1.1 jakllsch if (!EFI_ERROR(Status)) {
82 1.1 jakllsch PoolAllocationType = LoadedImage->ImageDataType;
83 1.1 jakllsch }
84 1.1 jakllsch
85 1.1 jakllsch EFIDebugVariable ();
86 1.1 jakllsch }
87 1.1 jakllsch
88 1.1 jakllsch //
89 1.1 jakllsch // Initialize Guid table
90 1.1 jakllsch //
91 1.1 jakllsch
92 1.1 jakllsch InitializeGuid();
93 1.1 jakllsch
94 1.1 jakllsch InitializeLibPlatform(ImageHandle,SystemTable);
95 1.1 jakllsch }
96 1.1 jakllsch
97 1.1 jakllsch //
98 1.1 jakllsch //
99 1.1 jakllsch //
100 1.1 jakllsch
101 1.1 jakllsch if (ImageHandle && UnicodeInterface == &LibStubUnicodeInterface) {
102 1.1 jakllsch LangCode = LibGetVariable (VarLanguage, &EfiGlobalVariable);
103 1.1 jakllsch InitializeUnicodeSupport (LangCode);
104 1.1 jakllsch if (LangCode) {
105 1.1 jakllsch FreePool (LangCode);
106 1.1 jakllsch }
107 1.1 jakllsch }
108 1.1 jakllsch }
109 1.1 jakllsch
110 1.1 jakllsch VOID
111 1.1 jakllsch InitializeUnicodeSupport (
112 1.1 jakllsch CHAR8 *LangCode
113 1.1 jakllsch )
114 1.1 jakllsch {
115 1.1 jakllsch EFI_UNICODE_COLLATION_INTERFACE *Ui;
116 1.1 jakllsch EFI_STATUS Status;
117 1.1 jakllsch CHAR8 *Languages;
118 1.1 jakllsch UINTN Index, Position, Length;
119 1.1 jakllsch UINTN NoHandles;
120 1.1 jakllsch EFI_HANDLE *Handles;
121 1.1 jakllsch
122 1.1 jakllsch //
123 1.1 jakllsch // If we don't know it, lookup the current language code
124 1.1 jakllsch //
125 1.1 jakllsch
126 1.1 jakllsch LibLocateHandle (ByProtocol, &UnicodeCollationProtocol, NULL, &NoHandles, &Handles);
127 1.1 jakllsch if (!LangCode || !NoHandles) {
128 1.1 jakllsch goto Done;
129 1.1 jakllsch }
130 1.1 jakllsch
131 1.1 jakllsch //
132 1.1 jakllsch // Check all driver's for a matching language code
133 1.1 jakllsch //
134 1.1 jakllsch
135 1.1 jakllsch for (Index=0; Index < NoHandles; Index++) {
136 1.1 jakllsch Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handles[Index], &UnicodeCollationProtocol, (VOID*)&Ui);
137 1.1 jakllsch if (EFI_ERROR(Status)) {
138 1.1 jakllsch continue;
139 1.1 jakllsch }
140 1.1 jakllsch
141 1.1 jakllsch //
142 1.1 jakllsch // Check for a matching language code
143 1.1 jakllsch //
144 1.1 jakllsch
145 1.1 jakllsch Languages = Ui->SupportedLanguages;
146 1.1 jakllsch Length = strlena(Languages);
147 1.1 jakllsch for (Position=0; Position < Length; Position += ISO_639_2_ENTRY_SIZE) {
148 1.1 jakllsch
149 1.1 jakllsch //
150 1.1 jakllsch // If this code matches, use this driver
151 1.1 jakllsch //
152 1.1 jakllsch
153 1.1 jakllsch if (CompareMem (Languages+Position, LangCode, ISO_639_2_ENTRY_SIZE) == 0) {
154 1.1 jakllsch UnicodeInterface = Ui;
155 1.1 jakllsch goto Done;
156 1.1 jakllsch }
157 1.1 jakllsch }
158 1.1 jakllsch }
159 1.1 jakllsch
160 1.1 jakllsch Done:
161 1.1 jakllsch //
162 1.1 jakllsch // Cleanup
163 1.1 jakllsch //
164 1.1 jakllsch
165 1.1 jakllsch if (Handles) {
166 1.1 jakllsch FreePool (Handles);
167 1.1 jakllsch }
168 1.1 jakllsch }
169 1.1 jakllsch
170 1.1 jakllsch VOID
171 1.1 jakllsch EFIDebugVariable (
172 1.1 jakllsch VOID
173 1.1 jakllsch )
174 1.1 jakllsch {
175 1.1 jakllsch EFI_STATUS Status;
176 1.1 jakllsch UINT32 Attributes;
177 1.1 jakllsch UINTN DataSize;
178 1.1 jakllsch UINTN NewEFIDebug;
179 1.1 jakllsch
180 1.1 jakllsch DataSize = sizeof(EFIDebug);
181 1.1 jakllsch Status = uefi_call_wrapper(RT->GetVariable, 5, L"EFIDebug", &EfiGlobalVariable, &Attributes, &DataSize, &NewEFIDebug);
182 1.1 jakllsch if (!EFI_ERROR(Status)) {
183 1.1 jakllsch EFIDebug = NewEFIDebug;
184 1.1 jakllsch }
185 1.1 jakllsch }
186