Update Shell hot fix patch to integrate a fix to solve "CHAR8" compatibility issue...
[mirror_edk2.git] / EdkShellPkg / ShellHotFix.patch
1 Index: drivers/drivers.c
2 ===================================================================
3 --- drivers/drivers.c (revision 30)
4 +++ drivers/drivers.c (working copy)
5 @@ -130,6 +130,7 @@
6 UINTN StringIndex;
7 UINTN Index;
8 CHAR8 *Language;
9 + CHAR8 *PlatformLanguage;
10 UINTN DriverImageHandleCount;
11 EFI_HANDLE *DriverImageHandleBuffer;
12 UINTN HandleIndex;
13 @@ -152,6 +153,7 @@
14 SHELL_VAR_CHECK_PACKAGE ChkPck;
15
16 Language = NULL;
17 + PlatformLanguage = NULL;
18 DriverImageHandleCount = 0;
19 DriverImageHandleBuffer = NULL;
20 IsHelp = FALSE;
21 @@ -241,7 +243,7 @@
22 goto Done;
23 }
24
25 - Language = LibGetVariableLang ();
26 + Language = LibGetVariable (L"Lang", &gEfiGlobalVariableGuid);
27 if (Language == NULL) {
28 Language = (CHAR8 *)AllocateZeroPool(strlena(LanguageCodeEnglish) + 1);
29 if (Language == NULL) {
30 @@ -250,6 +252,15 @@
31 strcpya(Language, LanguageCodeEnglish);
32 }
33
34 + PlatformLanguage = LibGetVariable (L"PlatformLang", &gEfiGlobalVariableGuid);
35 + if (PlatformLanguage == NULL) {
36 + PlatformLanguage = (CHAR8 *)AllocateZeroPool(strlena(PlatformLanguageCodeEnglish) + 1);
37 + if (PlatformLanguage == NULL) {
38 + return EFI_OUT_OF_RESOURCES;
39 + }
40 + strcpya(PlatformLanguage, PlatformLanguageCodeEnglish);
41 + }
42 +
43 Item = LibCheckVarGetFlag (&ChkPck, L"-l");
44 if (Item) {
45 if (Language != NULL) {
46 @@ -314,14 +325,6 @@
47 EFI_OPEN_PROTOCOL_GET_PROTOCOL
48 );
49
50 - ComponentName = NULL;
51 - ComponentName2 = NULL;
52 - Status = LibGetComponentNameProtocol (
53 - DriverImageHandleBuffer[Index],
54 - &ComponentName,
55 - &ComponentName2
56 - );
57 -
58 DiagnosticsStatus = BS->OpenProtocol (
59 DriverImageHandleBuffer[Index],
60 &gEfiDriverDiagnostics2ProtocolGuid,
61 @@ -418,37 +421,73 @@
62 } else {
63 PrintToken (STRING_TOKEN (STR_SHELLENV_PROTID_ONE_VAR_D), HiiHandle, NumberOfChildren);
64 }
65 -
66 - Status = EFI_SUCCESS;
67 +
68 DriverName = L"<UNKNOWN>";
69 - SupportedLanguage = NULL;
70 - if (ComponentName != NULL) {
71 - if (ComponentName->GetDriverName != NULL) {
72 - SupportedLanguage = LibConvertSupportedLanguage (ComponentName->SupportedLanguages, Language);
73 + Status = BS->OpenProtocol (
74 + DriverImageHandleBuffer[Index],
75 + &gEfiComponentName2ProtocolGuid,
76 + (VOID **) &ComponentName2,
77 + NULL,
78 + NULL,
79 + EFI_OPEN_PROTOCOL_GET_PROTOCOL
80 + );
81 + if (!EFI_ERROR (Status)) {
82 + //
83 + // Driver has Component Name 2 Protocol is available, we get the
84 + // driver name var RFC 3066 language code
85 + //
86 + Status = ComponentName2->GetDriverName (
87 + ComponentName2,
88 + PlatformLanguage,
89 + &DriverName
90 + );
91 + if (EFI_ERROR (Status)) {
92 + //
93 + // Current RFC3066 language code fails, we then extract the supported
94 + // language from Component Name 2 protocol interface.
95 + //
96 + SupportedLanguage = ExtractSupportedLanguage(ComponentName2->SupportedLanguages, Language);
97 + if (SupportedLanguage != NULL) {
98 + Status = ComponentName2->GetDriverName (
99 + ComponentName2,
100 + SupportedLanguage,
101 + &DriverName
102 + );
103 + FreePool(SupportedLanguage);
104 + }
105 + }
106 + }
107 + if (EFI_ERROR (Status)) {
108 + //
109 + // In case Component Name 2 protocol is not available or some error occurs
110 + // when getting driver name from Component Name 2 protocol, we get driver
111 + // name from Component Name protocol.
112 + //
113 + Status = BS->OpenProtocol (
114 + DriverImageHandleBuffer[Index],
115 + &gEfiComponentNameProtocolGuid,
116 + (VOID **) &ComponentName,
117 + NULL,
118 + NULL,
119 + EFI_OPEN_PROTOCOL_GET_PROTOCOL
120 + );
121 + if (!EFI_ERROR (Status)) {
122 Status = ComponentName->GetDriverName (
123 ComponentName,
124 - SupportedLanguage,
125 + Language,
126 &DriverName
127 );
128 }
129 - } else if (ComponentName2 != NULL) {
130 - if (ComponentName2->GetDriverName != NULL) {
131 - SupportedLanguage = LibConvertSupportedLanguage (ComponentName2->SupportedLanguages, Language);
132 - Status = ComponentName2->GetDriverName (
133 - ComponentName2,
134 - SupportedLanguage,
135 - &DriverName
136 - );
137 - }
138 }
139 - if (SupportedLanguage != NULL) {
140 - FreePool (SupportedLanguage);
141 - }
142 -
143 if (EFI_ERROR (Status)) {
144 + //
145 + // Fails to get driver name from either Component Name 2 & Component Name
146 + // Protocol, we show "<UNKNOWN>" string as driver name.
147 + //
148 DriverName = L"<UNKNOWN>";
149 }
150
151 +
152 for (StringIndex = 0; StringIndex < StrLen (DriverName) && StringIndex < 35; StringIndex++) {
153 FormattedDriverName[StringIndex] = DriverName[StringIndex];
154 }
155 @@ -491,6 +530,10 @@
156 FreePool (Language);
157 }
158
159 + if (PlatformLanguage != NULL) {
160 + FreePool (PlatformLanguage);
161 + }
162 +
163 ShellCloseHandleEnumerator ();
164 LibCheckVarFreeVarList (&ChkPck);
165 LibUnInitializeStrings ();
166 Index: edit/libFileBuffer.c
167 ===================================================================
168 --- edit/libFileBuffer.c (revision 30)
169 +++ edit/libFileBuffer.c (working copy)
170 @@ -735,7 +735,7 @@
171 UINTN LineSize;
172 VOID *Buffer;
173 CHAR16 *UnicodeBuffer;
174 - CHAR8 *AsciiBuffer;
175 + UINT8 *AsciiBuffer;
176 UINTN FileSize;
177 EFI_FILE_HANDLE Handle;
178 BOOLEAN CreateFile;
179 @@ -1047,7 +1047,7 @@
180 //
181 // Unicode file
182 //
183 - if (AsciiBuffer[0] == 0xff && AsciiBuffer[1] == 0xfe) {
184 + if ((FileSize >= 2) && (*((UINT16 *) Buffer) == EFI_UNICODE_BYTE_ORDER_MARK)) {
185 //
186 // Unicode file's size should be even
187 //
188 Index: Library/EfiShellLib.h
189 ===================================================================
190 --- Library/EfiShellLib.h (revision 30)
191 +++ Library/EfiShellLib.h (working copy)
192 @@ -174,22 +174,23 @@
193 //
194 // Environment variable name constants
195 //
196 -#define VarLanguageCodes L"LangCodes"
197 -#define VarLanguage L"Lang"
198 -#define VarTimeout L"Timeout"
199 -#define VarConsoleIn L"ConIn"
200 -#define VarConsoleOut L"ConOut"
201 -#define VarErrorOut L"ErrOut"
202 -#define VarBootOption L"Boot%04x"
203 -#define VarBootOrder L"BootOrder"
204 -#define VarBootNext L"BootNext"
205 -#define VarBootCurrent L"BootCurrent"
206 -#define VarDriverOption L"Driver%04x"
207 -#define VarDriverOrder L"DriverOrder"
208 -#define VarConsoleInpDev L"ConInDev"
209 -#define VarConsoleOutDev L"ConOutDev"
210 -#define VarErrorOutDev L"ErrOutDev"
211 -#define LanguageCodeEnglish "eng"
212 +#define VarLanguageCodes L"LangCodes"
213 +#define VarLanguage L"Lang"
214 +#define VarTimeout L"Timeout"
215 +#define VarConsoleIn L"ConIn"
216 +#define VarConsoleOut L"ConOut"
217 +#define VarErrorOut L"ErrOut"
218 +#define VarBootOption L"Boot%04x"
219 +#define VarBootOrder L"BootOrder"
220 +#define VarBootNext L"BootNext"
221 +#define VarBootCurrent L"BootCurrent"
222 +#define VarDriverOption L"Driver%04x"
223 +#define VarDriverOrder L"DriverOrder"
224 +#define VarConsoleInpDev L"ConInDev"
225 +#define VarConsoleOutDev L"ConOutDev"
226 +#define VarErrorOutDev L"ErrOutDev"
227 +#define LanguageCodeEnglish "eng"
228 +#define PlatformLanguageCodeEnglish "en-US"
229
230 #define ISO_639_2_ENTRY_SIZE 3
231 #define RFC_3066_ENTRY_SIZE 12
232 @@ -333,4 +334,10 @@
233 IN CHAR8 *LangCode
234 );
235
236 +CHAR8 *
237 +ExtractSupportedLanguage (
238 + IN CONST CHAR8 *SupportedLanguages,
239 + IN CONST CHAR8 *Language
240 + );
241 +
242 #endif
243 Index: Library/Misc.c
244 ===================================================================
245 --- Library/Misc.c (revision 30)
246 +++ Library/Misc.c (working copy)
247 @@ -1905,13 +1905,13 @@
248 IN VOID *UserData
249 )
250 {
251 - CHAR8 *Data;
252 + UINT8 *Data;
253
254 CHAR8 Val[50];
255
256 CHAR8 Str[20];
257
258 - CHAR8 c;
259 + UINT8 c;
260 UINTN Size;
261 UINTN Index;
262
263 @@ -2271,3 +2271,76 @@
264 }
265 return Lang;
266 }
267 +
268 +CHAR8 *
269 +ExtractSupportedLanguage (
270 + IN CONST CHAR8 *SupportedLanguages,
271 + IN CONST CHAR8 *Language
272 + )
273 +/*++
274 +
275 + Routine Description:
276 +
277 + This function matches the major language code (first two characters) in the
278 + SupportedLanguages. The first language code in the SupportedLanguages that
279 + matches first two characters of the input Language is returned. If there is no
280 + such match, then NULL is returned.
281 +
282 + Arguments:
283 +
284 + SupportedLanguages - A Null-terminated ASCII string that contains one
285 + or more supported language codes.
286 +
287 + LangCode - A pointer to a Null-terminated ASCII string
288 + array indicating the RFC 3066 language.
289 +
290 + Returns:
291 +
292 + The RFC3066 language code that matches the major language.
293 +
294 +--*/
295 +{
296 + CONST CHAR8 *CurrentLanguage;
297 + CHAR8 *SupportedLanguage;
298 + UINTN LanguageLen;
299 +
300 + CurrentLanguage = SupportedLanguages;
301 +
302 + while (CurrentLanguage != '\0') {
303 + //
304 + // Search till the end of current language.
305 + //
306 + LanguageLen = 0;
307 + while (CurrentLanguage[LanguageLen] != ';' && CurrentLanguage[LanguageLen] != '\0') {
308 + LanguageLen++;
309 + }
310 +
311 + //
312 + // should use AsciiStrnCmp(CurrentLanguage, Language, 2) == 0
313 + //
314 + if ((CurrentLanguage[0] == Language[0]) && (CurrentLanguage[1] == Language[1])) {
315 + //
316 + // Match the major language code, then return a new copy of
317 + // NULL-terminated SupportedLanguage.
318 + //
319 + SupportedLanguage = AllocatePool (LanguageLen + 1);
320 + CopyMem (SupportedLanguage, (VOID *) CurrentLanguage, LanguageLen);
321 +
322 + SupportedLanguage[LanguageLen] = '\0';
323 +
324 + return SupportedLanguage;
325 + }
326 + //
327 + // Make CurrentLangue point to the next candiate language code.
328 + //
329 + CurrentLanguage += LanguageLen;
330 + if (*CurrentLanguage == ';') {
331 + CurrentLanguage++;
332 + }
333 + }
334 +
335 + return NULL;
336 +}
337 +
338 +
339 +
340 Index: shellenv/batch.c
341 ===================================================================
342 --- shellenv/batch.c (revision 30)
343 +++ shellenv/batch.c (working copy)
344 @@ -2074,17 +2074,17 @@
345 --*/
346 {
347 //
348 - // UNICODE byte-order-mark is two bytes
349 + // UNICODE byte-order-mark is 16 bits
350 //
351 - CHAR8 Buffer8[2];
352 + UINT16 Uint16;
353 UINTN BufSize;
354 EFI_STATUS Status;
355
356 //
357 // Read the first two bytes to check for byte order mark
358 //
359 - BufSize = sizeof (Buffer8);
360 - Status = File->Read (File, &BufSize, Buffer8);
361 + BufSize = sizeof (Uint16);
362 + Status = File->Read (File, &BufSize, &Uint16);
363 if (EFI_ERROR (Status)) {
364 return Status;
365 }
366 @@ -2098,9 +2098,8 @@
367 // otherwise assume it is ASCII. UNICODE byte order mark on
368 // IA little endian is first byte 0xff and second byte 0xfe
369 //
370 - if ((Buffer8[0] | (Buffer8[1] << 8)) == EFI_UNICODE_BYTE_ORDER_MARK) {
371 + if ((BufSize == 2) && (Uint16 == EFI_UNICODE_BYTE_ORDER_MARK)) {
372 *IsAscii = FALSE;
373 -
374 } else {
375 *IsAscii = TRUE;
376 }
377 Index: SmbiosView/PrintInfo.c
378 ===================================================================
379 --- SmbiosView/PrintInfo.c (revision 30)
380 +++ SmbiosView/PrintInfo.c (working copy)
381 @@ -1779,7 +1779,7 @@
382 //
383 // MaxSize is determined by follow formula
384 //
385 - MaxSize = 1 << Size;
386 + MaxSize = (UINTN) 1 << Size;
387 PrintToken (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_MB), HiiHandle, MaxSize);
388
389 if (Option >= SHOW_DETAIL) {
390 Index: SmbiosView/Smbios.h
391 ===================================================================
392 --- SmbiosView/Smbios.h (revision 30)
393 +++ SmbiosView/Smbios.h (working copy)
394 @@ -34,11 +34,6 @@
395
396 extern EFI_HII_HANDLE HiiHandle;
397
398 -#define EFI_SMBIOS_TABLE_GUID \
399 - { \
400 - 0xeb9d2d31, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d \
401 - }
402
403 -extern EFI_GUID gEfiSmbiosTableGuid;
404
405 #endif