**/\r
\r
#include "InternalBdsLib.h"\r
-#include "bmp.h"\r
+#include "Bmp.h"\r
\r
/**\r
Check if we need to save the EFI variable with "ConVarName" as name\r
}\r
}\r
\r
+/**\r
+ Fill console handle in System Table if there are no valid console handle in.\r
+\r
+ Firstly, check the validation of console handle in System Table. If it is invalid,\r
+ update it by the first console device handle from EFI console variable. \r
+\r
+ @param VarName The name of the EFI console variable.\r
+ @param ConsoleGuid Specified Console protocol GUID.\r
+ @param ConsoleHandle On IN, console handle in System Table to be checked. \r
+ On OUT, new console hanlde in system table.\r
+ @param ProtocolInterface On IN, console protocol on console handle in System Table to be checked. \r
+ On OUT, new console protocol on new console hanlde in system table.\r
+**/\r
+VOID \r
+UpdateSystemTableConsole (\r
+ IN CHAR16 *VarName,\r
+ IN EFI_GUID *ConsoleGuid,\r
+ IN OUT EFI_HANDLE *ConsoleHandle,\r
+ IN OUT VOID **ProtocolInterface\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN DevicePathSize;\r
+ EFI_DEVICE_PATH_PROTOCOL *FullDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *VarConsole;\r
+ EFI_DEVICE_PATH_PROTOCOL *Instance;\r
+ VOID *Interface;\r
+ EFI_HANDLE NewHandle;\r
+\r
+ ASSERT (VarName != NULL);\r
+ ASSERT (ConsoleHandle != NULL);\r
+ ASSERT (ConsoleGuid != NULL);\r
+ ASSERT (ProtocolInterface != NULL);\r
+\r
+ if (*ConsoleHandle != NULL) {\r
+ Status = gBS->HandleProtocol (\r
+ *ConsoleHandle,\r
+ ConsoleGuid,\r
+ &Interface\r
+ );\r
+ if (Status == EFI_SUCCESS && Interface == *ProtocolInterface) {\r
+ //\r
+ // If ConsoleHandle is valid and console protocol on this handle also\r
+ // also matched, just return.\r
+ //\r
+ return;\r
+ }\r
+ }\r
+ \r
+ //\r
+ // Get all possible consoles device path from EFI variable\r
+ //\r
+ VarConsole = BdsLibGetVariableAndSize (\r
+ VarName,\r
+ &gEfiGlobalVariableGuid,\r
+ &DevicePathSize\r
+ );\r
+ if (VarConsole == NULL) {\r
+ //\r
+ // If there is no any console device, just return.\r
+ //\r
+ return ;\r
+ }\r
+\r
+ FullDevicePath = VarConsole;\r
+\r
+ do {\r
+ //\r
+ // Check every instance of the console variable\r
+ //\r
+ Instance = GetNextDevicePathInstance (&VarConsole, &DevicePathSize);\r
+ if (Instance == NULL) {\r
+ FreePool (FullDevicePath);\r
+ ASSERT (FALSE);\r
+ }\r
+ \r
+ //\r
+ // Find console device handle by device path instance\r
+ //\r
+ Status = gBS->LocateDevicePath (\r
+ ConsoleGuid,\r
+ &Instance,\r
+ &NewHandle\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // Get the console protocol on this console device handle\r
+ //\r
+ Status = gBS->HandleProtocol (\r
+ NewHandle,\r
+ ConsoleGuid,\r
+ &Interface\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // Update new console handle in System Table.\r
+ //\r
+ *ConsoleHandle = NewHandle;\r
+ *ProtocolInterface = Interface;\r
+ return ;\r
+ }\r
+ }\r
+\r
+ } while (Instance != NULL);\r
+\r
+ //\r
+ // No any available console devcie found.\r
+ //\r
+ ASSERT (FALSE); \r
+}\r
+\r
/**\r
This function update console variable based on ConVarName, it can\r
add or remove one specific console device path from the variable\r
//\r
BdsLibConnectConsoleVariable (L"ErrOut");\r
\r
+ //\r
+ // Fill console handles in System Table if no console device assignd.\r
+ //\r
+ UpdateSystemTableConsole (L"ConIn", &gEfiSimpleTextInProtocolGuid, &gST->ConsoleInHandle, (VOID **) &gST->ConIn);\r
+ UpdateSystemTableConsole (L"ConOut", &gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **) &gST->ConOut);\r
+ UpdateSystemTableConsole (L"ErrOut", &gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID **) &gST->StdErr);\r
+\r
return EFI_SUCCESS;\r
\r
}\r