/** @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_