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