/** @file OVMF ACPI Platform Driver for Xen guests Copyright (C) 2021, Red Hat, Inc. Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include // InstallAcpiTablesFromMemory() #include // DEBUG() #include // XenDetected() #include "AcpiPlatform.h" #define XEN_ACPI_PHYSICAL_ADDRESS 0x000EA020 #define XEN_BIOS_PHYSICAL_END 0x000FFFFF /** Effective entrypoint of Acpi Platform driver. @param ImageHandle @param SystemTable @return EFI_SUCCESS @return EFI_LOAD_ERROR @return EFI_OUT_OF_RESOURCES **/ EFI_STATUS EFIAPI InstallAcpiTables ( IN EFI_ACPI_TABLE_PROTOCOL *AcpiTable ) { EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdpStructurePtr; EFI_XEN_INFO *XenInfo; EFI_STATUS Status; if (XenDetected ()) { // // Detect the RSDP structure // // // First look for PVH one // XenInfo = XenGetInfoHOB (); ASSERT (XenInfo != NULL); if (XenInfo->RsdpPvh != NULL) { DEBUG (( DEBUG_INFO, "%a: Use ACPI RSDP table at 0x%p\n", gEfiCallerBaseName, XenInfo->RsdpPvh )); RsdpStructurePtr = XenInfo->RsdpPvh; } else { // // Otherwise, look for the HVM one // Status = GetAcpiRsdpFromMemory ( XEN_ACPI_PHYSICAL_ADDRESS, XEN_BIOS_PHYSICAL_END, &RsdpStructurePtr ); if (EFI_ERROR (Status)) { return Status; } } Status = InstallAcpiTablesFromRsdp ( AcpiTable, RsdpStructurePtr ); } else { Status = EFI_UNSUPPORTED; } return Status; }