X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=OvmfPkg%2FSec%2FSecMain.c;h=670ad8d763aab0dc3a5f8215ee57c96a3cf7c6dd;hp=0edc4f9af3cfbfee0f73c4d78f105a5ed0e7d939;hb=a781f7099bc2584fd065f1947bedd49adfea0fa5;hpb=bd386eaf86f1f55dd28d2c5b26a8c80b2a9002a8 diff --git a/OvmfPkg/Sec/SecMain.c b/OvmfPkg/Sec/SecMain.c index 0edc4f9af3..670ad8d763 100644 --- a/OvmfPkg/Sec/SecMain.c +++ b/OvmfPkg/Sec/SecMain.c @@ -469,6 +469,50 @@ FindPeiCoreImageBaseInFv ( return EFI_SUCCESS; } + +/** + Reads 8-bits of CMOS data. + + Reads the 8-bits of CMOS data at the location specified by Index. + The 8-bit read value is returned. + + @param Index The CMOS location to read. + + @return The value read. + +**/ +STATIC +UINT8 +CmosRead8 ( + IN UINTN Index + ) +{ + IoWrite8 (0x70, (UINT8) Index); + return IoRead8 (0x71); +} + + +STATIC +BOOLEAN +IsS3Resume ( + VOID + ) +{ + return (CmosRead8 (0xF) == 0xFE); +} + + +STATIC +EFI_STATUS +GetS3ResumePeiFv ( + IN OUT EFI_FIRMWARE_VOLUME_HEADER **PeiFv + ) +{ + *PeiFv = (EFI_FIRMWARE_VOLUME_HEADER*)(UINTN) PcdGet32 (PcdOvmfPeiMemFvBase); + return EFI_SUCCESS; +} + + /** Locates the PEI Core entry point address @@ -488,9 +532,15 @@ FindPeiCoreImageBase ( { *PeiCoreImageBase = 0; - FindMainFv (BootFv); + if (IsS3Resume ()) { + DEBUG ((EFI_D_VERBOSE, "SEC: S3 resume\n")); + GetS3ResumePeiFv (BootFv); + } else { + DEBUG ((EFI_D_VERBOSE, "SEC: Normal boot\n")); + FindMainFv (BootFv); - DecompressMemFvs (BootFv); + DecompressMemFvs (BootFv); + } FindPeiCoreImageBaseInFv (*BootFv, PeiCoreImageBase); }