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.51]) by mx.groups.io with SMTP id smtpd.web10.10759.1591363684874903205 for ; Fri, 05 Jun 2020 06:28:04 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@amdcloud.onmicrosoft.com header.s=selector2-amdcloud-onmicrosoft-com header.b=gg6igGgw; spf=none, err=SPF record not found (domain: amd.com, ip: 40.107.243.51, mailfrom: thomas.lendacky@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=GF8ojZqhm3DY4QpiDiV5wqNrAy48Lg4+Ox/hjgtjtNQtJH8dbBjD2u8kN/MFHqaRpUYfFY3WmVxgOYYlhs0DlhPjI2gV6wocx+HEwIQSwQqb1S5paXxhcrZQPB0usPRXTE4GoaZIVO1W5Aq8bJutCtOS2jLHRca3jUyqUpTusMeBw1yYFqcUPta0ChNrQr5m1XnT8UsW4MvLq43rA2ZL9UuWSkLDDYXlBEcipyX/n/mx2qoMhJTB24QdG5SWlZBAK8oVkD2g4KzROKYTnOjXJUtaQpowypOsUQCUlqQjoUsLpmlUlijUuNu4Vd1KU4qfJGZ1gUNehIJeiQIvCEc5mg== 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=OzfGdc6s0fqd/5vuWtsbBIbhPCVzCQiPXTeBAxVqH8k=; b=g9vOIQdgTesnGGLN1NNdhxzI/Js6UH9I6JgcmOiw6qHnntH28TGqzplCSGxJdE/jx+uPWLDFnH00NGKYz/h59+8AGesnRKWkpiNeGvFuNNXPsLZrIOZnT2Bc3QcRNsSNuUyabTvoE+U6Imr9WvF3np9SN1nE9veY6m3yQY2YM/VnEn1AXII+krQ4B0ThUiQPzuAPGUS1918Uj79bygVQp/Zx2N/pVXUUUtmumMDlEJTnz1rszv8YmgbjDy+FRgG4a3ehiNq/KysImtlQpAY9kGMTRSHSYVaJxb02Dya4lkZUl78GHCrhXpJ+9CSHncXotoIkQIlPqrdXs/zp2xSrCw== 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=OzfGdc6s0fqd/5vuWtsbBIbhPCVzCQiPXTeBAxVqH8k=; b=gg6igGgwErz9u7GuygD76KLfSQmQJ/tFpYDGwfS4Y47ABfr8ariwZiyWmsvEhkGQMmDfh29qdQxTzFByu9CVbNlY0409vLxZocW8xUKwTitcIJTruTOdPDRBydIP/l9eHJn6EczeY1/y/08jqQhioLGX07v81RKAezLVSlALrEE= 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 DM5PR12MB1354.namprd12.prod.outlook.com (2603:10b6:3:7a::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3066.20; Fri, 5 Jun 2020 13:28:03 +0000 Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::4ce1:9947:9681:c8b1]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::4ce1:9947:9681:c8b1%10]) with mapi id 15.20.3066.019; Fri, 5 Jun 2020 13:28:03 +0000 From: "Lendacky, Thomas" To: devel@edk2.groups.io Cc: Brijesh Singh , Ard Biesheuvel , Eric Dong , Jordan Justen , Laszlo Ersek , Liming Gao , Michael D Kinney , Ray Ni Subject: [PATCH v9 14/46] OvmfPkg/VmgExitLib: Support string IO for IOIO_PROT NAE events Date: Fri, 5 Jun 2020 08:27:05 -0500 Message-Id: <8ecf3abbd4a58dfb920b68163680ddfd5b552eac.1591363657.git.thomas.lendacky@amd.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: References: X-ClientProxiedBy: DM5PR19CA0060.namprd19.prod.outlook.com (2603:10b6:3:116::22) 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 DM5PR19CA0060.namprd19.prod.outlook.com (2603:10b6:3:116::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3066.18 via Frontend Transport; Fri, 5 Jun 2020 13:28:02 +0000 X-Mailer: git-send-email 2.27.0 X-Originating-IP: [165.204.77.1] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 0a829385-0fe3-449b-4590-08d809544605 X-MS-TrafficTypeDiagnostic: DM5PR12MB1354: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:7691; X-Forefront-PRVS: 0425A67DEF X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: yMEePPrAlq5H9gTpesWsc4U2/FUFA35QW3GaNx8UjMZKR0F6AhHGIxllGofdIx0OaYGZKHkharCc51pE+P99wI1nYYddOf9wse2NPuJ4K/2G1P8QfFAiq2mg4QbeisCM4eneQbZf4CTFqmDeDWL31mwVUH0wR6DnUdeg3+OiWrv9EFikvAjWXIfiYw+Qex7I+I/6DPtK73QvzAhi7tDNRaXzoktUmU1dhdoAkRXHXWgbOPEaAiUiX0p/5NbiCP+zB+wMeaKbEN36sLafIp3hzv1gVcRcNuru9qY/pj61C/hC4WcFFPtnQ6CdLhaxHs2XppvMFvkmkeuE+UH5Ig+p6WLvCsGuPu9ZQOnn8aYbATNEeEPTxDkldRG8AHEnCRGI5Ulw84LP94Tu9mB7Qz1T2slHaun8jECbbopyAYl6fdcxm+2WR/tBxr1GPF/so2fozfizC3XgbOBHTzLaVmMVfw== 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;SFTY:;SFS:(4636009)(346002)(39860400002)(376002)(366004)(396003)(136003)(52116002)(83380400001)(26005)(316002)(7696005)(54906003)(6486002)(478600001)(956004)(16526019)(86362001)(4326008)(36756003)(2616005)(966005)(6916009)(2906002)(8936002)(5660300002)(8676002)(66476007)(66946007)(66556008)(186003)(136400200001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData: VnG12qafVhFOJ9k/TSSDi8ZvwS71URu/Oi9Cl9QGkmcwJar82WsMt3Sg58EfI0Hb2R/vCpOSWoFR9QmR1LDmBAmHnN9QWB0uNCRvKJxKlv/FiNiCmAaBE9nPeNS2UBN1ZrNvyoP1LLqGrwA/UXKR0jh+J3SNkxSTtIB9TMpgIWDi1AQLtreV+o+0Sl0FDq929ZPTMQLtRlaJEMKXvsK99MOB7/885CRMiG27S9cVJ058/HUoLa3tQ971gE57xA6wAg+XW3Za11pwWz7EVz3nzA6ldBRR/mSv+lY6RIsruunI9dnNjypvRX2H81n/KfSC592xcAzzb94GYq9lnH4OcH/DVbpItVQoXceZzESFRJ4ZdYw0kvgMnVUKUS7fzmIic1CfwvrS5d2GN4l1T2l5wF6athYlALHiD7wy6KkAYi2PxXrRes3dqGJXS90ja+UgDOZw40GYAWg7y9GYRWkjoQmypHz1lN2CxuxzI1Em7PE= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0a829385-0fe3-449b-4590-08d809544605 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Jun 2020 13:28:03.2317 (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: 80CNgCqghKLUrlgEhhtsRSLkS9O7JKlnPAYYS9snLOX/XhfO1HLJi23BcMyfaPGXbJk7kVf1bcwvmrNtWv/dtQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR12MB1354 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2198 Add support to the #VC exception handler to handle string IO. This requires expanding the IO instruction parsing to recognize string based IO instructions as well as preparing an un-encrypted buffer to be used to transfer (either to or from the guest) the string contents for the IO operation. The SW_EXITINFO2 and SW_SCRATCH fields of the GHCB are set appropriately for the operation. Multiple VMGEXIT invocations may be needed to complete the string IO operation. Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Acked-by: Laszlo Ersek Signed-off-by: Tom Lendacky --- OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c | 90 +++++++++++++++++--- 1 file changed, 76 insertions(+), 14 deletions(-) diff --git a/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c b/OvmfPkg/Librar= y/VmgExitLib/VmgExitVcHandler.c index 7c2bb12df10a..b74b13045cfd 100644 --- a/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c +++ b/OvmfPkg/Library/VmgExitLib/VmgExitVcHandler.c @@ -397,6 +397,26 @@ IoioExitInfo ( ExitInfo =3D 0;=0D =0D switch (*(InstructionData->OpCodes)) {=0D + //=0D + // INS opcodes=0D + //=0D + case 0x6C:=0D + case 0x6D:=0D + ExitInfo |=3D IOIO_TYPE_INS;=0D + ExitInfo |=3D IOIO_SEG_ES;=0D + ExitInfo |=3D ((Regs->Rdx & 0xffff) << 16);=0D + break;=0D +=0D + //=0D + // OUTS opcodes=0D + //=0D + case 0x6E:=0D + case 0x6F:=0D + ExitInfo |=3D IOIO_TYPE_OUTS;=0D + ExitInfo |=3D IOIO_SEG_DS;=0D + ExitInfo |=3D ((Regs->Rdx & 0xffff) << 16);=0D + break;=0D +=0D //=0D // IN immediate opcodes=0D //=0D @@ -445,6 +465,8 @@ IoioExitInfo ( //=0D // Single-byte opcodes=0D //=0D + case 0x6C:=0D + case 0x6E:=0D case 0xE4:=0D case 0xE6:=0D case 0xEC:=0D @@ -506,30 +528,70 @@ IoioExit ( IN SEV_ES_INSTRUCTION_DATA *InstructionData=0D )=0D {=0D - UINT64 ExitInfo1, Status;=0D + UINT64 ExitInfo1, ExitInfo2, Status;=0D + BOOLEAN IsString;=0D =0D ExitInfo1 =3D IoioExitInfo (Regs, InstructionData);=0D if (ExitInfo1 =3D=3D 0) {=0D return UnsupportedExit (Ghcb, Regs, InstructionData);=0D }=0D =0D - if ((ExitInfo1 & IOIO_TYPE_IN) !=3D 0) {=0D - Ghcb->SaveArea.Rax =3D 0;=0D + IsString =3D ((ExitInfo1 & IOIO_TYPE_STR) !=3D 0) ? TRUE : FALSE;=0D + if (IsString) {=0D + UINTN IoBytes, VmgExitBytes;=0D + UINTN GhcbCount, OpCount;=0D +=0D + Status =3D 0;=0D +=0D + IoBytes =3D IOIO_DATA_BYTES(ExitInfo1);=0D + GhcbCount =3D sizeof (Ghcb->SharedBuffer) / IoBytes;=0D +=0D + OpCount =3D ((ExitInfo1 & IOIO_REP) !=3D 0) ? Regs->Rcx : 1;=0D + while (OpCount) {=0D + ExitInfo2 =3D MIN (OpCount, GhcbCount);=0D + VmgExitBytes =3D ExitInfo2 * IoBytes;=0D +=0D + if ((ExitInfo1 & IOIO_TYPE_IN) =3D=3D 0) {=0D + CopyMem (Ghcb->SharedBuffer, (VOID *) Regs->Rsi, VmgExitBytes);=0D + Regs->Rsi +=3D VmgExitBytes;=0D + }=0D +=0D + Ghcb->SaveArea.SwScratch =3D (UINT64) Ghcb->SharedBuffer;=0D + Status =3D VmgExit (Ghcb, SVM_EXIT_IOIO_PROT, ExitInfo1, ExitInfo2);= =0D + if (Status !=3D 0) {=0D + return Status;=0D + }=0D +=0D + if ((ExitInfo1 & IOIO_TYPE_IN) !=3D 0) {=0D + CopyMem ((VOID *) Regs->Rdi, Ghcb->SharedBuffer, VmgExitBytes);=0D + Regs->Rdi +=3D VmgExitBytes;=0D + }=0D +=0D + if ((ExitInfo1 & IOIO_REP) !=3D 0) {=0D + Regs->Rcx -=3D ExitInfo2;=0D + }=0D +=0D + OpCount -=3D ExitInfo2;=0D + }=0D } else {=0D - CopyMem (&Ghcb->SaveArea.Rax, &Regs->Rax, IOIO_DATA_BYTES (ExitInfo1))= ;=0D - }=0D - GhcbSetRegValid (Ghcb, GhcbRax);=0D + if ((ExitInfo1 & IOIO_TYPE_IN) !=3D 0) {=0D + Ghcb->SaveArea.Rax =3D 0;=0D + } else {=0D + CopyMem (&Ghcb->SaveArea.Rax, &Regs->Rax, IOIO_DATA_BYTES (ExitInfo1= ));=0D + }=0D + GhcbSetRegValid (Ghcb, GhcbRax);=0D =0D - Status =3D VmgExit (Ghcb, SVM_EXIT_IOIO_PROT, ExitInfo1, 0);=0D - if (Status !=3D 0) {=0D - return Status;=0D - }=0D + Status =3D VmgExit (Ghcb, SVM_EXIT_IOIO_PROT, ExitInfo1, 0);=0D + if (Status !=3D 0) {=0D + return Status;=0D + }=0D =0D - if ((ExitInfo1 & IOIO_TYPE_IN) !=3D 0) {=0D - if (!GhcbIsRegValid (Ghcb, GhcbRax)) {=0D - return UnsupportedExit (Ghcb, Regs, InstructionData);=0D + if ((ExitInfo1 & IOIO_TYPE_IN) !=3D 0) {=0D + if (!GhcbIsRegValid (Ghcb, GhcbRax)) {=0D + return UnsupportedExit (Ghcb, Regs, InstructionData);=0D + }=0D + CopyMem (&Regs->Rax, &Ghcb->SaveArea.Rax, IOIO_DATA_BYTES (ExitInfo1= ));=0D }=0D - CopyMem (&Regs->Rax, &Ghcb->SaveArea.Rax, IOIO_DATA_BYTES (ExitInfo1))= ;=0D }=0D =0D return 0;=0D --=20 2.27.0