aboutsummaryrefslogtreecommitdiffstats
path: root/roms/edk2/OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h
diff options
context:
space:
mode:
Diffstat (limited to 'roms/edk2/OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h')
-rw-r--r--roms/edk2/OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h47
1 files changed, 47 insertions, 0 deletions
diff --git a/roms/edk2/OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h b/roms/edk2/OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h
new file mode 100644
index 000000000..029de4cde
--- /dev/null
+++ b/roms/edk2/OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h
@@ -0,0 +1,47 @@
+/** @file
+ Define the FIRST_SMI_HANDLER_CONTEXT structure, which is an exchange area
+ between the SMM Monarch and the hot-added CPU, for relocating the SMBASE of
+ the hot-added CPU.
+
+ Copyright (c) 2020, Red Hat, Inc.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#ifndef FIRST_SMI_HANDLER_CONTEXT_H_
+#define FIRST_SMI_HANDLER_CONTEXT_H_
+
+//
+// The following structure is used to communicate between the SMM Monarch
+// (running the root MMI handler) and the hot-added CPU (handling its first
+// SMI). It is placed at SMM_DEFAULT_SMBASE, which is in SMRAM under QEMU's
+// "SMRAM at default SMBASE" feature.
+//
+#pragma pack (1)
+typedef struct {
+ //
+ // When ApicIdGate is MAX_UINT64, then no hot-added CPU may proceed with
+ // SMBASE relocation.
+ //
+ // Otherwise, the hot-added CPU whose APIC ID equals ApicIdGate may proceed
+ // with SMBASE relocation.
+ //
+ // This field is intentionally wider than APIC_ID (UINT32) because we need a
+ // "gate locked" value that is different from all possible APIC_IDs.
+ //
+ UINT64 ApicIdGate;
+ //
+ // The new SMBASE value for the hot-added CPU to set in the SMRAM Save State
+ // Map, before leaving SMM with the RSM instruction.
+ //
+ UINT32 NewSmbase;
+ //
+ // The hot-added CPU sets this field to 1 right before executing the RSM
+ // instruction. This tells the SMM Monarch to proceed to polling the last
+ // byte of the normal RAM reserved page (Post-SMM Pen).
+ //
+ UINT8 AboutToLeaveSmm;
+} FIRST_SMI_HANDLER_CONTEXT;
+#pragma pack ()
+
+#endif // FIRST_SMI_HANDLER_CONTEXT_H_