ArmVirtualizationPkg: clone PlatformIntelBdsLib from ArmPlatformPkg

In the next patch(es) we'll customize the PlatformBdsLib instance used by
ArmVirtualizationQemu.dsc. Let's clone it first verbatim from
ArmPlatformPkg/Library/PlatformIntelBdsLib, changing only its FILE_GUID.

(Also, coding style errors like "missing space before open parenthesis"
and "missing space after comma or semicolon" have been cleaned up.)

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16568 6f19259b-4bc3-4df7-8a09-765794883524
diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
index c18b7a0..033cb35 100644
--- a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
+++ b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
@@ -52,7 +52,7 @@
 !ifdef INTEL_BDS

   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf

   GenericBdsLib|IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf

-  PlatformBdsLib|ArmPlatformPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf

+  PlatformBdsLib|ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf

   CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf

 !endif

 

diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
new file mode 100644
index 0000000..90e6e2d
--- /dev/null
+++ b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
@@ -0,0 +1,376 @@
+/** @file

+

+Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>

+Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>

+

+This program and the accompanying materials

+are licensed and made available under the terms and conditions of the BSD License

+which accompanies this distribution.  The full text of the license may be found at

+http://opensource.org/licenses/bsd-license.php

+

+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

+

+**/

+

+#include "IntelBdsPlatform.h"

+

+///

+/// Predefined platform default time out value

+///

+UINT16                      gPlatformBootTimeOutDefault;

+

+EFI_STATUS

+EFIAPI

+PlatformIntelBdsConstructor (

+  IN EFI_HANDLE        ImageHandle,

+  IN EFI_SYSTEM_TABLE  *SystemTable

+  )

+{

+  gPlatformBootTimeOutDefault = (UINT16)PcdGet16 (PcdPlatformBootTimeOut);

+  return EFI_SUCCESS;

+}

+

+//

+// BDS Platform Functions

+//

+/**

+  Platform Bds init. Include the platform firmware vendor, revision

+  and so crc check.

+

+**/

+VOID

+EFIAPI

+PlatformBdsInit (

+  VOID

+  )

+{

+}

+

+STATIC

+EFI_STATUS

+GetConsoleDevicePathFromVariable (

+  IN  CHAR16*             ConsoleVarName,

+  IN  CHAR16*             DefaultConsolePaths,

+  OUT EFI_DEVICE_PATH**   DevicePaths

+  )

+{

+  EFI_STATUS                Status;

+  UINTN                     Size;

+  EFI_DEVICE_PATH_PROTOCOL* DevicePathInstances;

+  EFI_DEVICE_PATH_PROTOCOL* DevicePathInstance;

+  CHAR16*                   DevicePathStr;

+  CHAR16*                   NextDevicePathStr;

+  EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL  *EfiDevicePathFromTextProtocol;

+

+  Status = GetGlobalEnvironmentVariable (ConsoleVarName, NULL, NULL, (VOID**)&DevicePathInstances);

+  if (EFI_ERROR (Status)) {

+    // In case no default console device path has been defined we assume a driver handles the console (eg: SimpleTextInOutSerial)

+    if ((DefaultConsolePaths == NULL) || (DefaultConsolePaths[0] == L'\0')) {

+      *DevicePaths = NULL;

+      return EFI_SUCCESS;

+    }

+

+    Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, (VOID **)&EfiDevicePathFromTextProtocol);

+    ASSERT_EFI_ERROR (Status);

+

+    DevicePathInstances = NULL;

+

+    // Extract the Device Path instances from the multi-device path string

+    while ((DefaultConsolePaths != NULL) && (DefaultConsolePaths[0] != L'\0')) {

+      NextDevicePathStr = StrStr (DefaultConsolePaths, L";");

+      if (NextDevicePathStr == NULL) {

+        DevicePathStr = DefaultConsolePaths;

+        DefaultConsolePaths = NULL;

+      } else {

+        DevicePathStr = (CHAR16*)AllocateCopyPool ((NextDevicePathStr - DefaultConsolePaths + 1) * sizeof (CHAR16), DefaultConsolePaths);

+        *(DevicePathStr + (NextDevicePathStr - DefaultConsolePaths)) = L'\0';

+        DefaultConsolePaths = NextDevicePathStr;

+        if (DefaultConsolePaths[0] == L';') {

+          DefaultConsolePaths++;

+        }

+      }

+

+      DevicePathInstance = EfiDevicePathFromTextProtocol->ConvertTextToDevicePath (DevicePathStr);

+      ASSERT (DevicePathInstance != NULL);

+      DevicePathInstances = AppendDevicePathInstance (DevicePathInstances, DevicePathInstance);

+

+      if (NextDevicePathStr != NULL) {

+        FreePool (DevicePathStr);

+      }

+      FreePool (DevicePathInstance);

+    }

+

+    // Set the environment variable with this device path multi-instances

+    Size = GetDevicePathSize (DevicePathInstances);

+    if (Size > 0) {

+      gRT->SetVariable (

+          ConsoleVarName,

+          &gEfiGlobalVariableGuid,

+          EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,

+          Size,

+          DevicePathInstances

+          );

+    } else {

+      Status = EFI_INVALID_PARAMETER;

+    }

+  }

