/*++\r
\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+Copyright (c) 2006 - 2007, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
\r
Module Name:\r
\r
\r
--*/\r
\r
+BOOLEAN\r
+IsNvNeed (\r
+ IN CHAR16 *ConVarName\r
+ )\r
+{\r
+ CHAR16 *Ptr;\r
+\r
+ Ptr = ConVarName;\r
+\r
+ //\r
+ // If the variable includes "Dev" at last, we consider\r
+ // it does not support NV attribute.\r
+ //\r
+ while (*Ptr) {\r
+ Ptr++;\r
+ }\r
+\r
+ if ((*(Ptr - 3) == 'D') && (*(Ptr - 2) == 'e') && (*(Ptr - 1) == 'v')) {\r
+ return FALSE;\r
+ } else {\r
+ return TRUE;\r
+ }\r
+}\r
+\r
EFI_STATUS\r
BdsLibUpdateConsoleVariable (\r
IN CHAR16 *ConVarName,\r
\r
Routine Description:\r
\r
- This function update console variable based on ConVarName, it can \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
Arguments:\r
Returns:\r
\r
EFI_UNSUPPORTED - Add or remove the same device path.\r
- \r
- EFI_SUCCESS - Success add or remove the device path from \r
+\r
+ EFI_SUCCESS - Success add or remove the device path from\r
the console variable.\r
\r
--*/\r
EFI_STATUS Status;\r
EFI_DEVICE_PATH_PROTOCOL *VarConsole;\r
UINTN DevicePathSize;\r
- EFI_DEVICE_PATH_PROTOCOL *Instance;\r
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *TempNewDevicePath;\r
+ UINT32 Attributes;\r
\r
VarConsole = NULL;\r
DevicePathSize = 0;\r
- NewDevicePath = NULL;\r
Status = EFI_UNSUPPORTED;\r
\r
//\r
&DevicePathSize\r
);\r
\r
+ //\r
+ // Initialize NewDevicePath\r
+ //\r
+ NewDevicePath = VarConsole;\r
+\r
+ //\r
+ // If ExclusiveDevicePath is even the part of the instance in VarConsole, delete it.\r
+ // In the end, NewDevicePath is the final device path.\r
+ //\r
if (ExclusiveDevicePath != NULL && VarConsole != NULL) {\r
- if (BdsLibMatchDevicePaths (VarConsole, ExclusiveDevicePath)) {\r
-\r
- Instance = GetNextDevicePathInstance (&VarConsole, &DevicePathSize);\r
-\r
- while (VarConsole != NULL) {\r
- if (CompareMem (\r
- Instance,\r
- ExclusiveDevicePath,\r
- DevicePathSize - sizeof (EFI_DEVICE_PATH_PROTOCOL)\r
- ) == 0) {\r
- //\r
- // Remove the match part\r
- //\r
- NewDevicePath = AppendDevicePathInstance (NewDevicePath, VarConsole);\r
- break;\r
- } else {\r
- //\r
- // Continue the next instance\r
- //\r
- NewDevicePath = AppendDevicePathInstance (NewDevicePath, Instance);\r
- }\r
-\r
- Instance = GetNextDevicePathInstance (&VarConsole, &DevicePathSize);\r
- }\r
- //\r
- // Reset the console variable with new device path\r
- //\r
- gRT->SetVariable (\r
- ConVarName,\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- GetDevicePathSize (NewDevicePath),\r
- NewDevicePath\r
- );\r
- }\r
+ NewDevicePath = BdsLibDelPartMatchInstance (VarConsole, ExclusiveDevicePath);\r
}\r
//\r
- // Try to append customized device path\r
+ // Try to append customized device path to NewDevicePath.\r
//\r
- VarConsole = BdsLibGetVariableAndSize (\r
- ConVarName,\r
- &gEfiGlobalVariableGuid,\r
- &DevicePathSize\r
- );\r
-\r
if (CustomizedConDevicePath != NULL) {\r
- if (!BdsLibMatchDevicePaths (VarConsole, CustomizedConDevicePath)) {\r
+ if (!BdsLibMatchDevicePaths (NewDevicePath, CustomizedConDevicePath)) {\r
//\r
- // In the first check, the default console variable will be null,\r
- // just append current customized device path\r
+ // Check if there is part of CustomizedConDevicePath in NewDevicePath, delete it.\r
//\r
- VarConsole = AppendDevicePathInstance (VarConsole, CustomizedConDevicePath);\r
-\r
+ NewDevicePath = BdsLibDelPartMatchInstance (NewDevicePath, CustomizedConDevicePath);\r
//\r
- // Update the variable of the default console\r
+ // In the first check, the default console variable will be null,\r
+ // just append current customized device path\r
//\r
- gRT->SetVariable (\r
- ConVarName,\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- GetDevicePathSize (VarConsole),\r
- VarConsole\r
- );\r
+ TempNewDevicePath = NewDevicePath;\r
+ NewDevicePath = AppendDevicePathInstance (NewDevicePath, CustomizedConDevicePath);\r
+ BdsLibSafeFreePool(TempNewDevicePath);\r
}\r
}\r
\r
+ //\r
+ // The attribute for ConInDev, ConOutDev and ErrOutDev does not include NV.\r
+ //\r
+ if (IsNvNeed(ConVarName)) {\r
+ //\r
+ // ConVarName has NV attribute.\r
+ //\r
+ Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE;\r
+ } else {\r
+ //\r
+ // ConVarName does not have NV attribute.\r
+ //\r
+ Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS;\r
+ }\r
+\r
+ //\r
+ // Finally, Update the variable of the default console by NewDevicePath\r
+ //\r
+ gRT->SetVariable (\r
+ ConVarName,\r
+ &gEfiGlobalVariableGuid,\r
+ Attributes,\r
+ GetDevicePathSize (NewDevicePath),\r
+ NewDevicePath\r
+ );\r
+\r
+ if (VarConsole == NewDevicePath) {\r
+ BdsLibSafeFreePool(VarConsole);\r
+ } else {\r
+ BdsLibSafeFreePool(VarConsole);\r
+ BdsLibSafeFreePool(NewDevicePath);\r
+ }\r
+\r
return EFI_SUCCESS;\r
\r
}\r
Returns:\r
\r
EFI_NOT_FOUND - There is not any console devices connected success\r
- \r
+\r
EFI_SUCCESS - Success connect any one instance of the console\r
device path base on the variable ConVarName.\r
\r
return EFI_UNSUPPORTED;\r
}\r
\r
- CopyOfDevicePath = DuplicateDevicePath (StartDevicePath);\r
+ CopyOfDevicePath = StartDevicePath;\r
do {\r
//\r
// Check every instance of the console variable\r
} else {\r
DeviceExist = TRUE;\r
}\r
-\r
+ BdsLibSafeFreePool(Instance);\r
} while (CopyOfDevicePath != NULL);\r
\r
- gBS->FreePool (StartDevicePath);\r
+ FreePool (StartDevicePath);\r
\r
if (DeviceExist == FALSE) {\r
return EFI_NOT_FOUND;\r
BdsLibUpdateConsoleVariable (L"ConIn", ConDevicePath, NULL);\r
}\r
\r
+ BdsLibSafeFreePool(HandleBuffer);\r
+\r
Status = gBS->LocateHandleBuffer (\r
ByProtocol,\r
&gEfiSimpleTextOutProtocolGuid,\r
BdsLibUpdateConsoleVariable (L"ConOut", ConDevicePath, NULL);\r
BdsLibUpdateConsoleVariable (L"ErrOut", ConDevicePath, NULL);\r
}\r
+\r
+ BdsLibSafeFreePool(HandleBuffer);\r
+\r
//\r
// Connect all console variables\r
//\r
\r
Routine Description:\r
\r
- This function will connect console device base on the console \r
+ This function will connect console device base on the console\r
device variable ConIn, ConOut and ErrOut.\r
\r
Arguments:\r
\r
EFI_SUCCESS - At least one of the ConIn and ConOut device have\r
been connected success.\r
- \r
+\r
EFI_STATUS - Return the status of BdsLibConnectConsoleVariable ().\r
\r
--*/\r
{\r
EFI_STATUS Status;\r
- EFI_DEVICE_PATH_PROTOCOL *VarErrout;\r
- UINTN DevicePathSize;\r
\r
//\r
// Connect all default console variables\r
//\r
- Status = BdsLibConnectConsoleVariable (L"ConIn");\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
\r
+ //\r
+ // Because possibly the platform is legacy free, in such case,\r
+ // ConIn devices (Serial Port and PS2 Keyboard ) does not exist,\r
+ // so we need not check the status.\r
+ //\r
+ BdsLibConnectConsoleVariable (L"ConIn");\r
+\r
+ //\r
+ // It seems impossible not to have any ConOut device on platform,\r
+ // so we check the status here.\r
+ //\r
Status = BdsLibConnectConsoleVariable (L"ConOut");\r
if (EFI_ERROR (Status)) {\r
return Status;\r
// Special treat the err out device, becaues the null\r
// err out var is legal.\r
//\r
- VarErrout = BdsLibGetVariableAndSize (\r
- L"ErrOut",\r
- &gEfiGlobalVariableGuid,\r
- &DevicePathSize\r
- );\r
- if (VarErrout != NULL) {\r
- BdsLibConnectConsoleVariable (L"ErrOut");\r
- }\r
+ BdsLibConnectConsoleVariable (L"ErrOut");\r
\r
return EFI_SUCCESS;\r
\r