init.c revision 1.1.1.1.6.2 1 1.1.1.1.6.2 yamt /* $NetBSD: init.c,v 1.1.1.1.6.2 2014/05/22 11:40:58 yamt Exp $ */
2 1.1.1.1.6.2 yamt
3 1.1.1.1.6.2 yamt /*++
4 1.1.1.1.6.2 yamt
5 1.1.1.1.6.2 yamt Copyright (c) 1998 Intel Corporation
6 1.1.1.1.6.2 yamt
7 1.1.1.1.6.2 yamt Module Name:
8 1.1.1.1.6.2 yamt
9 1.1.1.1.6.2 yamt
10 1.1.1.1.6.2 yamt Abstract:
11 1.1.1.1.6.2 yamt
12 1.1.1.1.6.2 yamt
13 1.1.1.1.6.2 yamt
14 1.1.1.1.6.2 yamt
15 1.1.1.1.6.2 yamt Revision History
16 1.1.1.1.6.2 yamt
17 1.1.1.1.6.2 yamt --*/
18 1.1.1.1.6.2 yamt
19 1.1.1.1.6.2 yamt #include "lib.h"
20 1.1.1.1.6.2 yamt
21 1.1.1.1.6.2 yamt VOID
22 1.1.1.1.6.2 yamt EFIDebugVariable (
23 1.1.1.1.6.2 yamt VOID
24 1.1.1.1.6.2 yamt );
25 1.1.1.1.6.2 yamt
26 1.1.1.1.6.2 yamt VOID
27 1.1.1.1.6.2 yamt InitializeLib (
28 1.1.1.1.6.2 yamt IN EFI_HANDLE ImageHandle,
29 1.1.1.1.6.2 yamt IN EFI_SYSTEM_TABLE *SystemTable
30 1.1.1.1.6.2 yamt )
31 1.1.1.1.6.2 yamt /*++
32 1.1.1.1.6.2 yamt
33 1.1.1.1.6.2 yamt Routine Description:
34 1.1.1.1.6.2 yamt
35 1.1.1.1.6.2 yamt Initializes EFI library for use
36 1.1.1.1.6.2 yamt
37 1.1.1.1.6.2 yamt Arguments:
38 1.1.1.1.6.2 yamt
39 1.1.1.1.6.2 yamt Firmware's EFI system table
40 1.1.1.1.6.2 yamt
41 1.1.1.1.6.2 yamt Returns:
42 1.1.1.1.6.2 yamt
43 1.1.1.1.6.2 yamt None
44 1.1.1.1.6.2 yamt
45 1.1.1.1.6.2 yamt --*/
46 1.1.1.1.6.2 yamt {
47 1.1.1.1.6.2 yamt EFI_LOADED_IMAGE *LoadedImage;
48 1.1.1.1.6.2 yamt EFI_STATUS Status;
49 1.1.1.1.6.2 yamt CHAR8 *LangCode;
50 1.1.1.1.6.2 yamt
51 1.1.1.1.6.2 yamt if (!LibInitialized) {
52 1.1.1.1.6.2 yamt LibInitialized = TRUE;
53 1.1.1.1.6.2 yamt LibFwInstance = FALSE;
54 1.1.1.1.6.2 yamt
55 1.1.1.1.6.2 yamt //
56 1.1.1.1.6.2 yamt // Set up global pointer to the system table, boot services table,
57 1.1.1.1.6.2 yamt // and runtime services table
58 1.1.1.1.6.2 yamt //
59 1.1.1.1.6.2 yamt
60 1.1.1.1.6.2 yamt ST = SystemTable;
61 1.1.1.1.6.2 yamt BS = SystemTable->BootServices;
62 1.1.1.1.6.2 yamt RT = SystemTable->RuntimeServices;
63 1.1.1.1.6.2 yamt // ASSERT (CheckCrc(0, &ST->Hdr));
64 1.1.1.1.6.2 yamt // ASSERT (CheckCrc(0, &BS->Hdr));
65 1.1.1.1.6.2 yamt // ASSERT (CheckCrc(0, &RT->Hdr));
66 1.1.1.1.6.2 yamt
67 1.1.1.1.6.2 yamt
68 1.1.1.1.6.2 yamt //
69 1.1.1.1.6.2 yamt // Initialize pool allocation type
70 1.1.1.1.6.2 yamt //
71 1.1.1.1.6.2 yamt
72 1.1.1.1.6.2 yamt if (ImageHandle) {
73 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(
74 1.1.1.1.6.2 yamt BS->HandleProtocol,
75 1.1.1.1.6.2 yamt 3,
76 1.1.1.1.6.2 yamt ImageHandle,
77 1.1.1.1.6.2 yamt &LoadedImageProtocol,
78 1.1.1.1.6.2 yamt (VOID*)&LoadedImage
79 1.1.1.1.6.2 yamt );
80 1.1.1.1.6.2 yamt
81 1.1.1.1.6.2 yamt if (!EFI_ERROR(Status)) {
82 1.1.1.1.6.2 yamt PoolAllocationType = LoadedImage->ImageDataType;
83 1.1.1.1.6.2 yamt }
84 1.1.1.1.6.2 yamt
85 1.1.1.1.6.2 yamt EFIDebugVariable ();
86 1.1.1.1.6.2 yamt }
87 1.1.1.1.6.2 yamt
88 1.1.1.1.6.2 yamt //
89 1.1.1.1.6.2 yamt // Initialize Guid table
90 1.1.1.1.6.2 yamt //
91 1.1.1.1.6.2 yamt
92 1.1.1.1.6.2 yamt InitializeGuid();
93 1.1.1.1.6.2 yamt
94 1.1.1.1.6.2 yamt InitializeLibPlatform(ImageHandle,SystemTable);
95 1.1.1.1.6.2 yamt }
96 1.1.1.1.6.2 yamt
97 1.1.1.1.6.2 yamt //
98 1.1.1.1.6.2 yamt //
99 1.1.1.1.6.2 yamt //
100 1.1.1.1.6.2 yamt
101 1.1.1.1.6.2 yamt if (ImageHandle && UnicodeInterface == &LibStubUnicodeInterface) {
102 1.1.1.1.6.2 yamt LangCode = LibGetVariable (VarLanguage, &EfiGlobalVariable);
103 1.1.1.1.6.2 yamt InitializeUnicodeSupport (LangCode);
104 1.1.1.1.6.2 yamt if (LangCode) {
105 1.1.1.1.6.2 yamt FreePool (LangCode);
106 1.1.1.1.6.2 yamt }
107 1.1.1.1.6.2 yamt }
108 1.1.1.1.6.2 yamt }
109 1.1.1.1.6.2 yamt
110 1.1.1.1.6.2 yamt VOID
111 1.1.1.1.6.2 yamt InitializeUnicodeSupport (
112 1.1.1.1.6.2 yamt CHAR8 *LangCode
113 1.1.1.1.6.2 yamt )
114 1.1.1.1.6.2 yamt {
115 1.1.1.1.6.2 yamt EFI_UNICODE_COLLATION_INTERFACE *Ui;
116 1.1.1.1.6.2 yamt EFI_STATUS Status;
117 1.1.1.1.6.2 yamt CHAR8 *Languages;
118 1.1.1.1.6.2 yamt UINTN Index, Position, Length;
119 1.1.1.1.6.2 yamt UINTN NoHandles;
120 1.1.1.1.6.2 yamt EFI_HANDLE *Handles;
121 1.1.1.1.6.2 yamt
122 1.1.1.1.6.2 yamt //
123 1.1.1.1.6.2 yamt // If we don't know it, lookup the current language code
124 1.1.1.1.6.2 yamt //
125 1.1.1.1.6.2 yamt
126 1.1.1.1.6.2 yamt LibLocateHandle (ByProtocol, &UnicodeCollationProtocol, NULL, &NoHandles, &Handles);
127 1.1.1.1.6.2 yamt if (!LangCode || !NoHandles) {
128 1.1.1.1.6.2 yamt goto Done;
129 1.1.1.1.6.2 yamt }
130 1.1.1.1.6.2 yamt
131 1.1.1.1.6.2 yamt //
132 1.1.1.1.6.2 yamt // Check all driver's for a matching language code
133 1.1.1.1.6.2 yamt //
134 1.1.1.1.6.2 yamt
135 1.1.1.1.6.2 yamt for (Index=0; Index < NoHandles; Index++) {
136 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handles[Index], &UnicodeCollationProtocol, (VOID*)&Ui);
137 1.1.1.1.6.2 yamt if (EFI_ERROR(Status)) {
138 1.1.1.1.6.2 yamt continue;
139 1.1.1.1.6.2 yamt }
140 1.1.1.1.6.2 yamt
141 1.1.1.1.6.2 yamt //
142 1.1.1.1.6.2 yamt // Check for a matching language code
143 1.1.1.1.6.2 yamt //
144 1.1.1.1.6.2 yamt
145 1.1.1.1.6.2 yamt Languages = Ui->SupportedLanguages;
146 1.1.1.1.6.2 yamt Length = strlena(Languages);
147 1.1.1.1.6.2 yamt for (Position=0; Position < Length; Position += ISO_639_2_ENTRY_SIZE) {
148 1.1.1.1.6.2 yamt
149 1.1.1.1.6.2 yamt //
150 1.1.1.1.6.2 yamt // If this code matches, use this driver
151 1.1.1.1.6.2 yamt //
152 1.1.1.1.6.2 yamt
153 1.1.1.1.6.2 yamt if (CompareMem (Languages+Position, LangCode, ISO_639_2_ENTRY_SIZE) == 0) {
154 1.1.1.1.6.2 yamt UnicodeInterface = Ui;
155 1.1.1.1.6.2 yamt goto Done;
156 1.1.1.1.6.2 yamt }
157 1.1.1.1.6.2 yamt }
158 1.1.1.1.6.2 yamt }
159 1.1.1.1.6.2 yamt
160 1.1.1.1.6.2 yamt Done:
161 1.1.1.1.6.2 yamt //
162 1.1.1.1.6.2 yamt // Cleanup
163 1.1.1.1.6.2 yamt //
164 1.1.1.1.6.2 yamt
165 1.1.1.1.6.2 yamt if (Handles) {
166 1.1.1.1.6.2 yamt FreePool (Handles);
167 1.1.1.1.6.2 yamt }
168 1.1.1.1.6.2 yamt }
169 1.1.1.1.6.2 yamt
170 1.1.1.1.6.2 yamt VOID
171 1.1.1.1.6.2 yamt EFIDebugVariable (
172 1.1.1.1.6.2 yamt VOID
173 1.1.1.1.6.2 yamt )
174 1.1.1.1.6.2 yamt {
175 1.1.1.1.6.2 yamt EFI_STATUS Status;
176 1.1.1.1.6.2 yamt UINT32 Attributes;
177 1.1.1.1.6.2 yamt UINTN DataSize;
178 1.1.1.1.6.2 yamt UINTN NewEFIDebug;
179 1.1.1.1.6.2 yamt
180 1.1.1.1.6.2 yamt DataSize = sizeof(EFIDebug);
181 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(RT->GetVariable, 5, L"EFIDebug", &EfiGlobalVariable, &Attributes, &DataSize, &NewEFIDebug);
182 1.1.1.1.6.2 yamt if (!EFI_ERROR(Status)) {
183 1.1.1.1.6.2 yamt EFIDebug = NewEFIDebug;
184 1.1.1.1.6.2 yamt }
185 1.1.1.1.6.2 yamt }
186