+

+  if (!EFI_ERROR (Status)) {

+    *DevicePaths = DevicePathInstances;

+  }

+  return Status;

+}

+

+STATIC

+EFI_STATUS

+InitializeConsolePipe (

+  IN EFI_DEVICE_PATH    *ConsoleDevicePaths,

+  IN EFI_GUID           *Protocol,

+  OUT EFI_HANDLE        *Handle,

+  OUT VOID*             *Interface

+  )

+{

+  EFI_STATUS                Status;

+  UINTN                     Size;

+  UINTN                     NoHandles;

+  EFI_HANDLE                *Buffer;

+  EFI_DEVICE_PATH_PROTOCOL* DevicePath;

+

+  // Connect all the Device Path Consoles

+  while (ConsoleDevicePaths != NULL) {

+    DevicePath = GetNextDevicePathInstance (&ConsoleDevicePaths, &Size);

+

+    Status = BdsConnectDevicePath (DevicePath, Handle, NULL);

+    DEBUG_CODE_BEGIN ();

+      if (EFI_ERROR (Status)) {

+        // We convert back to the text representation of the device Path

+        EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol;

+        CHAR16* DevicePathTxt;

+        EFI_STATUS Status;

+

+        Status = gBS->LocateProtocol (&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol);

+        if (!EFI_ERROR (Status)) {

+          DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText (DevicePath, TRUE, TRUE);

+

+          DEBUG ((EFI_D_ERROR, "Fail to start the console with the Device Path '%s'. (Error '%r')\n", DevicePathTxt, Status));

+

+          FreePool (DevicePathTxt);

+        }

+      }

+    DEBUG_CODE_END ();

+

+    // If the console splitter driver is not supported by the platform then use the first Device Path

+    // instance for the console interface.

+    if (!EFI_ERROR (Status) && (*Interface == NULL)) {

+      Status = gBS->HandleProtocol (*Handle, Protocol, Interface);

+    }

+  }

+

+  // No Device Path has been defined for this console interface. We take the first protocol implementation

+  if (*Interface == NULL) {

+    Status = gBS->LocateHandleBuffer (ByProtocol, Protocol, NULL, &NoHandles, &Buffer);

+    if (EFI_ERROR (Status)) {

+      BdsConnectAllDrivers ();

+      Status = gBS->LocateHandleBuffer (ByProtocol, Protocol, NULL, &NoHandles, &Buffer);

+    }

+

+    if (!EFI_ERROR (Status)) {

+      *Handle = Buffer[0];

+      Status = gBS->HandleProtocol (*Handle, Protocol, Interface);

+      ASSERT_EFI_ERROR (Status);

+    }

+    FreePool (Buffer);

+  } else {

+    Status = EFI_SUCCESS;

+  }

+

+  return Status;

+}

+

+/**

+  Connect the predefined platform default console device. Always try to find

+  and enable the vga device if have.

+

+  @param PlatformConsole          Predefined platform default console device array.

+

+  @retval EFI_SUCCESS             Success connect at least one ConIn and ConOut

+                                  device, there must have one ConOut device is

+                                  active vga device.

+  @return Return the status of BdsLibConnectAllDefaultConsoles ()

+

+**/

+EFI_STATUS

+PlatformBdsConnectConsole (

+  VOID

+  )

