Skip to content

Commit

Permalink
OvmfPkg/AcpiPlatformDxe: split S3/S4 package into bytes
Browse files Browse the repository at this point in the history
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 <[email protected]>
Tested-by: David Woodhouse <[email protected]>
Reviewed-by: Jordan Justen <[email protected]>

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14130 6f19259b-4bc3-4df7-8a09-765794883524
jljusten committed Feb 14, 2013

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent 54c9a68 commit 3d80db5
Showing 1 changed file with 34 additions and 24 deletions.
58 changes: 34 additions & 24 deletions OvmfPkg/AcpiPlatformDxe/Qemu.c
Original file line number Diff line number Diff line change
@@ -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"));

0 comments on commit 3d80db5

Please sign in to comment.