]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/BootLogoLib/BootLogoLib.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Library / BootLogoLib / BootLogoLib.c
CommitLineData
8dfe7fd2
RN
1/** @file\r
2 This library is only intended to be used by PlatformBootManagerLib\r
3 to show progress bar and LOGO.\r
4\r
d1102dba 5Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
90f7f19a 6Copyright (c) 2016, Microsoft Corporation<BR>\r
9d510e61 7SPDX-License-Identifier: BSD-2-Clause-Patent\r
8dfe7fd2
RN
8\r
9**/\r
10\r
e0ac9c8a
RN
11#include <Uefi.h>\r
12#include <Protocol/GraphicsOutput.h>\r
8dfe7fd2
RN
13#include <Protocol/SimpleTextOut.h>\r
14#include <Protocol/PlatformLogo.h>\r
8dfe7fd2
RN
15#include <Protocol/UgaDraw.h>\r
16#include <Protocol/BootLogo.h>\r
90f7f19a 17#include <Protocol/BootLogo2.h>\r
8dfe7fd2
RN
18#include <Library/BaseLib.h>\r
19#include <Library/UefiLib.h>\r
20#include <Library/BaseMemoryLib.h>\r
21#include <Library/UefiBootServicesTableLib.h>\r
8dfe7fd2
RN
22#include <Library/PcdLib.h>\r
23#include <Library/MemoryAllocationLib.h>\r
24#include <Library/DebugLib.h>\r
8dfe7fd2
RN
25\r
26/**\r
e0ac9c8a 27 Show LOGO returned from Edkii Platform Logo protocol on all consoles.\r
8dfe7fd2
RN
28\r
29 @retval EFI_SUCCESS Logo was displayed.\r
30 @retval EFI_UNSUPPORTED Logo was not found or cannot be displayed.\r
31**/\r
32EFI_STATUS\r
33EFIAPI\r
34BootLogoEnableLogo (\r
e0ac9c8a 35 VOID\r
8dfe7fd2
RN
36 )\r
37{\r
1436aea4
MK
38 EFI_STATUS Status;\r
39 EDKII_PLATFORM_LOGO_PROTOCOL *PlatformLogo;\r
40 EDKII_PLATFORM_LOGO_DISPLAY_ATTRIBUTE Attribute;\r
41 INTN OffsetX;\r
42 INTN OffsetY;\r
43 UINT32 SizeOfX;\r
44 UINT32 SizeOfY;\r
45 INTN DestX;\r
46 INTN DestY;\r
47 UINT32 Instance;\r
48 EFI_IMAGE_INPUT Image;\r
49 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;\r
50 EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
51 UINT32 ColorDepth;\r
52 UINT32 RefreshRate;\r
53 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
54 EFI_BOOT_LOGO_PROTOCOL *BootLogo;\r
55 EDKII_BOOT_LOGO2_PROTOCOL *BootLogo2;\r
56 UINTN NumberOfLogos;\r
57 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *LogoBlt;\r
58 UINTN LogoDestX;\r
59 UINTN LogoDestY;\r
60 UINTN LogoHeight;\r
61 UINTN LogoWidth;\r
62 UINTN NewDestX;\r
63 UINTN NewDestY;\r
64 UINTN BufferSize;\r
65\r
66 Status = gBS->LocateProtocol (&gEdkiiPlatformLogoProtocolGuid, NULL, (VOID **)&PlatformLogo);\r
e0ac9c8a
RN
67 if (EFI_ERROR (Status)) {\r
68 return EFI_UNSUPPORTED;\r
69 }\r
8dfe7fd2
RN
70\r
71 UgaDraw = NULL;\r
72 //\r
73 // Try to open GOP first\r
74 //\r
1436aea4 75 Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID **)&GraphicsOutput);\r
8dfe7fd2
RN
76 if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
77 GraphicsOutput = NULL;\r
78 //\r
79 // Open GOP failed, try to open UGA\r
80 //\r
1436aea4 81 Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, (VOID **)&UgaDraw);\r
8dfe7fd2
RN
82 if (EFI_ERROR (Status)) {\r
83 UgaDraw = NULL;\r
84 }\r
85 }\r
1436aea4 86\r
8dfe7fd2
RN
87 if (EFI_ERROR (Status)) {\r
88 return EFI_UNSUPPORTED;\r
89 }\r
90\r
8dfe7fd2
RN
91 //\r
92 // Try to open Boot Logo Protocol.\r
93 //\r
1436aea4 94 Status = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **)&BootLogo);\r
8dfe7fd2
RN
95 if (EFI_ERROR (Status)) {\r
96 BootLogo = NULL;\r
97 }\r
98\r
90f7f19a
KM
99 //\r
100 // Try to open Boot Logo 2 Protocol.\r
101 //\r
1436aea4 102 Status = gBS->LocateProtocol (&gEdkiiBootLogo2ProtocolGuid, NULL, (VOID **)&BootLogo2);\r
90f7f19a
KM
103 if (EFI_ERROR (Status)) {\r
104 BootLogo2 = NULL;\r
105 }\r
106\r
8dfe7fd2
RN
107 //\r
108 // Erase Cursor from screen\r
109 //\r
110 gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
111\r
112 if (GraphicsOutput != NULL) {\r
113 SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution;\r
114 SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution;\r
8dfe7fd2
RN
115 } else {\r
116 ASSERT (UgaDraw != NULL);\r
117 Status = UgaDraw->GetMode (UgaDraw, &SizeOfX, &SizeOfY, &ColorDepth, &RefreshRate);\r
118 if (EFI_ERROR (Status)) {\r
119 return EFI_UNSUPPORTED;\r
120 }\r
121 }\r
122\r
1436aea4 123 Blt = NULL;\r
8dfe7fd2 124 NumberOfLogos = 0;\r
1436aea4
MK
125 LogoDestX = 0;\r
126 LogoDestY = 0;\r
127 LogoHeight = 0;\r
128 LogoWidth = 0;\r
129 NewDestX = 0;\r
130 NewDestY = 0;\r
131 Instance = 0;\r
132 DestX = 0;\r
133 DestY = 0;\r
8dfe7fd2 134 while (TRUE) {\r
e0ac9c8a
RN
135 //\r
136 // Get image from PlatformLogo protocol.\r
137 //\r
138 Status = PlatformLogo->GetImage (\r
139 PlatformLogo,\r
140 &Instance,\r
141 &Image,\r
142 &Attribute,\r
143 &OffsetX,\r
144 &OffsetY\r
145 );\r
146 if (EFI_ERROR (Status)) {\r
147 break;\r
148 }\r
8dfe7fd2 149\r
8dfe7fd2
RN
150 if (Blt != NULL) {\r
151 FreePool (Blt);\r
152 }\r
1436aea4 153\r
e0ac9c8a 154 Blt = Image.Bitmap;\r
8dfe7fd2
RN
155\r
156 //\r
157 // Calculate the display position according to Attribute.\r
158 //\r
159 switch (Attribute) {\r
1436aea4
MK
160 case EdkiiPlatformLogoDisplayAttributeLeftTop:\r
161 DestX = 0;\r
162 DestY = 0;\r
163 break;\r
164 case EdkiiPlatformLogoDisplayAttributeCenterTop:\r
165 DestX = (SizeOfX - Image.Width) / 2;\r
166 DestY = 0;\r
167 break;\r
168 case EdkiiPlatformLogoDisplayAttributeRightTop:\r
169 DestX = SizeOfX - Image.Width;\r
170 DestY = 0;\r
171 break;\r
172\r
173 case EdkiiPlatformLogoDisplayAttributeCenterLeft:\r
174 DestX = 0;\r
175 DestY = (SizeOfY - Image.Height) / 2;\r
176 break;\r
177 case EdkiiPlatformLogoDisplayAttributeCenter:\r
178 DestX = (SizeOfX - Image.Width) / 2;\r
179 DestY = (SizeOfY - Image.Height) / 2;\r
180 break;\r
181 case EdkiiPlatformLogoDisplayAttributeCenterRight:\r
182 DestX = SizeOfX - Image.Width;\r
183 DestY = (SizeOfY - Image.Height) / 2;\r
184 break;\r
185\r
186 case EdkiiPlatformLogoDisplayAttributeLeftBottom:\r
187 DestX = 0;\r
188 DestY = SizeOfY - Image.Height;\r
189 break;\r
190 case EdkiiPlatformLogoDisplayAttributeCenterBottom:\r
191 DestX = (SizeOfX - Image.Width) / 2;\r
192 DestY = SizeOfY - Image.Height;\r
193 break;\r
194 case EdkiiPlatformLogoDisplayAttributeRightBottom:\r
195 DestX = SizeOfX - Image.Width;\r
196 DestY = SizeOfY - Image.Height;\r
197 break;\r
198\r
199 default:\r
200 ASSERT (FALSE);\r
201 continue;\r
202 break;\r
8dfe7fd2
RN
203 }\r
204\r
b9335cf5
RN
205 DestX += OffsetX;\r
206 DestY += OffsetY;\r
207\r
8dfe7fd2
RN
208 if ((DestX >= 0) && (DestY >= 0)) {\r
209 if (GraphicsOutput != NULL) {\r
210 Status = GraphicsOutput->Blt (\r
211 GraphicsOutput,\r
212 Blt,\r
213 EfiBltBufferToVideo,\r
214 0,\r
215 0,\r
1436aea4
MK
216 (UINTN)DestX,\r
217 (UINTN)DestY,\r
e0ac9c8a
RN
218 Image.Width,\r
219 Image.Height,\r
220 Image.Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
8dfe7fd2
RN
221 );\r
222 } else {\r
223 ASSERT (UgaDraw != NULL);\r
224 Status = UgaDraw->Blt (\r
225 UgaDraw,\r
1436aea4 226 (EFI_UGA_PIXEL *)Blt,\r
8dfe7fd2
RN
227 EfiUgaBltBufferToVideo,\r
228 0,\r
229 0,\r
1436aea4
MK
230 (UINTN)DestX,\r
231 (UINTN)DestY,\r
e0ac9c8a
RN
232 Image.Width,\r
233 Image.Height,\r
234 Image.Width * sizeof (EFI_UGA_PIXEL)\r
8dfe7fd2
RN
235 );\r
236 }\r
237\r
238 //\r
239 // Report displayed Logo information.\r
240 //\r
241 if (!EFI_ERROR (Status)) {\r
242 NumberOfLogos++;\r
243\r
e0ac9c8a 244 if (NumberOfLogos == 1) {\r
8dfe7fd2
RN
245 //\r
246 // The first Logo.\r
247 //\r
1436aea4
MK
248 LogoDestX = (UINTN)DestX;\r
249 LogoDestY = (UINTN)DestY;\r
250 LogoWidth = Image.Width;\r
e0ac9c8a 251 LogoHeight = Image.Height;\r
8dfe7fd2
RN
252 } else {\r
253 //\r
254 // Merge new logo with old one.\r
255 //\r
1436aea4
MK
256 NewDestX = MIN ((UINTN)DestX, LogoDestX);\r
257 NewDestY = MIN ((UINTN)DestY, LogoDestY);\r
258 LogoWidth = MAX ((UINTN)DestX + Image.Width, LogoDestX + LogoWidth) - NewDestX;\r
259 LogoHeight = MAX ((UINTN)DestY + Image.Height, LogoDestY + LogoHeight) - NewDestY;\r
8dfe7fd2
RN
260\r
261 LogoDestX = NewDestX;\r
262 LogoDestY = NewDestY;\r
8dfe7fd2
RN
263 }\r
264 }\r
265 }\r
8dfe7fd2
RN
266 }\r
267\r
1436aea4 268 if (((BootLogo == NULL) && (BootLogo2 == NULL)) || (NumberOfLogos == 0)) {\r
8dfe7fd2
RN
269 //\r
270 // No logo displayed.\r
271 //\r
272 if (Blt != NULL) {\r
273 FreePool (Blt);\r
274 }\r
275\r
276 return Status;\r
277 }\r
278\r
279 //\r
280 // Advertise displayed Logo information.\r
281 //\r
282 if (NumberOfLogos == 1) {\r
283 //\r
284 // Only one logo displayed, use its Blt buffer directly for BootLogo protocol.\r
285 //\r
286 LogoBlt = Blt;\r
1436aea4 287 Status = EFI_SUCCESS;\r
8dfe7fd2
RN
288 } else {\r
289 //\r
d1102dba 290 // More than one Logo displayed, get merged BltBuffer using VideoToBuffer operation.\r
8dfe7fd2
RN
291 //\r
292 if (Blt != NULL) {\r
293 FreePool (Blt);\r
294 }\r
295\r
296 //\r
297 // Ensure the LogoHeight * LogoWidth * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) doesn't overflow\r
298 //\r
299 if (LogoHeight > MAX_UINTN / LogoWidth / sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)) {\r
300 return EFI_UNSUPPORTED;\r
301 }\r
1436aea4 302\r
8dfe7fd2
RN
303 BufferSize = LogoWidth * LogoHeight * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
304\r
305 LogoBlt = AllocatePool (BufferSize);\r
306 if (LogoBlt == NULL) {\r
307 return EFI_OUT_OF_RESOURCES;\r
308 }\r
309\r
310 if (GraphicsOutput != NULL) {\r
311 Status = GraphicsOutput->Blt (\r
1436aea4
MK
312 GraphicsOutput,\r
313 LogoBlt,\r
314 EfiBltVideoToBltBuffer,\r
315 LogoDestX,\r
316 LogoDestY,\r
317 0,\r
318 0,\r
319 LogoWidth,\r
320 LogoHeight,\r
321 LogoWidth * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
322 );\r
8dfe7fd2
RN
323 } else {\r
324 Status = UgaDraw->Blt (\r
325 UgaDraw,\r
1436aea4 326 (EFI_UGA_PIXEL *)LogoBlt,\r
8dfe7fd2
RN
327 EfiUgaVideoToBltBuffer,\r
328 LogoDestX,\r
329 LogoDestY,\r
330 0,\r
331 0,\r
332 LogoWidth,\r
333 LogoHeight,\r
334 LogoWidth * sizeof (EFI_UGA_PIXEL)\r
335 );\r
336 }\r
337 }\r
338\r
339 if (!EFI_ERROR (Status)) {\r
90f7f19a
KM
340 //\r
341 // Attempt to register logo with Boot Logo 2 Protocol first\r
342 //\r
343 if (BootLogo2 != NULL) {\r
344 Status = BootLogo2->SetBootLogo (BootLogo2, LogoBlt, LogoDestX, LogoDestY, LogoWidth, LogoHeight);\r
345 }\r
1436aea4 346\r
90f7f19a
KM
347 //\r
348 // If Boot Logo 2 Protocol is not available or registration with Boot Logo 2\r
349 // Protocol failed, then attempt to register logo with Boot Logo Protocol\r
350 //\r
1436aea4 351 if (EFI_ERROR (Status) && (BootLogo != NULL)) {\r
90f7f19a
KM
352 Status = BootLogo->SetBootLogo (BootLogo, LogoBlt, LogoDestX, LogoDestY, LogoWidth, LogoHeight);\r
353 }\r
1436aea4 354\r
90f7f19a
KM
355 //\r
356 // Status of this function is EFI_SUCCESS even if registration with Boot\r
357 // Logo 2 Protocol or Boot Logo Protocol fails.\r
358 //\r
359 Status = EFI_SUCCESS;\r
8dfe7fd2 360 }\r
1436aea4 361\r
8dfe7fd2
RN
362 FreePool (LogoBlt);\r
363\r
364 return Status;\r
365}\r
366\r
367/**\r
d1102dba 368 Use SystemTable Conout to turn on video based Simple Text Out consoles. The\r
8dfe7fd2
RN
369 Simple Text Out screens will now be synced up with all non video output devices\r
370\r
371 @retval EFI_SUCCESS UGA devices are back in text mode and synced up.\r
372\r
373**/\r
374EFI_STATUS\r
375EFIAPI\r
376BootLogoDisableLogo (\r
377 VOID\r
378 )\r
379{\r
8dfe7fd2
RN
380 //\r
381 // Enable Cursor on Screen\r
382 //\r
383 gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
384 return EFI_SUCCESS;\r
385}\r
386\r
8dfe7fd2
RN
387/**\r
388\r
389 Update progress bar with title above it. It only works in Graphics mode.\r
390\r
391 @param TitleForeground Foreground color for Title.\r
392 @param TitleBackground Background color for Title.\r
393 @param Title Title above progress bar.\r
394 @param ProgressColor Progress bar color.\r
395 @param Progress Progress (0-100)\r
396 @param PreviousValue The previous value of the progress.\r
397\r
398 @retval EFI_STATUS Success update the progress bar\r
399\r
400**/\r
401EFI_STATUS\r
402EFIAPI\r
403BootLogoUpdateProgress (\r
1436aea4
MK
404 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleForeground,\r
405 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleBackground,\r
406 IN CHAR16 *Title,\r
407 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL ProgressColor,\r
408 IN UINTN Progress,\r
409 IN UINTN PreviousValue\r
8dfe7fd2
RN
410 )\r
411{\r
412 EFI_STATUS Status;\r
413 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
414 EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
415 UINT32 SizeOfX;\r
416 UINT32 SizeOfY;\r
417 UINT32 ColorDepth;\r
418 UINT32 RefreshRate;\r
419 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;\r
420 UINTN BlockHeight;\r
421 UINTN BlockWidth;\r
422 UINTN BlockNum;\r
423 UINTN PosX;\r
424 UINTN PosY;\r
425 UINTN Index;\r
426\r
427 if (Progress > 100) {\r
428 return EFI_INVALID_PARAMETER;\r
429 }\r
430\r
431 UgaDraw = NULL;\r
1436aea4 432 Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID **)&GraphicsOutput);\r
8dfe7fd2
RN
433 if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
434 GraphicsOutput = NULL;\r
435\r
1436aea4 436 Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, (VOID **)&UgaDraw);\r
8dfe7fd2
RN
437 if (EFI_ERROR (Status)) {\r
438 UgaDraw = NULL;\r
439 }\r
440 }\r
1436aea4 441\r
8dfe7fd2
RN
442 if (EFI_ERROR (Status)) {\r
443 return EFI_UNSUPPORTED;\r
444 }\r
445\r
446 SizeOfX = 0;\r
447 SizeOfY = 0;\r
448 if (GraphicsOutput != NULL) {\r
449 SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution;\r
450 SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution;\r
451 } else if (UgaDraw != NULL) {\r
452 Status = UgaDraw->GetMode (\r
453 UgaDraw,\r
454 &SizeOfX,\r
455 &SizeOfY,\r
456 &ColorDepth,\r
457 &RefreshRate\r
458 );\r
459 if (EFI_ERROR (Status)) {\r
460 return EFI_UNSUPPORTED;\r
461 }\r
462 } else {\r
463 return EFI_UNSUPPORTED;\r
464 }\r
465\r
466 BlockWidth = SizeOfX / 100;\r
467 BlockHeight = SizeOfY / 50;\r
468\r
1436aea4 469 BlockNum = Progress;\r
8dfe7fd2 470\r
1436aea4
MK
471 PosX = 0;\r
472 PosY = SizeOfY * 48 / 50;\r
8dfe7fd2
RN
473\r
474 if (BlockNum == 0) {\r
475 //\r
476 // Clear progress area\r
477 //\r
478 SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);\r
479\r
480 if (GraphicsOutput != NULL) {\r
481 Status = GraphicsOutput->Blt (\r
1436aea4
MK
482 GraphicsOutput,\r
483 &Color,\r
484 EfiBltVideoFill,\r
485 0,\r
486 0,\r
487 0,\r
488 PosY - EFI_GLYPH_HEIGHT - 1,\r
489 SizeOfX,\r
490 SizeOfY - (PosY - EFI_GLYPH_HEIGHT - 1),\r
491 SizeOfX * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
492 );\r
8dfe7fd2
RN
493 } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
494 Status = UgaDraw->Blt (\r
495 UgaDraw,\r
1436aea4 496 (EFI_UGA_PIXEL *)&Color,\r
8dfe7fd2
RN
497 EfiUgaVideoFill,\r
498 0,\r
499 0,\r
500 0,\r
501 PosY - EFI_GLYPH_HEIGHT - 1,\r
502 SizeOfX,\r
503 SizeOfY - (PosY - EFI_GLYPH_HEIGHT - 1),\r
504 SizeOfX * sizeof (EFI_UGA_PIXEL)\r
505 );\r
506 } else {\r
507 return EFI_UNSUPPORTED;\r
508 }\r
509 }\r
1436aea4 510\r
8dfe7fd2
RN
511 //\r
512 // Show progress by drawing blocks\r
513 //\r
514 for (Index = PreviousValue; Index < BlockNum; Index++) {\r
515 PosX = Index * BlockWidth;\r
516 if (GraphicsOutput != NULL) {\r
517 Status = GraphicsOutput->Blt (\r
1436aea4
MK
518 GraphicsOutput,\r
519 &ProgressColor,\r
520 EfiBltVideoFill,\r
521 0,\r
522 0,\r
523 PosX,\r
524 PosY,\r
525 BlockWidth - 1,\r
526 BlockHeight,\r
527 (BlockWidth) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
528 );\r
8dfe7fd2
RN
529 } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
530 Status = UgaDraw->Blt (\r
531 UgaDraw,\r
1436aea4 532 (EFI_UGA_PIXEL *)&ProgressColor,\r
8dfe7fd2
RN
533 EfiUgaVideoFill,\r
534 0,\r
535 0,\r
536 PosX,\r
537 PosY,\r
538 BlockWidth - 1,\r
539 BlockHeight,\r
540 (BlockWidth) * sizeof (EFI_UGA_PIXEL)\r
541 );\r
542 } else {\r
543 return EFI_UNSUPPORTED;\r
544 }\r
545 }\r
546\r
547 PrintXY (\r
548 (SizeOfX - StrLen (Title) * EFI_GLYPH_WIDTH) / 2,\r
549 PosY - EFI_GLYPH_HEIGHT - 1,\r
550 &TitleForeground,\r
551 &TitleBackground,\r
552 Title\r
553 );\r
554\r
555 return EFI_SUCCESS;\r
556}\r