+{

+  EFI_STATUS                Status;

+  EFI_DEVICE_PATH*          ConOutDevicePaths;

+  EFI_DEVICE_PATH*          ConInDevicePaths;

+  EFI_DEVICE_PATH*          ConErrDevicePaths;

+

+  // By getting the Console Device Paths from the environment variables before initializing the console pipe, we

+  // create the 3 environment variables (ConIn, ConOut, ConErr) that allows to initialize all the console interface

+  // of newly installed console drivers

+  Status = GetConsoleDevicePathFromVariable (L"ConOut", (CHAR16*)PcdGetPtr (PcdDefaultConOutPaths), &ConOutDevicePaths);

+  ASSERT_EFI_ERROR (Status);

+  Status = GetConsoleDevicePathFromVariable (L"ConIn", (CHAR16*)PcdGetPtr (PcdDefaultConInPaths), &ConInDevicePaths);

+  ASSERT_EFI_ERROR (Status);

+  Status = GetConsoleDevicePathFromVariable (L"ErrOut", (CHAR16*)PcdGetPtr (PcdDefaultConOutPaths), &ConErrDevicePaths);

+  ASSERT_EFI_ERROR (Status);

+

+  // Initialize the Consoles

+  Status = InitializeConsolePipe (ConOutDevicePaths, &gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **)&gST->ConOut);

+  ASSERT_EFI_ERROR (Status);

+  Status = InitializeConsolePipe (ConInDevicePaths, &gEfiSimpleTextInProtocolGuid, &gST->ConsoleInHandle, (VOID **)&gST->ConIn);

+  ASSERT_EFI_ERROR (Status);

+  Status = InitializeConsolePipe (ConErrDevicePaths, &gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID **)&gST->StdErr);

+  if (EFI_ERROR (Status)) {

+    // In case of error, we reuse the console output for the error output

+    gST->StandardErrorHandle = gST->ConsoleOutHandle;

+    gST->StdErr = gST->ConOut;

+  }

+

+  return Status;

+}

+

+/**

+  Connect with predefined platform connect sequence,

+  the OEM/IBV can customize with their own connect sequence.

+**/

+VOID

+PlatformBdsConnectSequence (

+  VOID

+  )

+{

+}

+

+/**

+  Load the predefined driver option, OEM/IBV can customize this

+  to load their own drivers

+

+  @param BdsDriverLists  - The header of the driver option link list.

+

+**/

+VOID

+PlatformBdsGetDriverOption (

+  IN OUT LIST_ENTRY              *BdsDriverLists

+  )

+{

+}

+

+/**

+  Perform the platform diagnostic, such like test memory. OEM/IBV also

+  can customize this function to support specific platform diagnostic.

+

+  @param MemoryTestLevel  The memory test intensive level

+  @param QuietBoot        Indicate if need to enable the quiet boot

+  @param BaseMemoryTest   A pointer to BdsMemoryTest()

+

+**/

+VOID

+PlatformBdsDiagnostics (

+  IN EXTENDMEM_COVERAGE_LEVEL    MemoryTestLevel,

+  IN BOOLEAN                     QuietBoot,

+  IN BASEM_MEMORY_TEST           BaseMemoryTest

+  )

+{

+}

+

+/**

+  The function will execute with as the platform policy, current policy

+  is driven by boot mode. IBV/OEM can customize this code for their specific

+  policy action.

+

+  @param  DriverOptionList        The header of the driver option link list

+  @param  BootOptionList          The header of the boot option link list

+  @param  ProcessCapsules         A pointer to ProcessCapsules()

+  @param  BaseMemoryTest          A pointer to BaseMemoryTest()

+

+**/

+VOID

+EFIAPI

+PlatformBdsPolicyBehavior (

+  IN LIST_ENTRY                      *DriverOptionList,

+  IN LIST_ENTRY                      *BootOptionList,

+  IN PROCESS_CAPSULES                ProcessCapsules,

+  IN BASEM_MEMORY_TEST               BaseMemoryTest

+  )

+{

+  EFI_STATUS Status;

+

+  Status = PlatformBdsConnectConsole ();

+  ASSERT_EFI_ERROR (Status);

+}

+

+/**

+  Hook point after a boot attempt succeeds. We don't expect a boot option to

+  return, so the UEFI 2.0 specification defines that you will default to an

+  interactive mode and stop processing the BootOrder list in this case. This

+  is also a platform implementation and can be customized by IBV/OEM.

+

+  @param  Option                  Pointer to Boot Option that succeeded to boot.

+

+**/

+VOID

+EFIAPI

+PlatformBdsBootSuccess (

+  IN  BDS_COMMON_OPTION *Option

+  )

+{

+}

+

+/**

+  Hook point after a boot attempt fails.

+

+  @param  Option                  Pointer to Boot Option that failed to boot.

+  @param  Status                  Status returned from failed boot.

+  @param  ExitData                Exit data returned from failed boot.

+  @param  ExitDataSize            Exit data size returned from failed boot.

+

+**/

+VOID

+EFIAPI

+PlatformBdsBootFail (

+  IN  BDS_COMMON_OPTION  *Option,

+  IN  EFI_STATUS         Status,

+  IN  CHAR16             *ExitData,

+  IN  UINTN              ExitDataSize

+  )

