From 3d80db51f4ecc5d097ef4254b1b4cf4d73a23fb4 Mon Sep 17 00:00:00 2001 From: jljusten Date: Thu, 14 Feb 2013 19:20:57 +0000 Subject: [PATCH] OvmfPkg/AcpiPlatformDxe: split S3/S4 package into bytes This should be more compatible with AML parsers in practice since older versions of ACPICA's OS support would not accept the previous OVMF format (despite being spec compliant). (For example, on OpenBSD 5.2 it caused a kernel crash) ACPICA has fixed this issue in: https://github.com/otcshare/acpica/commit/5869690a Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek Tested-by: David Woodhouse Reviewed-by: Jordan Justen git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14130 6f19259b-4bc3-4df7-8a09-765794883524 --- OvmfPkg/AcpiPlatformDxe/Qemu.c | 58 ++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/OvmfPkg/AcpiPlatformDxe/Qemu.c b/OvmfPkg/AcpiPlatformDxe/Qemu.c index 35d667fe3a..8a6ecf75b3 100644 --- a/OvmfPkg/AcpiPlatformDxe/Qemu.c +++ b/OvmfPkg/AcpiPlatformDxe/Qemu.c @@ -200,16 +200,20 @@ typedef struct { } FIRMWARE_DATA; typedef struct { - UINT8 NameOp; - UINT8 RootChar; - UINT8 NameChar[4]; - UINT8 PackageOp; - UINT8 PkgLength; - UINT8 NumElements; - UINT8 DWordPrefix; - UINT8 Pm1aCntSlpTyp; - UINT8 Pm1bCntSlpTyp; - UINT8 Reserved[2]; + UINT8 BytePrefix; + UINT8 ByteValue; +} AML_BYTE; + +typedef struct { + UINT8 NameOp; + UINT8 RootChar; + UINT8 NameChar[4]; + UINT8 PackageOp; + UINT8 PkgLength; + UINT8 NumElements; + AML_BYTE Pm1aCntSlpTyp; + AML_BYTE Pm1bCntSlpTyp; + AML_BYTE Reserved[2]; } SYSTEM_STATE_PACKAGE; #pragma pack() @@ -326,12 +330,14 @@ GetSuspendStates ( '\\', // RootChar { '_', 'S', 'x', '_' }, // NameChar[4] 0x12, // PackageOp - 0x07, // PkgLength - 0x01, // NumElements - 0x0c, // DWordPrefix - 0x00, // Pm1aCntSlpTyp - 0x00, // Pm1bCntSlpTyp -- we don't support it - { 0x00, 0x00 } // Reserved + 0x0A, // PkgLength + 0x04, // NumElements + { 0x0A, 0x00 }, // Pm1aCntSlpTyp + { 0x0A, 0x00 }, // Pm1bCntSlpTyp -- we don't support it + { // Reserved[2] + { 0x0A, 0x00 }, + { 0x0A, 0x00 } + } }; RETURN_STATUS Status; FIRMWARE_CONFIG_ITEM FwCfgItem; @@ -343,13 +349,13 @@ GetSuspendStates ( // *SuspendToRamSize = sizeof Template; CopyMem (SuspendToRam, &Template, sizeof Template); - SuspendToRam->NameChar[2] = '3'; // S3 - SuspendToRam->Pm1aCntSlpTyp = 1; // PIIX4: STR + SuspendToRam->NameChar[2] = '3'; // S3 + SuspendToRam->Pm1aCntSlpTyp.ByteValue = 1; // PIIX4: STR *SuspendToDiskSize = sizeof Template; CopyMem (SuspendToDisk, &Template, sizeof Template); - SuspendToDisk->NameChar[2] = '4'; // S4 - SuspendToDisk->Pm1aCntSlpTyp = 2; // PIIX4: POSCL + SuspendToDisk->NameChar[2] = '4'; // S4 + SuspendToDisk->Pm1aCntSlpTyp.ByteValue = 2; // PIIX4: POSCL // // check for overrides @@ -368,16 +374,20 @@ GetSuspendStates ( // value to be written to the PM control register's SUS_TYP bits. // if (SystemStates[3] & BIT7) { - SuspendToRam->Pm1aCntSlpTyp = SystemStates[3] & (BIT2 | BIT1 | BIT0); - DEBUG ((DEBUG_INFO, "ACPI S3 value: %d\n", SuspendToRam->Pm1aCntSlpTyp)); + SuspendToRam->Pm1aCntSlpTyp.ByteValue = + SystemStates[3] & (BIT2 | BIT1 | BIT0); + DEBUG ((DEBUG_INFO, "ACPI S3 value: %d\n", + SuspendToRam->Pm1aCntSlpTyp.ByteValue)); } else { *SuspendToRamSize = 0; DEBUG ((DEBUG_INFO, "ACPI S3 disabled\n")); } if (SystemStates[4] & BIT7) { - SuspendToDisk->Pm1aCntSlpTyp = SystemStates[4] & (BIT2 | BIT1 | BIT0); - DEBUG ((DEBUG_INFO, "ACPI S4 value: %d\n", SuspendToDisk->Pm1aCntSlpTyp)); + SuspendToDisk->Pm1aCntSlpTyp.ByteValue = + SystemStates[4] & (BIT2 | BIT1 | BIT0); + DEBUG ((DEBUG_INFO, "ACPI S4 value: %d\n", + SuspendToDisk->Pm1aCntSlpTyp.ByteValue)); } else { *SuspendToDiskSize = 0; DEBUG ((DEBUG_INFO, "ACPI S4 disabled\n"));