From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (NAM12-DM6-obe.outbound.protection.outlook.com [40.107.243.55]) by mx.groups.io with SMTP id smtpd.web11.4479.1583245586285866127 for ; Tue, 03 Mar 2020 06:26:26 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@amdcloud.onmicrosoft.com header.s=selector2-amdcloud-onmicrosoft-com header.b=MSMf2Wvu; spf=none, err=SPF record not found (domain: amd.com, ip: 40.107.243.55, mailfrom: thomas.lendacky@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=FzMnyWzIBcx1wderYBwnvZdUO1tyX9vNTxvFmNCCyoc3lPE3wzcNl6dfU1XYrxgcNZV1ffffxu6lJq8JdTc2hXU082VcuAafOD2XLUH4M8gepCFrtK7lgeunnrXGpITfOytd43JkN8TkVRgp2ffMyCFlbnjlaNi6B2KEgse8vE8uwnM2WUCpmNpQy9kvlP7JU6HxYkox1jnSFPmTyARhg0Jcz5N4J60TERLDpW/bUGT3zAlxX1nv5QFusNrdEuL3VMDtOwOacMJthXB2b+d0ofigH1MEK/q2zLeeFaxGlpPW8+e3Qyjh0hiFjuQFO46yBbjYCZya7BaRgIsPH5wIDw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ydECM4cfMD5SXKJ9NzRVCFA2lFbeNWW35HxeZM9SLt4=; b=AgoqHN3bcf/Axf2sr4bzs+pgR1nxmwvYJmwqEjsD35ZJ9BwHKjkJc3o2cZGQGAEymYtK9HEvOmNYLsHFXfDGfHfxbdwZBeijYU2yoW+A2rVlwheC0U399O42gt/GPKb5PxaEpn0D96LNWL+DyDhpH8bgHaHfpPbKoCaEvgwZVKd4RxA5uyG4kj0dtCfPlpLLMhKXCAwtR/EU2hDo0xB1Sd63CrvdVUIOWz9BUV2fo+pR9ZDOTwvFNYw403DhOYSNptXJ/N7q9b5YJx8PNyBWkjFUfihC7g7S5a+gEJA/YT2VXaWM4drjiNdBIP6MPSzMF2M4d6UBAuYtQkSZvdw7PQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector2-amdcloud-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ydECM4cfMD5SXKJ9NzRVCFA2lFbeNWW35HxeZM9SLt4=; b=MSMf2Wvu4ynJ6GCEhwcB3cfdD5vtimWUSuSLT4nmE2tb+CzzT0WtokwZWhd9SgGDisL3jb7m0VCWAa/lk7iK+jpXDvgda+HIWEeXmvLxnwCtUkVvN6PUAxGr0bY9gJ8wAfKY0dHN5cjsiLQGaUM5sAgsXZEkZ6sHYadiA4mOtlc= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Thomas.Lendacky@amd.com; Received: from DM6PR12MB3163.namprd12.prod.outlook.com (2603:10b6:5:15e::26) by DM6PR12MB2697.namprd12.prod.outlook.com (2603:10b6:5:49::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2772.19; Tue, 3 Mar 2020 14:26:25 +0000 Received: from DM6PR12MB3163.namprd12.prod.outlook.com ([fe80::f0f9:a88f:f840:2733]) by DM6PR12MB3163.namprd12.prod.outlook.com ([fe80::f0f9:a88f:f840:2733%7]) with mapi id 15.20.2772.019; Tue, 3 Mar 2020 14:26:25 +0000 Subject: Re: [edk2-devel] [PATCH v5 36/42] OvmfPkg/QemuFlashFvbServicesRuntimeDxe: Bypass flash detection with SEV-ES is enabled To: Laszlo Ersek , devel@edk2.groups.io Cc: Jordan Justen , Ard Biesheuvel , Michael D Kinney , Liming Gao , Eric Dong , Ray Ni , Brijesh Singh References: <05bb0fa97078cbaeac5d6388c25a7b203fb62286.1583190432.git.thomas.lendacky@amd.com> From: "Lendacky, Thomas" Message-ID: <2b8f8a99-a299-94d7-6a8a-96f7e13ce218@amd.com> Date: Tue, 3 Mar 2020 08:26:23 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.4.1 In-Reply-To: X-ClientProxiedBy: SN4PR0501CA0031.namprd05.prod.outlook.com (2603:10b6:803:40::44) To DM6PR12MB3163.namprd12.prod.outlook.com (2603:10b6:5:15e::26) Return-Path: thomas.lendacky@amd.com MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [10.236.30.74] (165.204.77.1) by SN4PR0501CA0031.namprd05.prod.outlook.com (2603:10b6:803:40::44) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2793.9 via Frontend Transport; Tue, 3 Mar 2020 14:26:24 +0000 X-Originating-IP: [165.204.77.1] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 60b70d6d-9cef-4ff8-f90d-08d7bf7eda6c X-MS-TrafficTypeDiagnostic: DM6PR12MB2697:|DM6PR12MB2697: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-Forefront-PRVS: 03319F6FEF X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4636009)(376002)(396003)(346002)(366004)(136003)(39860400002)(189003)(199004)(956004)(8936002)(478600001)(16526019)(186003)(66946007)(5660300002)(6486002)(36756003)(2616005)(19627235002)(81156014)(81166006)(31696002)(8676002)(86362001)(54906003)(26005)(966005)(4326008)(66556008)(53546011)(316002)(2906002)(66476007)(16576012)(52116002)(45080400002)(31686004)(213903007);DIR:OUT;SFP:1101;SCL:1;SRVR:DM6PR12MB2697;H:DM6PR12MB3163.namprd12.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: qec62KU2KZ3R+G7NYiWm+7XoifwtAIdB4/KnQHeSLeemn5UaQ9IyctunV7aX6kGB3R48tQT3NIABM6xu18rFbF6CLkn5oa8BJluLJotoC3N0VQGmhSSRhICMZgcQr5pCDUP8mn7Qe2VALnqPmu91jNgn+eWa4KXgLdoddMbnX1D16XKiU9deEMS4GguuO0Pn2lpCkQYhp8zk3oNmGw8IYnkleb2ATc3dy2BTX+D7ziHNoWmJbrmz/douYzxCNWvvktSHQuBCPTopxdM6zGbEN45EXK57kCz/LEnW7zot1c6SnyjteQNvCq9W3Z5h62ChSqWxFf1vHeq9dMCMj3Aff/1RRIVOuX7gOEauB+/jfNmEDxkCypdsNJI5Gw8NPTeSAFil22ut+ORNDW422AHp9z3KRc0oXqLqXHWIS3trX3rBjfrNiSnMFSHrJBJjvhdHjIASd/g9D/5Bwaz08lKtsLF46KDKHKS4KlPin514sJzGp0z/HcjoTRVaep1EhG0EHtDm8VPCtyGrUO7iUhShztAjRhkEziXk0f/B3GuTWD47Dcut1baGf0kawIFrrvBb0hsNN833A6EK9GzzcZRPCA== X-MS-Exchange-AntiSpam-MessageData: P6Ncp6bnwyOZyK4wWV43uvi9IzGe01F+G93IEpHTiKminQCrfEZLdhdf+f/1QhF/wS/uh5MU8muqzpqU0WdJkT1jObqLeJzFwHmYix3+WR5eUuKhan28t5kT803nx75Vh6hBOToF6vOoP0HEUO+zQA== X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 60b70d6d-9cef-4ff8-f90d-08d7bf7eda6c X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Mar 2020 14:26:24.9302 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: vl+36Ny4MCKVn/P9VEUxirWTbF4lXluZSsnM43W5Ee50Pz5yTh51iZd+HC9B668K9cFJtcc2bYG8quhlplzOHQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB2697 Content-Type: text/plain; charset=windows-1252 Content-Language: en-US Content-Transfer-Encoding: 7bit On 3/3/20 6:33 AM, Laszlo Ersek wrote: > Hi Tom, > > On 03/03/20 00:07, Lendacky, Thomas wrote: >> BZ: https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugzilla.tianocore.org%2Fshow_bug.cgi%3Fid%3D2198&data=02%7C01%7Cthomas.lendacky%40amd.com%7Cec51d6f2d119454bdbc508d7bf6f127a%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637188356100831031&sdata=h7GUpHnIH8kilQY9wvXwvIujG6YU5PgYl5wYK2rP2Eg%3D&reserved=0 >> >> The flash detection routine will attempt to determine how the flash >> device behaves (e.g. ROM, RAM, Flash). But when SEV-ES is enabled and >> the flash device behaves as a ROM device (meaning it is marked read-only >> by the hypervisor), this check may result in an infinite nested page fault >> because of the attempted write. Since the instruction cannot be emulated >> when SEV-ES is enabled, the RIP is never advanced, resulting in repeated >> nested page faults. >> >> When SEV-ES is enabled, exit the flash detection early and assume that >> the FD behaves as Flash. This will result in QemuFlashWrite() being called >> to store EFI variables, which will also result in an infinite nested page >> fault when the write is performed. In this case, update QemuFlashWrite() >> to use the VmgMmioWrite function from the VmgExitLib library to have the >> hypervisor perform the write without having to emulate the instruction. >> >> Cc: Jordan Justen >> Cc: Laszlo Ersek >> Cc: Ard Biesheuvel >> Reviewed-by: Laszlo Ersek >> Signed-off-by: Tom Lendacky >> --- >> OvmfPkg/OvmfPkgIa32.dsc | 1 + >> OvmfPkg/OvmfPkgIa32X64.dsc | 1 + >> OvmfPkg/OvmfPkgX64.dsc | 1 + > > I asked for these lib class resolutions to be dropped, under v4. Hmmm... I thought I had when I consolidated the library references, but obviously I didn't. I'll fix that up. Thanks, Tom > > https://nam11.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmid.mail-archive.com%2F53e0bc61-5105-1597-7add-86e038015e15%40redhat.com&data=02%7C01%7Cthomas.lendacky%40amd.com%7Cec51d6f2d119454bdbc508d7bf6f127a%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637188356100841024&sdata=QrbXlgrKDVhspRRKaXPUSaD5KJ5u7vZ9q6yQ70SKSWM%3D&reserved=0 > > Laszlo > >> .../FvbServicesRuntimeDxe.inf | 2 ++ >> .../QemuFlash.h | 6 +++++ >> .../QemuFlash.c | 23 ++++++++++++++++--- >> .../QemuFlashDxe.c | 15 ++++++++++++ >> .../QemuFlashSmm.c | 9 ++++++++ >> 8 files changed, 55 insertions(+), 3 deletions(-) >> >> diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc >> index 51d7acafdda3..2531b7edccf5 100644 >> --- a/OvmfPkg/OvmfPkgIa32.dsc >> +++ b/OvmfPkg/OvmfPkgIa32.dsc >> @@ -318,6 +318,7 @@ [LibraryClasses.common.DXE_RUNTIME_DRIVER] >> BaseCryptLib|CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf >> PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf >> QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf >> + VmgExitLib|UefiCpuPkg/Library/VmgExitLib/VmgExitLib.inf >> >> [LibraryClasses.common.UEFI_DRIVER] >> PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf >> diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc >> index 764fa8c287a0..629725ef2b44 100644 >> --- a/OvmfPkg/OvmfPkgIa32X64.dsc >> +++ b/OvmfPkg/OvmfPkgIa32X64.dsc >> @@ -323,6 +323,7 @@ [LibraryClasses.common.DXE_RUNTIME_DRIVER] >> BaseCryptLib|CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf >> PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf >> QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf >> + VmgExitLib|UefiCpuPkg/Library/VmgExitLib/VmgExitLib.inf >> >> [LibraryClasses.common.UEFI_DRIVER] >> PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf >> diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc >> index b6e29e09db97..74076cbe7692 100644 >> --- a/OvmfPkg/OvmfPkgX64.dsc >> +++ b/OvmfPkg/OvmfPkgX64.dsc >> @@ -323,6 +323,7 @@ [LibraryClasses.common.DXE_RUNTIME_DRIVER] >> BaseCryptLib|CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf >> PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf >> QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf >> + VmgExitLib|UefiCpuPkg/Library/VmgExitLib/VmgExitLib.inf >> >> [LibraryClasses.common.UEFI_DRIVER] >> PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf >> diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf >> index 8125fd0735a1..3ce19d1bfa8e 100644 >> --- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf >> +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf >> @@ -38,6 +38,7 @@ [Sources] >> [Packages] >> MdePkg/MdePkg.dec >> MdeModulePkg/MdeModulePkg.dec >> + UefiCpuPkg/UefiCpuPkg.dec >> OvmfPkg/OvmfPkg.dec >> >> [LibraryClasses] >> @@ -52,6 +53,7 @@ [LibraryClasses] >> UefiBootServicesTableLib >> UefiDriverEntryPoint >> UefiRuntimeLib >> + VmgExitLib >> >> [Guids] >> gEfiEventVirtualAddressChangeGuid # ALWAYS_CONSUMED >> diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.h b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.h >> index f1afabcbe6ae..19ac1f733279 100644 >> --- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.h >> +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.h >> @@ -89,5 +89,11 @@ QemuFlashBeforeProbe ( >> IN UINTN FdBlockCount >> ); >> >> +VOID >> +QemuFlashPtrWrite ( >> + IN volatile UINT8 *Ptr, >> + IN UINT8 Value >> + ); >> + >> #endif >> >> diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.c b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.c >> index c81c58972bf2..ccf5ad7f7afb 100644 >> --- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.c >> +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.c >> @@ -9,6 +9,7 @@ >> >> #include >> #include >> +#include >> #include >> >> #include "QemuFlash.h" >> @@ -80,6 +81,21 @@ QemuFlashDetected ( >> >> DEBUG ((EFI_D_INFO, "QEMU Flash: Attempting flash detection at %p\n", Ptr)); >> >> + if (MemEncryptSevEsIsEnabled()) { >> + // >> + // When SEV-ES is enabled, the check below can result in an infinite >> + // loop with respect to a nested page fault. When the memslot is mapped >> + // read-only, the nested page table entry is read-only. The check below >> + // will cause a nested page fault that cannot be emulated, causing >> + // the instruction to retried over and over. For SEV-ES, acknowledge that >> + // the FD appears as ROM and not as FLASH, but report FLASH anyway because >> + // FLASH behavior can be simulated using VMGEXIT. >> + // >> + DEBUG ((DEBUG_INFO, >> + "QEMU Flash: SEV-ES enabled, assuming FD behaves as FLASH\n")); >> + return TRUE; >> + } >> + >> OriginalUint8 = *Ptr; >> *Ptr = CLEAR_STATUS_CMD; >> ProbeUint8 = *Ptr; >> @@ -181,8 +197,9 @@ QemuFlashWrite ( >> // >> Ptr = QemuFlashPtr (Lba, Offset); >> for (Loop = 0; Loop < *NumBytes; Loop++) { >> - *Ptr = WRITE_BYTE_CMD; >> - *Ptr = Buffer[Loop]; >> + QemuFlashPtrWrite (Ptr, WRITE_BYTE_CMD); >> + QemuFlashPtrWrite (Ptr, Buffer[Loop]); >> + >> Ptr++; >> } >> >> @@ -190,7 +207,7 @@ QemuFlashWrite ( >> // Restore flash to read mode >> // >> if (*NumBytes > 0) { >> - *(Ptr - 1) = READ_ARRAY_CMD; >> + QemuFlashPtrWrite (Ptr - 1, READ_ARRAY_CMD); >> } >> >> return EFI_SUCCESS; >> diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlashDxe.c b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlashDxe.c >> index 5aabe9d7b59c..939463a8e17c 100644 >> --- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlashDxe.c >> +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlashDxe.c >> @@ -10,6 +10,8 @@ >> **/ >> >> #include >> +#include >> +#include >> >> #include "QemuFlash.h" >> >> @@ -32,3 +34,16 @@ QemuFlashBeforeProbe ( >> // Do nothing >> // >> } >> + >> +VOID >> +QemuFlashPtrWrite ( >> + IN volatile UINT8 *Ptr, >> + IN UINT8 Value >> + ) >> +{ >> + if (MemEncryptSevEsIsEnabled()) { >> + VmgMmioWrite ((UINT8 *) Ptr, &Value, 1); >> + } else { >> + *Ptr = Value; >> + } >> +} >> diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlashSmm.c b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlashSmm.c >> index 7eb426e03855..eff40ae28032 100644 >> --- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlashSmm.c >> +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlashSmm.c >> @@ -46,3 +46,12 @@ QemuFlashBeforeProbe ( >> ); >> ASSERT_EFI_ERROR (Status); >> } >> + >> +VOID >> +QemuFlashPtrWrite ( >> + IN volatile UINT8 *Ptr, >> + IN UINT8 Value >> + ) >> +{ >> + *Ptr = Value; >> +} >> >