OvmfPkg: define CPU_HOT_EJECT_DATA

Define CPU_HOT_EJECT_DATA and add PCD PcdCpuHotEjectDataAddress, which
will be used to share CPU ejection state between OvmfPkg/CpuHotPlugSmm
and PiSmmCpuDxeSmm.

Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
Cc: Igor Mammedov <imammedo@redhat.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Aaron Young <aaron.young@oracle.com>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3132
Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com>
Message-Id: <20210312062656.2477515-6-ankur.a.arora@oracle.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
Ankur Arora 2021-03-11 22:26:51 -08:00 committed by mergify[bot]
parent 15e6ae8ea4
commit 8ade9d425a
2 changed files with 64 additions and 0 deletions

View File

@ -0,0 +1,60 @@
/** @file
Definition for the CPU_HOT_EJECT_DATA structure, which shares
CPU hot-eject state between OVMF's SmmCpuFeaturesLib instance in
PiSmmCpuDxeSmm, and CpuHotplugSmm.
CPU_HOT_EJECT_DATA is allocated in SMRAM, and pointed-to by
PcdCpuHotEjectDataAddress.
PcdCpuHotEjectDataAddress is valid when SMM_REQUIRE is TRUE
and PcdCpuMaxLogicalProcessorNumber > 1.
Copyright (C) 2021, Oracle Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef CPU_HOT_EJECT_DATA_H_
#define CPU_HOT_EJECT_DATA_H_
/**
CPU Hot-eject handler, called from SmmCpuFeaturesRendezvousExit()
on each CPU at exit from SMM.
@param[in] ProcessorNum ProcessorNum denotes the CPU exiting SMM,
and will be used as an index into
CPU_HOT_EJECT_DATA->QemuSelectorMap. It is
identical to the processor handle in
EFI_SMM_CPU_SERVICE_PROTOCOL.
**/
typedef
VOID
(EFIAPI *CPU_HOT_EJECT_HANDLER) (
IN UINTN ProcessorNum
);
//
// CPU_EJECT_QEMU_SELECTOR_INVALID marks CPUs not being ejected in
// CPU_HOT_EJECT_DATA->QemuSelectorMap.
//
// QEMU CPU Selector is UINT32, so we choose an invalid value larger
// than that type.
//
#define CPU_EJECT_QEMU_SELECTOR_INVALID (MAX_UINT64)
typedef struct {
//
// Maps ProcessorNum -> QemuSelector for pending hot-ejects
//
volatile UINT64 *QemuSelectorMap;
//
// Handler to do the CPU ejection
//
volatile CPU_HOT_EJECT_HANDLER Handler;
//
// Entries in the QemuSelectorMap
//
UINT32 ArrayLength;
} CPU_HOT_EJECT_DATA;
#endif // CPU_HOT_EJECT_DATA_H_

View File

@ -352,6 +352,10 @@
# This PCD is only accessed if PcdSmmSmramRequire is TRUE (see below).
gUefiOvmfPkgTokenSpaceGuid.PcdQ35SmramAtDefaultSmbase|FALSE|BOOLEAN|0x34
## This PCD adds a communication channel between OVMF's SmmCpuFeaturesLib
# instance in PiSmmCpuDxeSmm, and CpuHotplugSmm.
gUefiOvmfPkgTokenSpaceGuid.PcdCpuHotEjectDataAddress|0|UINT64|0x46
[PcdsFeatureFlag]
gUefiOvmfPkgTokenSpaceGuid.PcdQemuBootOrderPciTranslation|TRUE|BOOLEAN|0x1c
gUefiOvmfPkgTokenSpaceGuid.PcdQemuBootOrderMmioTranslation|FALSE|BOOLEAN|0x1d