OvmfPkg/AcpiPlatformDxe: Detect QEMU & Xen

Detect QEMU & Xen, and allow each to choose how to publish
the individual ACPI tables.

Currently both paths simply publish the tables unmodified.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13385 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
jljusten 2012-05-30 23:15:27 +00:00
parent 7d2bd1505b
commit 522203de37
5 changed files with 228 additions and 32 deletions

View File

@ -1,7 +1,7 @@
/** @file /** @file
Sample ACPI Platform Driver OVMF ACPI Platform Driver
Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR> Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 which accompanies this distribution. The full text of the license may be found at
@ -12,17 +12,25 @@
**/ **/
#include <PiDxe.h> #include "AcpiPlatform.h"
#include <Protocol/AcpiTable.h> EFI_STATUS
#include <Protocol/FirmwareVolume2.h> EFIAPI
InstallAcpiTable (
IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,
IN VOID *AcpiTableBuffer,
IN UINTN AcpiTableBufferSize,
OUT UINTN *TableKey
)
{
return AcpiProtocol->InstallAcpiTable (
AcpiProtocol,
AcpiTableBuffer,
AcpiTableBufferSize,
TableKey
);
}
#include <Library/BaseLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>
#include <IndustryStandard/Acpi.h>
/** /**
Locate the first instance of a protocol. If the protocol requested is an Locate the first instance of a protocol. If the protocol requested is an
@ -171,15 +179,16 @@ AcpiPlatformEntryPoint (
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_ACPI_TABLE_PROTOCOL *AcpiTable; EFI_ACPI_TABLE_PROTOCOL *AcpiTable;
EFI_FIRMWARE_VOLUME2_PROTOCOL *FwVol; EFI_FIRMWARE_VOLUME2_PROTOCOL *FwVol;
INTN Instance; INTN Instance;
EFI_ACPI_COMMON_HEADER *CurrentTable; EFI_ACPI_COMMON_HEADER *CurrentTable;
UINTN TableHandle; UINTN TableHandle;
UINT32 FvStatus; UINT32 FvStatus;
UINTN TableSize; UINTN TableSize;
UINTN Size; UINTN Size;
EFI_ACPI_TABLE_INSTALL_ACPI_TABLE TableInstallFunction;
Instance = 0; Instance = 0;
CurrentTable = NULL; CurrentTable = NULL;
@ -193,6 +202,14 @@ AcpiPlatformEntryPoint (
return EFI_ABORTED; return EFI_ABORTED;
} }
if (QemuDetected ()) {
TableInstallFunction = QemuInstallAcpiTable;
} else if (XenDetected ()) {
TableInstallFunction = XenInstallAcpiTable;
} else {
TableInstallFunction = InstallAcpiTable;
}
// //
// Locate the firmware volume protocol // Locate the firmware volume protocol
// //
@ -231,19 +248,19 @@ AcpiPlatformEntryPoint (
// //
// Install ACPI table // Install ACPI table
// //
Status = AcpiTable->InstallAcpiTable ( Status = TableInstallFunction (
AcpiTable, AcpiTable,
CurrentTable, CurrentTable,
TableSize, TableSize,
&TableHandle &TableHandle
); );
// //
// Free memory allocated by ReadSection // Free memory allocated by ReadSection
// //
gBS->FreePool (CurrentTable); gBS->FreePool (CurrentTable);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
return EFI_ABORTED; return EFI_ABORTED;
} }

View File

@ -0,0 +1,68 @@
/** @file
Sample ACPI Platform Driver
Copyright (c) 2008 - 2012, 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 _ACPI_PLATFORM_H_INCLUDED_
#define _ACPI_PLATFORM_H_INCLUDED_
#include <PiDxe.h>
#include <Protocol/AcpiTable.h>
#include <Protocol/FirmwareVolume2.h>
#include <Library/BaseLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>
#include <IndustryStandard/Acpi.h>
EFI_STATUS
EFIAPI
InstallAcpiTable (
IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,
IN VOID *AcpiTableBuffer,
IN UINTN AcpiTableBufferSize,
OUT UINTN *TableKey
);
BOOLEAN
QemuDetected (
VOID
);
EFI_STATUS
EFIAPI
QemuInstallAcpiTable (
IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,
IN VOID *AcpiTableBuffer,
IN UINTN AcpiTableBufferSize,
OUT UINTN *TableKey
);
BOOLEAN
XenDetected (
VOID
);
EFI_STATUS
EFIAPI
XenInstallAcpiTable (
IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,
IN VOID *AcpiTableBuffer,
IN UINTN AcpiTableBufferSize,
OUT UINTN *TableKey
);
#endif

View File

@ -1,7 +1,7 @@
## @file ## @file
# Sample ACPI Platform Driver # OVMF ACPI Platform Driver
# #
# Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # 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 # which accompanies this distribution. The full text of the license may be found at
@ -28,10 +28,13 @@
[Sources] [Sources]
AcpiPlatform.c AcpiPlatform.c
Qemu.c
Xen.c
[Packages] [Packages]
MdePkg/MdePkg.dec MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec MdeModulePkg/MdeModulePkg.dec
OvmfPkg/OvmfPkg.dec
[LibraryClasses] [LibraryClasses]
UefiLib UefiLib
@ -41,10 +44,15 @@
DebugLib DebugLib
UefiBootServicesTableLib UefiBootServicesTableLib
UefiDriverEntryPoint UefiDriverEntryPoint
HobLib
QemuFwCfgLib
[Protocols] [Protocols]
gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED
[Guids]
gEfiXenInfoGuid
[Pcd] [Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiTableStorageFile gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiTableStorageFile

View File

@ -0,0 +1,48 @@
/** @file
OVMF ACPI QEMU support
Copyright (c) 2008 - 2012, 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.
**/
#include "AcpiPlatform.h"
#include <Library/QemuFwCfgLib.h>
BOOLEAN
QemuDetected (
VOID
)
{
if (!QemuFwCfgIsAvailable ()) {
return FALSE;
}
return TRUE;
}
EFI_STATUS
EFIAPI
QemuInstallAcpiTable (
IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,
IN VOID *AcpiTableBuffer,
IN UINTN AcpiTableBufferSize,
OUT UINTN *TableKey
)
{
return InstallAcpiTable(
AcpiProtocol,
AcpiTableBuffer,
AcpiTableBufferSize,
TableKey
);
}

View File

@ -0,0 +1,55 @@
/** @file
OVMF ACPI QEMU support
Copyright (c) 2008 - 2012, 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.
**/
#include "AcpiPlatform.h"
#include <Library/HobLib.h>
#include <Guid/XenInfo.h>
BOOLEAN
XenDetected (
VOID
)
{
EFI_HOB_GUID_TYPE *GuidHob;
//
// See if a XenInfo HOB is available
//
GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid);
if (GuidHob == NULL) {
return FALSE;
}
return TRUE;
}
EFI_STATUS
EFIAPI
XenInstallAcpiTable (
IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,
IN VOID *AcpiTableBuffer,
IN UINTN AcpiTableBufferSize,
OUT UINTN *TableKey
)
{
return InstallAcpiTable(
AcpiProtocol,
AcpiTableBuffer,
AcpiTableBufferSize,
TableKey
);
}