+{

+}

+

+/**

+  This function locks platform flash that is not allowed to be updated during normal boot path.

+  The flash layout is platform specific.

+**/

+VOID

+EFIAPI

+PlatformBdsLockNonUpdatableFlash (

+  VOID

+  )

+{

+  return;

+}

+

+

+/**

+  Lock the ConsoleIn device in system table. All key

+  presses will be ignored until the Password is typed in. The only way to

+  disable the password is to type it in to a ConIn device.

+

+  @param  Password        Password used to lock ConIn device.

+

+  @retval EFI_SUCCESS     lock the Console In Spliter virtual handle successfully.

+  @retval EFI_UNSUPPORTED Password not found

+

+**/

+EFI_STATUS

+EFIAPI

+LockKeyboards (

+  IN  CHAR16    *Password

+  )

+{

+    return EFI_UNSUPPORTED;

+}

diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.h b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.h
new file mode 100644
index 0000000..a244ac9
--- /dev/null
+++ b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.h
@@ -0,0 +1,35 @@
+/** @file

+  Head file for BDS Platform specific code

+

+Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>

+This program and the accompanying materials

+are licensed and made available under the terms and conditions of the BSD License

+which accompanies this distribution.  The full text of the license may be found at

+http://opensource.org/licenses/bsd-license.php

+

+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

+

+**/

+

+#ifndef _INTEL_BDS_PLATFORM_H_

+#define _INTEL_BDS_PLATFORM_H_

+

+#include <Protocol/DevicePathFromText.h>

+#include <Protocol/DevicePathToText.h>

+

+#include <Library/BaseMemoryLib.h>

+#include <Library/BdsLib.h>

+#include <Library/DebugLib.h>

+#include <Library/DevicePathLib.h>

+#include <Library/UefiBootServicesTableLib.h>

+#include <Library/UefiRuntimeServicesTableLib.h>

+#include <Library/MemoryAllocationLib.h>

+#include <Library/BaseLib.h>

+#include <Library/PcdLib.h>

+#include <Library/GenericBdsLib.h>

+#include <Library/PlatformBdsLib.h>

+

+#include <Guid/GlobalVariable.h>

+

+#endif // _INTEL_BDS_PLATFORM_H

diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
new file mode 100644
index 0000000..d635f13
--- /dev/null
+++ b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
@@ -0,0 +1,65 @@
+## @file

+#  Implementation for PlatformBdsLib library class interfaces.

+#  using ARM Platform framework.

+#

+#  Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>

+#  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>

+#

+#  This program and the accompanying materials

+#  are licensed and made available under the terms and conditions of the BSD License

+#  which accompanies this distribution.  The full text of the license may be found at

+#  http://opensource.org/licenses/bsd-license.php

+#

+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

+#

+##

+

+[Defines]

+  INF_VERSION                    = 0x00010005

+  BASE_NAME                      = PlatformIntelBdsLib

+  FILE_GUID                      = 46DF84EB-F603-4D39-99D8-E1E86B50BCC2

+  MODULE_TYPE                    = DXE_DRIVER

+  VERSION_STRING                 = 1.0

+  LIBRARY_CLASS                  = PlatformBdsLib|DXE_DRIVER

+  CONSTRUCTOR                    = PlatformIntelBdsConstructor

+

+#

+# The following information is for reference only and not required by the build tools.

+#

+#  VALID_ARCHITECTURES           = ARM AARCH64

+#

+

+[Sources]

+  IntelBdsPlatform.c

+  IntelBdsPlatform.h

+

+[Packages]

+  ArmPkg/ArmPkg.dec

+  ArmPlatformPkg/ArmPlatformPkg.dec

+  MdePkg/MdePkg.dec

+  MdeModulePkg/MdeModulePkg.dec

+  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec

+

+[LibraryClasses]

+  BaseLib

+  BaseMemoryLib

+  BdsLib

+  DebugLib

+  DevicePathLib

+  MemoryAllocationLib

+  UefiBootServicesTableLib

+  PcdLib

+  GenericBdsLib

+

+[Guids]

+  gArmGlobalVariableGuid

+

+[Pcd]

+  gArmPlatformTokenSpaceGuid.PcdDefaultConInPaths

+  gArmPlatformTokenSpaceGuid.PcdDefaultConOutPaths

+  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPlatformBootTimeOut

+

+[Protocols]

+  gEfiDevicePathFromTextProtocolGuid

+  gEfiDevicePathToTextProtocolGuid