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