From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (NAM11-DM6-obe.outbound.protection.outlook.com [40.107.223.83]) by mx.groups.io with SMTP id smtpd.web08.593.1604685232351302063 for ; Fri, 06 Nov 2020 09:53:52 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@amdcloud.onmicrosoft.com header.s=selector2-amdcloud-onmicrosoft-com header.b=xaYmSM31; spf=none, err=SPF record not found (domain: amd.com, ip: 40.107.223.83, mailfrom: thomas.lendacky@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=il9oStmIweXuqiqaWBapBI6DLkzeDE/UgmZpuTrdBR3eb4XEYSxrkY5Nte6EIvBzcS1Xx0aK5/16aHH2USYisqHqbrp72lbOjMTtviM9gkf28qjW6j0PT8v4+/3ZwTmoi9XZc/43RcAuLbUoW8/rLEIfeyuZYdl/gDh22eUxi2d7aGd0CXaobnrebHv1VaOLnVWBe+JMVn5VVfNLMrQ1TaBccj9KABZGB2jgIVa7pnS+/CQP8MiFwgVHGuZpHVEcRqlIDtCtOLdPqiGqvClWoojZXtqNcKo2FG6sEEwyiucaQ9XJFOL11ZLIzgQvSgVLdt9MG7FERiQznmDwetQy7w== 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=IR//qSoYbrMNyS20r8rsUYpi7HMVjVjpqeBDsmhthe8=; b=DHTREM6QTE9bf78VCIcBCfHPprYqGqF9b0hW0r1K2z8MeSbYSEEnTj3+/IeBjAH+f/n1X+pmfqsCvYbS4WPFsq0HMucL5JkUphC8uxMM+X/RkWisNfBKeW+sZLNBwxiDmUNAwlKyGEbYFlsWYzSUoYcXNu+ge98iNSvmT+H2F3GOWkcylqeRB5XDUcifQTq9P/tOBD9lJvqrvUPovoEsdEZNeaCrIgotpD12PR4XHaQRMCm58IjVfWi0Wiu81lf4WWfei/xL9bkKP0lau+ph0utsQ+t0crGjwPh8gxRC/O3sZpTq3YK4x+qdN4i7so4t6+hJJRS2mX1nUpNJGByPqQ== 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=IR//qSoYbrMNyS20r8rsUYpi7HMVjVjpqeBDsmhthe8=; b=xaYmSM31PjWjbgdAwEKfBxbpL9/Ji92YdPoeWFRHQ1zTXmC1R+ddUnUlwghSdU0L91Z5LD47HfX7OmtuOtQsFwkdQUMWBf3ZZxU8MTLeiTAGpz3zoBPeaDbO/bCOCWxPbQX55SSDT9TDjDUQ2pbLSQY1xWBm9UCjX64k1pVMOxk= Authentication-Results: edk2.groups.io; dkim=none (message not signed) header.d=none;edk2.groups.io; dmarc=none action=none header.from=amd.com; Received: from DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM6PR12MB4385.namprd12.prod.outlook.com (2603:10b6:5:2a6::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3541.21; Fri, 6 Nov 2020 17:53:51 +0000 Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::e442:c052:8a2c:5fba]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::e442:c052:8a2c:5fba%6]) with mapi id 15.20.3499.032; Fri, 6 Nov 2020 17:53:51 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io CC: Brijesh Singh , Jordan Justen , Laszlo Ersek , Ard Biesheuvel Subject: [PATCH v4 03/11] OvmfPkg/VmgExitLib: Implement new VmgExitLib interfaces Date: Fri, 6 Nov 2020 11:53:05 -0600 Message-ID: <939e9dc375e6085bc67942fe9a00ecd4c6b77ecf.1604685192.git.thomas.lendacky@amd.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: References: X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: DM6PR17CA0020.namprd17.prod.outlook.com (2603:10b6:5:1b3::33) To DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) Return-Path: thomas.lendacky@amd.com MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from tlendack-t1.amd.com (165.204.77.1) by DM6PR17CA0020.namprd17.prod.outlook.com (2603:10b6:5:1b3::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3499.19 via Frontend Transport; Fri, 6 Nov 2020 17:53:50 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: e55f89cd-b46f-463b-bf58-08d8827ceb6b X-MS-TrafficTypeDiagnostic: DM6PR12MB4385: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8882; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: TQtNnXggDHRRI+SasgMOCSXuGmbffKHv4tEjEeMjTmIFG0kDP1wga9+nMEukIKBf8c9jOSSitsScWD+EvA4Uu2tRUOoLMDIXmO3LLwF23DW7z0eEPlxVs2tLt1niIU+JhTZAyuVx9bsH2Q7rHCfKoA/UoWIYF1Tsq+ucEZEhqEIW2BKPRJRynUmflZUsd0W1MLibgTrOHyco7M9C6Py3v1f1ARJ48Xvg328665o/qRHbLLL2RM4SH+WJy0frCoPpWdopEcBC9oweGiNxezgWboyVK9+/vP4hMiIiOc0ritdr5ocMy4ZhB7qdgDHQ6w4S2XljpJj/4Oe7H4+d9cDhZDZdsxKn1sxbvK1ui9J4v6pjAHTv5eFjqy/k2mow6XeWEN8DdS9eBEkggD91p/2W4w== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM5PR12MB1355.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(366004)(376002)(136003)(346002)(396003)(39860400002)(316002)(966005)(86362001)(83380400001)(52116002)(7696005)(66946007)(5660300002)(6916009)(6666004)(8936002)(36756003)(8676002)(478600001)(66476007)(16526019)(26005)(2906002)(186003)(66556008)(6486002)(4326008)(54906003)(956004)(2616005);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData: MIKvF23X45etoWZZXAPuY+gp+MOs2ayCBvTXXeldbw+wjSucomh/YuJvopcIjOUF7TA0d2XDytE3IYvIqY/pCYA3CNMte/ujl9E8Couhh8ZXJgwDxmcW7UBUEpxOsbNRqqCkBDENwkmRW8rqkszvM21Yw0zx4WYZUkNQ3WADAgy/hBSfAft+6RsSYFdUiNhfF81XggTveDlaVnu7TkVpoL7cGE9zmtPdwNbmSjV3XY0uXE9SPD6xuo/Ux22IdjvorLSn9OE3bieRBNuHOmZBOWfhFRVQ9bUvgIPZ1yx/U4jWowZ3a4jrduzAskfwQvkN1IlJMVHjEtaXT0+wQ3FraHHQpaOpmKlhF9Mb3rZEroiFt3dvK4R6WHRio+QHjDy096YsX8KEzpP3lnsVWxxnqrGJxsQ5ts1iT7VTtfqgAAE85xBVTGbU4htkT78S6ZZmqT/4zGyG7l7awGVlHVjgzfJbf6/QhSmQP9vowhiyq0GcAwaNVhbMBNgWhAV3t8VgrR2z2OwJVdxJPgc0EKlHXXv9ir1o9QTNpvGyQ1SaEYABXliL70t3g8bsiSmUzToN+N0IRpwhblxNFYcVUiWuEGCEIiD1ZSMSt0Qto3D16mwAP6viSfcc8qN63eg8C8xOBJwyj0bhBuPeDNu/PbAqfg== X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: e55f89cd-b46f-463b-bf58-08d8827ceb6b X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Nov 2020 17:53:51.2286 (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: TiqMC0acwfdb2xZaFCQnoo/DNzjMS3pYB91G/p8qfhSx+QhaFWvrPRCyqOkgqzRebk6sbeGBZpufvbwQu1E4yg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4385 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable From: Tom Lendacky BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3008 The VmgExitLib library added two new interfaces, VmgSetOffsetValid() and VmgIsOffsetValid(), that must now be implemented in the OvmfPkg version of the library. Implement VmgSetOffsetValid() and VmgIsOffsetValid() and update existing code, that is directly accessing ValidBitmap, to use the new interfaces. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Tom Lendacky Cc: Brijesh Singh Reviewed-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/Library/VmgExitLib/VmgExitLib.c | 54 +++++++++ OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c | 118 +++++--------------- 2 files changed, 85 insertions(+), 87 deletions(-) diff --git a/OvmfPkg/Library/VmgExitLib/VmgExitLib.c b/OvmfPkg/Library/VmgE= xitLib/VmgExitLib.c index 53040cc6f649..21f68b19c94e 100644 --- a/OvmfPkg/Library/VmgExitLib/VmgExitLib.c +++ b/OvmfPkg/Library/VmgExitLib/VmgExitLib.c @@ -157,3 +157,57 @@ VmgDone ( { } =20 +/** + Marks a field at the specified offset as valid in the GHCB. + + The ValidBitmap area represents the areas of the GHCB that have been mar= ked + valid. Set the bit in ValidBitmap for the input offset. + + @param[in, out] Ghcb Pointer to the Guest-Hypervisor Communication Bl= ock + @param[in] Offset Qword offset in the GHCB to mark valid + +**/ +VOID +EFIAPI +VmgSetOffsetValid ( + IN OUT GHCB *Ghcb, + IN GHCB_REGISTER Offset + ) +{ + UINT32 OffsetIndex; + UINT32 OffsetBit; + + OffsetIndex =3D Offset / 8; + OffsetBit =3D Offset % 8; + + Ghcb->SaveArea.ValidBitmap[OffsetIndex] |=3D (1 << OffsetBit); +} + +/** + Checks if a specified offset is valid in the GHCB. + + The ValidBitmap area represents the areas of the GHCB that have been mar= ked + valid. Return whether the bit in the ValidBitmap is set for the input of= fset. + + @param[in] Ghcb A pointer to the GHCB + @param[in] Offset Qword offset in the GHCB to mark valid + + @retval TRUE Offset is marked valid in the GHCB + @retval FALSE Offset is not marked valid in the GHCB + +**/ +BOOLEAN +EFIAPI +VmgIsOffsetValid ( + IN GHCB *Ghcb, + IN GHCB_REGISTER Offset + ) +{ + UINT32 OffsetIndex; + UINT32 OffsetBit; + + OffsetIndex =3D Offset / 8; + OffsetBit =3D Offset % 8; + + return ((Ghcb->SaveArea.ValidBitmap[OffsetIndex] & (1 << OffsetBit)) != =3D 0); +} diff --git a/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c b/OvmfPkg/Librar= y/VmgExitLib/VmgExitVcHandler.c index 8e42b305e83c..7d14341d592b 100644 --- a/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c +++ b/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c @@ -135,62 +135,6 @@ typedef struct { } SEV_ES_PER_CPU_DATA; =20 =20 -/** - Checks the GHCB to determine if the specified register has been marked v= alid. - - The ValidBitmap area represents the areas of the GHCB that have been mar= ked - valid. Return an indication of whether the area of the GHCB that holds t= he - specified register has been marked valid. - - @param[in] Ghcb Pointer to the Guest-Hypervisor Communication Block - @param[in] Reg Offset in the GHCB of the register to check - - @retval TRUE Register has been marked vald in the GHCB - @retval FALSE Register has not been marked valid in the GHCB - -**/ -STATIC -BOOLEAN -GhcbIsRegValid ( - IN GHCB *Ghcb, - IN GHCB_REGISTER Reg - ) -{ - UINT32 RegIndex; - UINT32 RegBit; - - RegIndex =3D Reg / 8; - RegBit =3D Reg & 0x07; - - return ((Ghcb->SaveArea.ValidBitmap[RegIndex] & (1 << RegBit)) !=3D 0); -} - -/** - Marks a register as valid in the GHCB. - - The ValidBitmap area represents the areas of the GHCB that have been mar= ked - valid. Set the area of the GHCB that holds the specified register as val= id. - - @param[in, out] Ghcb Pointer to the Guest-Hypervisor Communication Bl= ock - @param[in] Reg Offset in the GHCB of the register to mark valid - -**/ -STATIC -VOID -GhcbSetRegValid ( - IN OUT GHCB *Ghcb, - IN GHCB_REGISTER Reg - ) -{ - UINT32 RegIndex; - UINT32 RegBit; - - RegIndex =3D Reg / 8; - RegBit =3D Reg & 0x07; - - Ghcb->SaveArea.ValidBitmap[RegIndex] |=3D (1 << RegBit); -} - /** Return a pointer to the contents of the specified register. =20 @@ -891,9 +835,9 @@ MwaitExit ( DecodeModRm (Regs, InstructionData); =20 Ghcb->SaveArea.Rax =3D Regs->Rax; - GhcbSetRegValid (Ghcb, GhcbRax); + VmgSetOffsetValid (Ghcb, GhcbRax); Ghcb->SaveArea.Rcx =3D Regs->Rcx; - GhcbSetRegValid (Ghcb, GhcbRcx); + VmgSetOffsetValid (Ghcb, GhcbRcx); =20 return VmgExit (Ghcb, SVM_EXIT_MWAIT, 0, 0); } @@ -923,11 +867,11 @@ MonitorExit ( DecodeModRm (Regs, InstructionData); =20 Ghcb->SaveArea.Rax =3D Regs->Rax; // Identity mapped, so VA =3D PA - GhcbSetRegValid (Ghcb, GhcbRax); + VmgSetOffsetValid (Ghcb, GhcbRax); Ghcb->SaveArea.Rcx =3D Regs->Rcx; - GhcbSetRegValid (Ghcb, GhcbRcx); + VmgSetOffsetValid (Ghcb, GhcbRcx); Ghcb->SaveArea.Rdx =3D Regs->Rdx; - GhcbSetRegValid (Ghcb, GhcbRdx); + VmgSetOffsetValid (Ghcb, GhcbRdx); =20 return VmgExit (Ghcb, SVM_EXIT_MONITOR, 0, 0); } @@ -988,9 +932,9 @@ RdtscpExit ( return Status; } =20 - if (!GhcbIsRegValid (Ghcb, GhcbRax) || - !GhcbIsRegValid (Ghcb, GhcbRcx) || - !GhcbIsRegValid (Ghcb, GhcbRdx)) { + if (!VmgIsOffsetValid (Ghcb, GhcbRax) || + !VmgIsOffsetValid (Ghcb, GhcbRcx) || + !VmgIsOffsetValid (Ghcb, GhcbRdx)) { return UnsupportedExit (Ghcb, Regs, InstructionData); } Regs->Rax =3D Ghcb->SaveArea.Rax; @@ -1027,16 +971,16 @@ VmmCallExit ( DecodeModRm (Regs, InstructionData); =20 Ghcb->SaveArea.Rax =3D Regs->Rax; - GhcbSetRegValid (Ghcb, GhcbRax); + VmgSetOffsetValid (Ghcb, GhcbRax); Ghcb->SaveArea.Cpl =3D (UINT8) (Regs->Cs & 0x3); - GhcbSetRegValid (Ghcb, GhcbCpl); + VmgSetOffsetValid (Ghcb, GhcbCpl); =20 Status =3D VmgExit (Ghcb, SVM_EXIT_VMMCALL, 0, 0); if (Status !=3D 0) { return Status; } =20 - if (!GhcbIsRegValid (Ghcb, GhcbRax)) { + if (!VmgIsOffsetValid (Ghcb, GhcbRax)) { return UnsupportedExit (Ghcb, Regs, InstructionData); } Regs->Rax =3D Ghcb->SaveArea.Rax; @@ -1074,15 +1018,15 @@ MsrExit ( case 0x30: // WRMSR ExitInfo1 =3D 1; Ghcb->SaveArea.Rax =3D Regs->Rax; - GhcbSetRegValid (Ghcb, GhcbRax); + VmgSetOffsetValid (Ghcb, GhcbRax); Ghcb->SaveArea.Rdx =3D Regs->Rdx; - GhcbSetRegValid (Ghcb, GhcbRdx); + VmgSetOffsetValid (Ghcb, GhcbRdx); // // fall through // case 0x32: // RDMSR Ghcb->SaveArea.Rcx =3D Regs->Rcx; - GhcbSetRegValid (Ghcb, GhcbRcx); + VmgSetOffsetValid (Ghcb, GhcbRcx); break; default: return UnsupportedExit (Ghcb, Regs, InstructionData); @@ -1094,8 +1038,8 @@ MsrExit ( } =20 if (ExitInfo1 =3D=3D 0) { - if (!GhcbIsRegValid (Ghcb, GhcbRax) || - !GhcbIsRegValid (Ghcb, GhcbRdx)) { + if (!VmgIsOffsetValid (Ghcb, GhcbRax) || + !VmgIsOffsetValid (Ghcb, GhcbRdx)) { return UnsupportedExit (Ghcb, Regs, InstructionData); } Regs->Rax =3D Ghcb->SaveArea.Rax; @@ -1311,7 +1255,7 @@ IoioExit ( } else { CopyMem (&Ghcb->SaveArea.Rax, &Regs->Rax, IOIO_DATA_BYTES (ExitInfo1= )); } - GhcbSetRegValid (Ghcb, GhcbRax); + VmgSetOffsetValid (Ghcb, GhcbRax); =20 Status =3D VmgExit (Ghcb, SVM_EXIT_IOIO_PROT, ExitInfo1, 0); if (Status !=3D 0) { @@ -1319,7 +1263,7 @@ IoioExit ( } =20 if ((ExitInfo1 & IOIO_TYPE_IN) !=3D 0) { - if (!GhcbIsRegValid (Ghcb, GhcbRax)) { + if (!VmgIsOffsetValid (Ghcb, GhcbRax)) { return UnsupportedExit (Ghcb, Regs, InstructionData); } CopyMem (&Regs->Rax, &Ghcb->SaveArea.Rax, IOIO_DATA_BYTES (ExitInfo1= )); @@ -1379,15 +1323,15 @@ CpuidExit ( UINT64 Status; =20 Ghcb->SaveArea.Rax =3D Regs->Rax; - GhcbSetRegValid (Ghcb, GhcbRax); + VmgSetOffsetValid (Ghcb, GhcbRax); Ghcb->SaveArea.Rcx =3D Regs->Rcx; - GhcbSetRegValid (Ghcb, GhcbRcx); + VmgSetOffsetValid (Ghcb, GhcbRcx); if (Regs->Rax =3D=3D CPUID_EXTENDED_STATE) { IA32_CR4 Cr4; =20 Cr4.UintN =3D AsmReadCr4 (); Ghcb->SaveArea.XCr0 =3D (Cr4.Bits.OSXSAVE =3D=3D 1) ? AsmXGetBv (0) : = 1; - GhcbSetRegValid (Ghcb, GhcbXCr0); + VmgSetOffsetValid (Ghcb, GhcbXCr0); } =20 Status =3D VmgExit (Ghcb, SVM_EXIT_CPUID, 0, 0); @@ -1395,10 +1339,10 @@ CpuidExit ( return Status; } =20 - if (!GhcbIsRegValid (Ghcb, GhcbRax) || - !GhcbIsRegValid (Ghcb, GhcbRbx) || - !GhcbIsRegValid (Ghcb, GhcbRcx) || - !GhcbIsRegValid (Ghcb, GhcbRdx)) { + if (!VmgIsOffsetValid (Ghcb, GhcbRax) || + !VmgIsOffsetValid (Ghcb, GhcbRbx) || + !VmgIsOffsetValid (Ghcb, GhcbRcx) || + !VmgIsOffsetValid (Ghcb, GhcbRdx)) { return UnsupportedExit (Ghcb, Regs, InstructionData); } Regs->Rax =3D Ghcb->SaveArea.Rax; @@ -1434,15 +1378,15 @@ RdpmcExit ( UINT64 Status; =20 Ghcb->SaveArea.Rcx =3D Regs->Rcx; - GhcbSetRegValid (Ghcb, GhcbRcx); + VmgSetOffsetValid (Ghcb, GhcbRcx); =20 Status =3D VmgExit (Ghcb, SVM_EXIT_RDPMC, 0, 0); if (Status !=3D 0) { return Status; } =20 - if (!GhcbIsRegValid (Ghcb, GhcbRax) || - !GhcbIsRegValid (Ghcb, GhcbRdx)) { + if (!VmgIsOffsetValid (Ghcb, GhcbRax) || + !VmgIsOffsetValid (Ghcb, GhcbRdx)) { return UnsupportedExit (Ghcb, Regs, InstructionData); } Regs->Rax =3D Ghcb->SaveArea.Rax; @@ -1480,8 +1424,8 @@ RdtscExit ( return Status; } =20 - if (!GhcbIsRegValid (Ghcb, GhcbRax) || - !GhcbIsRegValid (Ghcb, GhcbRdx)) { + if (!VmgIsOffsetValid (Ghcb, GhcbRax) || + !VmgIsOffsetValid (Ghcb, GhcbRdx)) { return UnsupportedExit (Ghcb, Regs, InstructionData); } Regs->Rax =3D Ghcb->SaveArea.Rax; @@ -1531,7 +1475,7 @@ Dr7WriteExit ( // Using a value of 0 for ExitInfo1 means RAX holds the value // Ghcb->SaveArea.Rax =3D *Register; - GhcbSetRegValid (Ghcb, GhcbRax); + VmgSetOffsetValid (Ghcb, GhcbRax); =20 Status =3D VmgExit (Ghcb, SVM_EXIT_DR7_WRITE, 0, 0); if (Status !=3D 0) { --=20 2.28.0