Provide a more detailed description of each field of the ACPI_CPU_DATA and CPU_REGISTER_TABLE structures.
Cc: Laszlo Ersek <ler...@redhat.com> Cc: "Yao, Jiewen" <jiewen....@intel.com> Cc: "Fan, Jeff" <jeff....@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Michael Kinney <michael.d.kin...@intel.com> --- UefiCpuPkg/Include/AcpiCpuData.h | 116 ++++++++++++++++++++++++++++++++++----- 1 file changed, 103 insertions(+), 13 deletions(-) diff --git a/UefiCpuPkg/Include/AcpiCpuData.h b/UefiCpuPkg/Include/AcpiCpuData.h index a367257..9aea158 100644 --- a/UefiCpuPkg/Include/AcpiCpuData.h +++ b/UefiCpuPkg/Include/AcpiCpuData.h @@ -18,7 +18,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // // Register types in register table // -typedef enum _REGISTER_TYPE { +typedef enum { Msr, ControlRegister, MemoryMapped, @@ -29,11 +29,11 @@ typedef enum _REGISTER_TYPE { // Element of register table entry // typedef struct { - REGISTER_TYPE RegisterType; - UINT32 Index; - UINT8 ValidBitStart; - UINT8 ValidBitLength; - UINT64 Value; + REGISTER_TYPE RegisterType; + UINT32 Index; + UINT8 ValidBitStart; + UINT8 ValidBitLength; + UINT64 Value; } CPU_REGISTER_TABLE_ENTRY; // @@ -41,30 +41,120 @@ typedef struct { // allocated size of this table, and pointer to the list of table entries. // typedef struct { - UINT32 TableLength; - UINT32 NumberBeforeReset; - UINT32 AllocatedSize; - UINT32 InitialApicId; - CPU_REGISTER_TABLE_ENTRY *RegisterTableEntry; + // + // The number of valid entries in the RegisterTableEntry buffer + // + UINT32 TableLength; + UINT32 NumberBeforeReset; + // + // The size, in bytes, of the RegisterTableEntry buffer + // + UINT32 AllocatedSize; + // + // The initial APIC ID of the CPU this register table applies + // + UINT32 InitialApicId; + // + // Buffer of CPU_REGISTER_TABLE_ENTRY structures + // + CPU_REGISTER_TABLE_ENTRY *RegisterTableEntry; } CPU_REGISTER_TABLE; +// +// Data structure that is required for ACPI S3 resume +// This structure must be allocated below 4GB from memory +// of type EfiACPIMemoryNVS. +// The PCD PcdCpuS3DataAddress must be set to the physical +// address where this structure is allocated +// typedef struct { + // + // Physical address of 4KB buffer allocated below 1MB + // used to wake APs during an ACPI S3 resume. + // If there are no APs, then this field may is 0. + // EFI_PHYSICAL_ADDRESS StartupVector; + // + // Physical address of structure of type IA32_DESCRIPTOR that + // contains a copy of the GDT used by the boot processor when + // the platform is booted. This is the GDT used when performing + // an ACPI S3 resume. + // This structure must be allocated below 4GB from memory + // of type EfiACPIMemoryNVS. + // EFI_PHYSICAL_ADDRESS GdtrProfile; + // + // Physical address of structure of type IA32_DESCRIPTOR that + // contains a copy of the IDT used by the boot processor when + // the platform is booted. This is the IDT used when performing + // an ACPI S3 resume. + // This structure must be allocated below 4GB from memory + // of type EfiACPIMemoryNVS. + // EFI_PHYSICAL_ADDRESS IdtrProfile; + // + // Physical address of a buffer that is used as stacks during + // ACPI S3 resume. The total size of this buffer, in bytes, is + // NumberOfCpus * StackSize. + // This structure must be allocated below 4GB from memory + // of type EfiACPIMemoryNVS. + // EFI_PHYSICAL_ADDRESS StackAddress; + // + // The size, in bytes, of a stack used during ACPI S3 resume. + // UINT32 StackSize; + // + // The number of CPUs in the platform. + // UINT32 NumberOfCpus; + // + // Physical address of structure of type MTRR_SETTINGS that + // contains a copy of the MTRRs used by the boot processor when + // the OS is initially booted. These are the MTRR settings used + // when performing an ACPI S3 resume. + // This structure must be allocated below 4GB from memory + // of type EfiACPIMemoryNVS. + // EFI_PHYSICAL_ADDRESS MtrrTable; // - // Physical address of a CPU_REGISTER_TABLE structure + // Physical address of an array of CPU_REGISTER_TABLE structures with + // NumberOfCpus entries. + // This structure must be allocated below 4GB from memory of type + // EfiACPIMemoryNVS. The RegisterTableEntry field of CPU_REGISTER_TABLE + // must contain at least one element and must be allocated below 4GB from + // memory of type EfiACPIMemoryNVS. + // If a register table is not required, then the TableLength field + // of CPU_REGISTER_TABLE is set to 0. + // If TableLength is > 0, then this table is used to initialize a + // CPU during an ACPI S3 resume before SMBASE relocation is performed. // EFI_PHYSICAL_ADDRESS PreSmmInitRegisterTable; // - // Physical address of a CPU_REGISTER_TABLE structure + // Physical address of an array of CPU_REGISTER_TABLE structures with + // NumberOfCpus entries. + // This structure must be allocated below 4GB from memory of type + // EfiACPIMemoryNVS. The RegisterTableEntry field of CPU_REGISTER_TABLE + // must contain at least one element and must be allocated below 4GB from + // memory of type EfiACPIMemoryNVS. + // If a register table is not required, then the TableLength field of + // CPU_REGISTER_TABLE is set to 0. + // If TableLength is > 0, then this table is used to initialize a + // CPU during an ACPI S3 resume after SMBASE relocation is performed. // EFI_PHYSICAL_ADDRESS RegisterTable; + // + // Physical address of a buffer that contains the machine check + // handler that is used during an ACPI S3 Resume. + // This structure must be allocated below 4GB from memory + // of type EfiACPIMemoryNVS. + // EFI_PHYSICAL_ADDRESS ApMachineCheckHandlerBase; + // + // The size, in bytes, of the machine check handler that is used + // during an ACPI S3 Resume. + // If this field is 0, then a machine check handler is not provided. + // UINT32 ApMachineCheckHandlerSize; } ACPI_CPU_DATA; -- 2.6.3.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel