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>
61 lines
1.7 KiB
C
61 lines
1.7 KiB
C
/** @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_
|