OvmfPkg: Update AcpiPlatformDxe to alter MADT table

RFC: https://bugzilla.tianocore.org/show_bug.cgi?id=3429

In TDX the guest firmware is designed to publish a multiprocessor-wakeup
structure to let the guest-bootstrap processor wake up guest-application
processors with a mailbox. The mailbox is memory that the guest firmware
can reserve so each guest virtual processor can have the guest OS send
a message to them. The address of the mailbox is recorded in the MADT
table. See [ACPI].

To maintain the simplicity of the AcpiPlatformDxe, the MADT ACPI table
will be altered in another driver (TdxDxe) by installing a protocol
to notify that the ACPI table provided by Qemu is ready. Then in TdxDxe
a notification functioin will be called to alter the MADT table to recorded
the mailbox address.

The protocol is gQemuAcpiTableNotifyProtocolGuid.

Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Brijesh Singh <brijesh.singh@amd.com>
Cc: Erdem Aktas <erdemaktas@google.com>
Cc: James Bottomley <jejb@linux.ibm.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
Signed-off-by: Min Xu <min.m.xu@intel.com>
This commit is contained in:
Min Xu 2021-09-22 21:02:19 +08:00 committed by mergify[bot]
parent cf17156d7d
commit 9fdc70af6b
3 changed files with 41 additions and 1 deletions

View File

@ -49,6 +49,7 @@
[Protocols]
gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED
gEfiPciIoProtocolGuid # PROTOCOL SOMETIMES_CONSUMED
gQemuAcpiTableNotifyProtocolGuid # PROTOCOL PRODUCES
[Guids]
gRootBridgesConnectedEventGroupGuid

View File

@ -19,7 +19,10 @@
#include <Library/QemuFwCfgS3Lib.h> // QemuFwCfgS3Enabled()
#include <Library/UefiBootServicesTableLib.h> // gBS
#include <Protocol/QemuAcpiTableNotify.h>
#include "AcpiPlatform.h"
EFI_HANDLE mQemuAcpiHandle = NULL;
QEMU_ACPI_TABLE_NOTIFY_PROTOCOL mAcpiNotifyProtocol;
//
// The user structure for the ordered collection that will track the fw_cfg
@ -1273,7 +1276,16 @@ UninstallAcpiTables:
AcpiProtocol->UninstallAcpiTable (AcpiProtocol, InstalledKey[Installed]);
}
} else {
DEBUG ((DEBUG_INFO, "%a: installed %d tables\n", __FUNCTION__, Installed));
//
// Install a protocol to notify that the ACPI table provided by Qemu is
// ready.
//
gBS->InstallProtocolInterface (
&mQemuAcpiHandle,
&gQemuAcpiTableNotifyProtocolGuid,
EFI_NATIVE_INTERFACE,
&mAcpiNotifyProtocol
);
}
for (SeenPointerEntry = OrderedCollectionMin (SeenPointers);

View File

@ -0,0 +1,27 @@
/** @file
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef QEMU_ACPI_TABLE_NOTIFY_H_
#define QEMU_ACPI_TABLE_NOTIFY_H_
#define QEMU_ACPI_TABLE_NOTIFY_GUID \
{ 0x928939b2, 0x4235, 0x462f, { 0x95, 0x80, 0xf6, 0xa2, 0xb2, 0xc2, 0x1a, 0x4f } };
///
/// Forward declaration
///
typedef struct _QEMU_ACPI_TABLE_NOTIFY_PROTOCOL QEMU_ACPI_TABLE_NOTIFY_PROTOCOL;
///
/// Protocol structure
///
struct _QEMU_ACPI_TABLE_NOTIFY_PROTOCOL {
UINT8 Notify;
};
extern EFI_GUID gQemuAcpiTableNotifyProtocolGuid;
#endif