From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM02-CY1-obe.outbound.protection.outlook.com (mail-cys01nam02on0600.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe45::600]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id CCC7221DFA8FE for ; Thu, 30 Mar 2017 05:30:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=Wa83MC5CBgS7DKfzwgvme6jcAZjYalaPUGYOtN/DJJE=; b=T/xuGaY2LQ7MSmQDNj8TtZZlqW9bEf/HRbCqcFxT8w26burPWQdenaJAo1q7j5h56FRweIZQNfqBfyC8esEsxGwwgZhAU8gUYFW/9NoB+0n2iapd0zLqPOfS+HXxFRQVNpFkXpg9haLZf9OOCumu4ojiylxgdqT7CjC4n8yZQsw= Received: from DM5PR12MB1243.namprd12.prod.outlook.com (10.168.237.22) by MWHPR1201MB0144.namprd12.prod.outlook.com (10.174.98.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1005.10; Thu, 30 Mar 2017 12:30:32 +0000 Received: from DM5PR12MB1243.namprd12.prod.outlook.com ([10.168.237.22]) by DM5PR12MB1243.namprd12.prod.outlook.com ([10.168.237.22]) with mapi id 15.01.0991.022; Thu, 30 Mar 2017 12:30:31 +0000 From: "Duran, Leo" To: "Gao, Liming" , "edk2-devel@ml01.01.org" CC: "Kinney, Michael D" , "Singh, Brijesh" Thread-Topic: [PATCH v3] MdePkg: BaseIoLibIntrinsic (IoLib class) library Thread-Index: AQHSqKaI3wfrj719DkSGOHcPt0p0RqGr+7YAgADVToCAAH+tQA== Date: Thu, 30 Mar 2017 12:30:31 +0000 Message-ID: References: <1490803624-8727-1-git-send-email-leo.duran@amd.com> <1490803624-8727-2-git-send-email-leo.duran@amd.com> <4A89E2EF3DFEDB4C8BFDE51014F606A14D70685B@shsmsx102.ccr.corp.intel.com> In-Reply-To: <4A89E2EF3DFEDB4C8BFDE51014F606A14D70685B@shsmsx102.ccr.corp.intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=amd.com; x-originating-ip: [2605:6000:e7ed:fa00:cc25:3b7d:b37a:c75e] x-microsoft-exchange-diagnostics: 1; MWHPR1201MB0144; 7:6T6ZnBbWRN6OymQ3kWcRGJVtQ5Tz3xFMHEElm0ESMl9Blxio5bjfCXzKqoAwczjwmSFoGTsUI4MlEth1kVh4zE7MLACEmnhEkRnHcDT3zIuLyNWC3vfT28/+gN9kU2+dx5jFfgK1b1e2YTY38W/tTrv6/G/E7U1RDH7X+tnR2+W+tDbWXXKYDZ4Re1Ly5AFrVwzMcshRQTcCLWSkERx4ovQwcDR2IIuXJ+RkPTbFklRssfbJ9hRz9qLZGhOtY86Bqs5iMj89pkcutGfrpytTxk9CXl1u1dItHvlnmj6ErFv4AjZvBrFIh16MVDfDtY/lEmR6XdmWeOiG/ZT0/VNUJg==; 20:g/IDkrkSoHAe2uvrFQo6BfJccPMxG9A3pCEC0pIlfPNJdtO2SW6vwdRgeVCrzDhKmkn4QL5JTwWEbunP9nxEG00T6eSoFydEbDlY1XkgQsJVhZoZ6IC0n/g/6XpwHuuEwVxrpruD0Z6B424Rkb5Y2mVI2B4uO/iaeukcZmJSsk63V+SM4YTBVPaaZ4QljUVR+sKWdSbuKBPazc38fBkpf2MBzf1Wz8gRRb0ZYXhTOt8gSGb78et117GAQzYrJLz6 x-forefront-antispam-report: SFV:SKI; SCL:-1SFV:NSPM; SFS:(10009020)(979002)(6029001)(6009001)(39450400003)(39410400002)(39400400002)(39840400002)(39860400002)(39850400002)(377454003)(13464003)(7696004)(3280700002)(50986999)(2906002)(2900100001)(3660700001)(54356999)(76176999)(2950100002)(86362001)(2501003)(33656002)(229853002)(8676002)(81166006)(122556002)(74316002)(6116002)(102836003)(8936002)(7736002)(305945005)(25786009)(53546009)(6436002)(6506006)(53936002)(9686003)(53946003)(6306002)(54906002)(55016002)(53376002)(4326008)(38730400002)(5660300001)(16200700003)(189998001)(6246003)(77096006)(966004)(99286003)(959014)(579004)(559001)(569005); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR1201MB0144; H:DM5PR12MB1243.namprd12.prod.outlook.com; FPR:; SPF:None; MLV:ovrnspm; PTR:InfoNoRecords; LANG:en; x-ms-office365-filtering-correlation-id: e7e13eb7-d48e-406b-bb5f-08d477688e3a x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254075)(48565401081)(201703131423075)(201703031133081); SRVR:MWHPR1201MB0144; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(767451399110)(228905959029699); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(5005006)(8121501046)(3002001)(93006067)(93001067)(10201501046)(6055026)(6041248)(20161123555025)(20161123562025)(201703131423075)(201702281528075)(201703061421075)(20161123560025)(20161123564025)(6072148); SRVR:MWHPR1201MB0144; BCL:0; PCL:0; RULEID:; SRVR:MWHPR1201MB0144; x-forefront-prvs: 02622CEF0A spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-originalarrivaltime: 30 Mar 2017 12:30:31.1009 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR1201MB0144 Subject: Re: [PATCH v3] MdePkg: BaseIoLibIntrinsic (IoLib class) library X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Mar 2017 12:30:35 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Liming, Should we remove the .asm code from the standard BaseIoLibIntrinsic.inf as= well? (I'd prefer being consistent in both .INF instances: .ASM included or not) Thanks, Leo > -----Original Message----- > From: Gao, Liming [mailto:liming.gao@intel.com] > Sent: Wednesday, March 29, 2017 11:51 PM > To: Duran, Leo ; edk2-devel@ml01.01.org > Cc: Kinney, Michael D ; Singh, Brijesh > > Subject: RE: [PATCH v3] MdePkg: BaseIoLibIntrinsic (IoLib class) library >=20 > Leo: > Your change is good. My comment is not to add asm code. Nasm is enough. > For new added features, nasm is only required. >=20 > Thanks > Liming > >-----Original Message----- > >From: Leo Duran [mailto:leo.duran@amd.com] > >Sent: Thursday, March 30, 2017 12:07 AM > >To: edk2-devel@ml01.01.org > >Cc: Leo Duran ; Kinney, Michael D > >; Gao, Liming ; > >Brijesh Singh > >Subject: [PATCH v3] MdePkg: BaseIoLibIntrinsic (IoLib class) library > > > >This patch adds an SEV-specific .INF and corresponding assembly files, > >to unroll REP INSx/OUTSx on IoRead/WriteFifo#() routines when the SEV > >feature is enabled under a hypervisor environment. > > > >The new .INF only supports the IA32 and X64 architectures. > > > >Cc: Michael D Kinney > >Cc: Liming Gao > >Contributed-under: TianoCore Contribution Agreement 1.0 > >Signed-off-by: Brijesh Singh > >Signed-off-by: Leo Duran > >--- > > .../BaseIoLibIntrinsic/BaseIoLibIntrinsicSev.inf | 63 +++++ > > .../Library/BaseIoLibIntrinsic/Ia32/IoFifoSev.asm | 297 > >+++++++++++++++++++++ > > .../Library/BaseIoLibIntrinsic/Ia32/IoFifoSev.nasm | 293 > >++++++++++++++++++++ > > .../Library/BaseIoLibIntrinsic/X64/IoFifoSev.asm | 282 > >+++++++++++++++++++ > > .../Library/BaseIoLibIntrinsic/X64/IoFifoSev.nasm | 282 > >+++++++++++++++++++ > > MdePkg/MdePkg.dsc | 2 + > > 6 files changed, 1219 insertions(+) > > create mode 100644 > >MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsicSev.inf > > create mode 100644 > >MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifoSev.asm > > create mode 100644 > >MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifoSev.nasm > > create mode 100644 MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifoSev.asm > > create mode 100644 > >MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifoSev.nasm > > > >diff --git > >a/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsicSev.inf > >b/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsicSev.inf > >new file mode 100644 > >index 0000000..6f14075 > >--- /dev/null > >+++ b/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsicSev.inf > >@@ -0,0 +1,63 @@ > >+## @file > >+# Instance of I/O Library using compiler intrinsics. > >+# > >+# I/O Library that uses compiler intrinsics to perform IN and OUT > >+instructions # for IA-32 and x64. On IPF, I/O port requests are > >+translated into MMIO > >requests. > >+# MMIO requests are forwarded directly to memory. For EBC, I/O port > >requests > >+# ASSERT(). > >+# > >+# Copyright (c) 2007 - 2015, Intel Corporation. All rights > >+reserved.
# Portions copyright (c) 2008 - 2009, Apple Inc. All > >+rights reserved.
# Copyright (c) 2017, AMD Incorporated. All > >+rights reserved.
# # This program and the accompanying materials > >+# are licensed and made available under the terms and conditions of > >+the > >BSD License > >+# which accompanies this distribution. The full text of the license > >+may be > >found at > >+# http://opensource.org/licenses/bsd-license.php. > >+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > >BASIS, > >+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > >EXPRESS OR IMPLIED. > >+# > >+## > >+ > >+[Defines] > >+ INF_VERSION =3D 0x00010005 > >+ BASE_NAME =3D BaseIoLibIntrinsicSev > >+ MODULE_UNI_FILE =3D BaseIoLibIntrinsic.uni > >+ FILE_GUID =3D 93742f95-6e71-4581-b600-8e1da443f9= 5a > >+ MODULE_TYPE =3D BASE > >+ VERSION_STRING =3D 1.0 > >+ LIBRARY_CLASS =3D IoLib > >+ > >+ > >+# > >+# VALID_ARCHITECTURES =3D IA32 X64 > >+# > >+ > >+[Sources] > >+ IoLibMmioBuffer.c > >+ BaseIoLibIntrinsicInternal.h > >+ IoHighLevel.c > >+ > >+[Sources.IA32] > >+ IoLibGcc.c | GCC > >+ IoLibMsc.c | MSFT > >+ IoLibIcc.c | INTEL > >+ IoLib.c > >+ Ia32/IoFifoSev.nasm > >+ Ia32/IoFifoSev.asm > >+ > >+[Sources.X64] > >+ IoLibGcc.c | GCC > >+ IoLibMsc.c | MSFT > >+ IoLibIcc.c | INTEL > >+ IoLib.c > >+ X64/IoFifoSev.nasm > >+ X64/IoFifoSev.asm > >+ > >+[Packages] > >+ MdePkg/MdePkg.dec > >+ > >+[LibraryClasses] > >+ DebugLib > >+ BaseLib > >+ > >diff --git a/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifoSev.asm > >b/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifoSev.asm > >new file mode 100644 > >index 0000000..d81871c > >--- /dev/null > >+++ b/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifoSev.asm > >@@ -0,0 +1,297 @@ > >+;--------------------------------------------------------------------- > >+--------- > >+; > >+; Copyright (c) 2006 - 2012, Intel Corporation. All rights > >+reserved.
; Copyright (c) 2017, AMD Incorporated. All rights > >+reserved.
; ; This program and the accompanying materials are > >+licensed and made > >available > >+; under the terms and conditions of the BSD License which accompanies > >+this ; distribution. The full text of the license may be found at ; > >+http://opensource.org/licenses/bsd-license.php. > >+; > >+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > >BASIS, > >+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > >EXPRESS OR IMPLIED. > >+; > >+;--------------------------------------------------------------------- > >+--------- > >+ > >+ .586P > >+ .model flat,C > >+ .code > >+ > >+;--------------------------------------------------------------------- > >+--------- ; Check whether we need to unroll the String I/O under SEV > >+guest ; > >+; Return // eax (1 - unroll, 0 - no unroll) > >+;--------------------------------------------------------------------- > >+--------- > >+SevNoRepIo PROC > >+ > >+ ; CPUID clobbers ebx, ecx and edx > >+ push ebx > >+ push ecx > >+ push edx > >+ > >+ ; Check if we are running under hypervisor ; CPUID(1).ECX Bit 31 > >+ mov eax, 1 > >+ cpuid > >+ bt ecx, 31 > >+ jnc @UseRepIo > >+ > >+ ; Check if we have Memory encryption CPUID leaf > >+ mov eax, 0x80000000 > >+ cpuid > >+ cmp eax, 0x8000001f > >+ jl @UseRepIo > >+ > >+ ; Check for memory encryption feature: > >+ ; CPUID Fn8000_001F[EAX] - Bit 1 > >+ ; > >+ mov eax, 0x8000001f > >+ cpuid > >+ bt eax, 1 > >+ jnc @UseRepIo > >+ > >+ ; Check if memory encryption is enabled ; MSR_0xC0010131 - Bit 0 > >+ (SEV enabled) ; MSR_0xC0010131 - Bit 1 (SEV-ES enabled) > >+ mov ecx, 0xc0010131 > >+ rdmsr > >+ > >+ ; Check for (SevEsEnabled =3D=3D 0 && SevEnabled =3D=3D 1) > >+ and eax, 3 > >+ cmp eax, 1 > >+ je @SevNoRepIo_Done > >+ > >+@UseRepIo: > >+ xor eax, eax > >+ > >+@SevNoRepIo_Done: > >+ pop edx > >+ pop ecx > >+ pop ebx > >+ ret > >+SevNoRepIo ENDP > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoReadFifo8 ( > >+; IN UINTN Port, > >+; IN UINTN Size, > >+; OUT VOID *Buffer > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+IoReadFifo8 PROC > >+ push edi > >+ mov dx, [esp + 8] > >+ mov ecx, [esp + 12] > >+ mov edi, [esp + 16] > >+ > >+ call SevNoRepIo ; Check if we need to unroll the rep > >+ test eax, eax > >+ jnz @IoReadFifo8_NoRep > >+ > >+ cld > >+ rep insb > >+ jmp @IoReadFifo8_Done > >+ > >+@IoReadFifo8_NoRep: > >+ jecxz @IoReadFifo8_Done > >+ > >+@IoReadFifo8_Loop: > >+ in al, dx > >+ mov byte [edi], al > >+ inc edi > >+ loop @IoReadFifo8_Loop > >+ > >+@IoReadFifo8_Done: > >+ pop edi > >+ ret > >+IoReadFifo8 ENDP > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoReadFifo16 ( > >+; IN UINTN Port, > >+; IN UINTN Size, > >+; OUT VOID *Buffer > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+IoReadFifo16 PROC > >+ push edi > >+ mov dx, [esp + 8] > >+ mov ecx, [esp + 12] > >+ mov edi, [esp + 16] > >+ > >+ call SevNoRepIo ; Check if we need to unroll the rep > >+ test eax, eax > >+ jnz @IoReadFifo16_NoRep > >+ > >+ cld > >+ rep insw > >+ jmp @IoReadFifo16_Done > >+ > >+@IoReadFifo16_NoRep: > >+ jecxz @IoReadFifo16_Done > >+ > >+@IoReadFifo16_Loop: > >+ in ax, dx > >+ mov word [edi], ax > >+ add edi, 2 > >+ loop @IoReadFifo16_Loop > >+ > >+@IoReadFifo16_Done: > >+ pop edi > >+ ret > >+IoReadFifo16 ENDP > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoReadFifo32 ( > >+; IN UINTN Port, > >+; IN UINTN Size, > >+; OUT VOID *Buffer > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+IoReadFifo32 PROC > >+ push edi > >+ mov dx, [esp + 8] > >+ mov ecx, [esp + 12] > >+ mov edi, [esp + 16] > >+ > >+ call SevNoRepIo ; Check if we need to unroll the rep > >+ test eax, eax > >+ jnz @IoReadFifo32_NoRep > >+ > >+ cld > >+ rep insd > >+ jmp @IoReadFifo32_Done > >+ > >+@IoReadFifo32_NoRep: > >+ jecxz @IoReadFifo32_Done > >+ > >+@IoReadFifo32_Loop: > >+ in eax, dx > >+ mov dword [edi], eax > >+ add edi, 4 > >+ loop @IoReadFifo32_Loop > >+ > >+@IoReadFifo32_Done: > >+ pop edi > >+ ret > >+IoReadFifo32 ENDP > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoWriteFifo8 ( > >+; IN UINTN Port, > >+; IN UINTN Size, > >+; IN VOID *Buffer > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+IoWriteFifo8 PROC > >+ push esi > >+ mov dx, [esp + 8] > >+ mov ecx, [esp + 12] > >+ mov esi, [esp + 16] > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoWriteFifo8_NoRep > >+ > >+ cld > >+ rep outsb > >+ jmp @IoWriteFifo8_Done > >+ > >+@IoWriteFifo8_NoRep: > >+ jecxz @IoWriteFifo8_Done > >+ > >+@IoWriteFifo8_Loop: > >+ mov byte [esi], al > >+ out dx, al > >+ inc esi > >+ loop @IoWriteFifo8_Loop > >+ > >+@IoWriteFifo8_Done: > >+ pop esi > >+ ret > >+IoWriteFifo8 ENDP > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoWriteFifo16 ( > >+; IN UINTN Port, > >+; IN UINTN Size, > >+; IN VOID *Buffer > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+IoWriteFifo16 PROC > >+ push esi > >+ mov dx, [esp + 8] > >+ mov ecx, [esp + 12] > >+ mov esi, [esp + 16] > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoWriteFifo16_NoRep > >+ > >+ cld > >+ rep outsw > >+ jmp @IoWriteFifo16_Done > >+ > >+@IoWriteFifo16_NoRep: > >+ jecxz @IoWriteFifo16_Done > >+ > >+@IoWriteFifo16_Loop: > >+ mov word [esi], ax > >+ out dx, ax > >+ add esi, 2 > >+ loop @IoWriteFifo16_Loop > >+ > >+@IoWriteFifo16_Done: > >+ pop esi > >+ ret > >+IoWriteFifo16 ENDP > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoWriteFifo32 ( > >+; IN UINTN Port, > >+; IN UINTN Size, > >+; IN VOID *Buffer > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+IoWriteFifo32 PROC > >+ push esi > >+ mov dx, [esp + 8] > >+ mov ecx, [esp + 12] > >+ mov esi, [esp + 16] > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoWriteFifo32_NoRep > >+ > >+ cld > >+ rep outsd > >+ jmp @IoWriteFifo32_Done > >+ > >+@IoWriteFifo32_NoRep: > >+ jecxz @IoWriteFifo32_Done > >+ > >+@IoWriteFifo32_Loop: > >+ mov dword [esi], eax > >+ out dx, eax > >+ add esi, 4 > >+ loop @IoWriteFifo32_Loop > >+ > >+@IoWriteFifo32_Done: > >+ pop esi > >+ ret > >+IoWriteFifo32 ENDP > >+ > >+ END > >+ > >diff --git a/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifoSev.nasm > >b/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifoSev.nasm > >new file mode 100644 > >index 0000000..9adb972 > >--- /dev/null > >+++ b/MdePkg/Library/BaseIoLibIntrinsic/Ia32/IoFifoSev.nasm > >@@ -0,0 +1,293 @@ > >+;--------------------------------------------------------------------- > >+--------- > >+; > >+; Copyright (c) 2006 - 2012, Intel Corporation. All rights > >+reserved.
; Copyright (c) 2017, AMD Incorporated. All rights > >+reserved.
; ; This program and the accompanying materials are > >+licensed and made > >available > >+; under the terms and conditions of the BSD License which accompanies > >+this ; distribution. The full text of the license may be found at ; > >+http://opensource.org/licenses/bsd-license.php. > >+; > >+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > >BASIS, > >+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > >EXPRESS OR IMPLIED. > >+; > >+;--------------------------------------------------------------------- > >+--------- > >+ > >+ SECTION .text > >+ > >+;--------------------------------------------------------------------- > >+--------- ; Check whether we need to unroll the String I/O under SEV > >+guest ; > >+; Return // eax (1 - unroll, 0 - no unroll) > >+;--------------------------------------------------------------------- > >+--------- > >+global ASM_PFX(SevNoRepIo) > >+ASM_PFX(SevNoRepIo): > >+ > >+ ; CPUID clobbers ebx, ecx and edx > >+ push ebx > >+ push ecx > >+ push edx > >+ > >+ ; Check if we are running under hypervisor ; CPUID(1).ECX Bit 31 > >+ mov eax, 1 > >+ cpuid > >+ bt ecx, 31 > >+ jnc @UseRepIo > >+ > >+ ; Check if we have Memory encryption CPUID leaf > >+ mov eax, 0x80000000 > >+ cpuid > >+ cmp eax, 0x8000001f > >+ jl @UseRepIo > >+ > >+ ; Check for memory encryption feature: > >+ ; CPUID Fn8000_001F[EAX] - Bit 1 > >+ ; > >+ mov eax, 0x8000001f > >+ cpuid > >+ bt eax, 1 > >+ jnc @UseRepIo > >+ > >+ ; Check if memory encryption is enabled ; MSR_0xC0010131 - Bit 0 > >+ (SEV enabled) ; MSR_0xC0010131 - Bit 1 (SEV-ES enabled) > >+ mov ecx, 0xc0010131 > >+ rdmsr > >+ > >+ ; Check for (SevEsEnabled =3D=3D 0 && SevEnabled =3D=3D 1) > >+ and eax, 3 > >+ cmp eax, 1 > >+ je @SevNoRepIo_Done > >+ > >+@UseRepIo: > >+ xor eax, eax > >+ > >+@SevNoRepIo_Done: > >+ pop edx > >+ pop ecx > >+ pop ebx > >+ ret > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoReadFifo8 ( > >+; IN UINTN Port, > >+; IN UINTN Size, > >+; OUT VOID *Buffer > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+global ASM_PFX(IoReadFifo8) > >+ASM_PFX(IoReadFifo8): > >+ push edi > >+ mov dx, [esp + 8] > >+ mov ecx, [esp + 12] > >+ mov edi, [esp + 16] > >+ > >+ call SevNoRepIo ; Check if we need to unroll the rep > >+ test eax, eax > >+ jnz @IoReadFifo8_NoRep > >+ > >+ cld > >+ rep insb > >+ jmp @IoReadFifo8_Done > >+ > >+@IoReadFifo8_NoRep: > >+ jecxz @IoReadFifo8_Done > >+ > >+@IoReadFifo8_Loop: > >+ in al, dx > >+ mov byte [edi], al > >+ inc edi > >+ loop @IoReadFifo8_Loop > >+ > >+@IoReadFifo8_Done: > >+ pop edi > >+ ret > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoReadFifo16 ( > >+; IN UINTN Port, > >+; IN UINTN Size, > >+; OUT VOID *Buffer > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+global ASM_PFX(IoReadFifo16) > >+ASM_PFX(IoReadFifo16): > >+ push edi > >+ mov dx, [esp + 8] > >+ mov ecx, [esp + 12] > >+ mov edi, [esp + 16] > >+ > >+ call SevNoRepIo ; Check if we need to unroll the rep > >+ test eax, eax > >+ jnz @IoReadFifo16_NoRep > >+ > >+ cld > >+ rep insw > >+ jmp @IoReadFifo16_Done > >+ > >+@IoReadFifo16_NoRep: > >+ jecxz @IoReadFifo16_Done > >+ > >+@IoReadFifo16_Loop: > >+ in ax, dx > >+ mov word [edi], ax > >+ add edi, 2 > >+ loop @IoReadFifo16_Loop > >+ > >+@IoReadFifo16_Done: > >+ pop edi > >+ ret > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoReadFifo32 ( > >+; IN UINTN Port, > >+; IN UINTN Size, > >+; OUT VOID *Buffer > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+global ASM_PFX(IoReadFifo32) > >+ASM_PFX(IoReadFifo32): > >+ push edi > >+ mov dx, [esp + 8] > >+ mov ecx, [esp + 12] > >+ mov edi, [esp + 16] > >+ > >+ call SevNoRepIo ; Check if we need to unroll the rep > >+ test eax, eax > >+ jnz @IoReadFifo32_NoRep > >+ > >+ cld > >+ rep insd > >+ jmp @IoReadFifo32_Done > >+ > >+@IoReadFifo32_NoRep: > >+ jecxz @IoReadFifo32_Done > >+ > >+@IoReadFifo32_Loop: > >+ in eax, dx > >+ mov dword [edi], eax > >+ add edi, 4 > >+ loop @IoReadFifo32_Loop > >+ > >+@IoReadFifo32_Done: > >+ pop edi > >+ ret > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoWriteFifo8 ( > >+; IN UINTN Port, > >+; IN UINTN Size, > >+; IN VOID *Buffer > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+global ASM_PFX(IoWriteFifo8) > >+ASM_PFX(IoWriteFifo8): > >+ push esi > >+ mov dx, [esp + 8] > >+ mov ecx, [esp + 12] > >+ mov esi, [esp + 16] > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoWriteFifo8_NoRep > >+ > >+ cld > >+ rep outsb > >+ jmp @IoWriteFifo8_Done > >+ > >+@IoWriteFifo8_NoRep: > >+ jecxz @IoWriteFifo8_Done > >+ > >+@IoWriteFifo8_Loop: > >+ mov byte [esi], al > >+ out dx, al > >+ inc esi > >+ loop @IoWriteFifo8_Loop > >+ > >+@IoWriteFifo8_Done: > >+ pop esi > >+ ret > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoWriteFifo16 ( > >+; IN UINTN Port, > >+; IN UINTN Size, > >+; IN VOID *Buffer > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+global ASM_PFX(IoWriteFifo16) > >+ASM_PFX(IoWriteFifo16): > >+ push esi > >+ mov dx, [esp + 8] > >+ mov ecx, [esp + 12] > >+ mov esi, [esp + 16] > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoWriteFifo16_NoRep > >+ > >+ cld > >+ rep outsw > >+ jmp @IoWriteFifo16_Done > >+ > >+@IoWriteFifo16_NoRep: > >+ jecxz @IoWriteFifo16_Done > >+ > >+@IoWriteFifo16_Loop: > >+ mov word [esi], ax > >+ out dx, ax > >+ add esi, 2 > >+ loop @IoWriteFifo16_Loop > >+ > >+@IoWriteFifo16_Done: > >+ pop esi > >+ ret > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoWriteFifo32 ( > >+; IN UINTN Port, > >+; IN UINTN Size, > >+; IN VOID *Buffer > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+global ASM_PFX(IoWriteFifo32) > >+ASM_PFX(IoWriteFifo32): > >+ push esi > >+ mov dx, [esp + 8] > >+ mov ecx, [esp + 12] > >+ mov esi, [esp + 16] > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoWriteFifo32_NoRep > >+ > >+ cld > >+ rep outsd > >+ jmp @IoWriteFifo32_Done > >+ > >+@IoWriteFifo32_NoRep: > >+ jecxz @IoWriteFifo32_Done > >+ > >+@IoWriteFifo32_Loop: > >+ mov dword [esi], eax > >+ out dx, eax > >+ add esi, 4 > >+ loop @IoWriteFifo32_Loop > >+ > >+@IoWriteFifo32_Done: > >+ pop esi > >+ ret > >+ > >diff --git a/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifoSev.asm > >b/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifoSev.asm > >new file mode 100644 > >index 0000000..fe9e171 > >--- /dev/null > >+++ b/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifoSev.asm > >@@ -0,0 +1,282 @@ > >+;--------------------------------------------------------------------- > >+--------- > >+; > >+; Copyright (c) 2006 - 2012, Intel Corporation. All rights > >+reserved.
; Copyright (c) 2017, AMD Incorporated. All rights > >+reserved.
; ; This program and the accompanying materials are > >+licensed and made > >available > >+; under the terms and conditions of the BSD License which accompanies > >+this ; distribution. The full text of the license may be found at ; > >+http://opensource.org/licenses/bsd-license.php. > >+; > >+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > >BASIS, > >+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > >EXPRESS OR IMPLIED. > >+; > >+;--------------------------------------------------------------------- > >+--------- > >+ > >+ .code > >+ > >+;--------------------------------------------------------------------- > >+--------- ; Check whether we need to unroll the String I/O in SEV > >+guest ; > >+; Return // eax (1 - unroll, 0 - no unroll) > >+;--------------------------------------------------------------------- > >+--------- > >+SevNoRepIo PROC > >+ ; CPUID clobbers ebx, ecx and edx > >+ push rbx > >+ push rcx > >+ push rdx > >+ > >+ ; Check if we are runing under hypervisor ; CPUID(1).ECX Bit 31 > >+ mov eax, 1 > >+ cpuid > >+ bt ecx, 31 > >+ jnc @UseRepIo > >+ > >+ ; Check if we have Memory encryption CPUID leaf > >+ mov eax, 0x80000000 > >+ cpuid > >+ cmp eax, 0x8000001f > >+ jl @UseRepIo > >+ > >+ ; Check for memory encryption feature: > >+ ; CPUID Fn8000_001F[EAX] - Bit 1 > >+ ; > >+ mov eax, 0x8000001f > >+ cpuid > >+ bt eax, 1 > >+ jnc @UseRepIo > >+ > >+ ; Check if memory encryption is enabled ; MSR_0xC0010131 - Bit 0 > >+ (SEV enabled) ; MSR_0xC0010131 - Bit 1 (SEV-ES enabled) > >+ mov ecx, 0xc0010131 > >+ rdmsr > >+ > >+ ; Check for (SevEsEnabled =3D=3D 0 && SevEnabled =3D=3D 1) > >+ and eax, 3 > >+ cmp eax, 1 > >+ je @SevNoRepIo_Done > >+ > >+@UseRepIo: > >+ xor eax, eax > >+ > >+@SevNoRepIo_Done: > >+ pop rdx > >+ pop rcx > >+ pop rbx > >+ ret > >+SevNoRepIo ENDP > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoReadFifo8 ( > >+; IN UINTN Port, // rcx > >+; IN UINTN Size, // rdx > >+; OUT VOID *Buffer // r8 > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+IoReadFifo8 PROC > >+ xchg rcx, rdx > >+ xchg rdi, r8 ; rdi: buffer address; r8: save rdi > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoReadFifo8_NoRep > >+ > >+ cld > >+ rep insb > >+ jmp @IoReadFifo8_Done > >+ > >+@IoReadFifo8_NoRep: > >+ jrcxz @IoReadFifo8_Done > >+ > >+@IoReadFifo8_Loop: > >+ in al, dx > >+ mov byte [rdi], al > >+ inc rdi > >+ loop @IoReadFifo8_Loop > >+ > >+@IoReadFifo8_Done: > >+ mov rdi, r8 ; restore rdi > >+ ret > >+IoReadFifo8 ENDP > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoReadFifo16 ( > >+; IN UINTN Port, // rcx > >+; IN UINTN Size, // rdx > >+; OUT VOID *Buffer // r8 > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+IoReadFifo16 PROC > >+ xchg rcx, rdx > >+ xchg rdi, r8 ; rdi: buffer address; r8: save rdi > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoReadFifo16_NoRep > >+ > >+ cld > >+ rep insw > >+ jmp @IoReadFifo16_Done > >+ > >+@IoReadFifo16_NoRep: > >+ jrcxz @IoReadFifo16_Done > >+ > >+@IoReadFifo16_Loop: > >+ in ax, dx > >+ mov word [rdi], ax > >+ add rdi, 2 > >+ loop @IoReadFifo16_Loop > >+ > >+@IoReadFifo16_Done: > >+ mov rdi, r8 ; restore rdi > >+ ret > >+IoReadFifo16 ENDP > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoReadFifo32 ( > >+; IN UINTN Port, // rcx > >+; IN UINTN Size, // rdx > >+; OUT VOID *Buffer // r8 > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+IoReadFifo32 PROC > >+ xchg rcx, rdx > >+ xchg rdi, r8 ; rdi: buffer address; r8: save rdi > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoReadFifo32_NoRep > >+ > >+ cld > >+ rep insd > >+ jmp @IoReadFifo32_Done > >+ > >+@IoReadFifo32_NoRep: > >+ jrcxz @IoReadFifo32_Done > >+ > >+@IoReadFifo32_Loop: > >+ in eax, dx > >+ mov dword [rdi], eax > >+ add rdi, 4 > >+ loop @IoReadFifo32_Loop > >+ > >+@IoReadFifo32_Done: > >+ mov rdi, r8 ; restore rdi > >+ ret > >+IoReadFifo32 ENDP > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoWriteFifo8 ( > >+; IN UINTN Port, // rcx > >+; IN UINTN Size, // rdx > >+; IN VOID *Buffer // r8 > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+IoWriteFifo8 PROC > >+ xchg rcx, rdx > >+ xchg rsi, r8 ; rsi: buffer address; r8: save rsi > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoWriteFifo8_NoRep > >+ > >+ cld > >+ rep outsb > >+ jmp @IoWriteFifo8_Done > >+ > >+@IoWriteFifo8_NoRep: > >+ jrcxz @IoWriteFifo8_Done > >+ > >+@IoWriteFifo8_Loop: > >+ mov byte [rsi], al > >+ out dx, al > >+ inc rsi > >+ loop @IoWriteFifo8_Loop > >+ > >+@IoWriteFifo8_Done: > >+ mov rsi, r8 ; restore rsi > >+ ret > >+IoWriteFifo8 ENDP > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoWriteFifo16 ( > >+; IN UINTN Port, // rcx > >+; IN UINTN Size, // rdx > >+; IN VOID *Buffer // r8 > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+IoWriteFifo16 PROC > >+ xchg rcx, rdx > >+ xchg rsi, r8 ; rsi: buffer address; r8: save rsi > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoWriteFifo16_NoRep > >+ > >+ cld > >+ rep outsw > >+ jmp @IoWriteFifo16_Done > >+ > >+@IoWriteFifo16_NoRep: > >+ jrcxz @IoWriteFifo16_Done > >+ > >+@IoWriteFifo16_Loop: > >+ mov word [rsi], ax > >+ out dx, ax > >+ add rsi, 2 > >+ loop @IoWriteFifo16_Loop > >+ > >+@IoWriteFifo16_Done: > >+ mov rsi, r8 ; restore rsi > >+ ret > >+IoWriteFifo16 ENDP > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoWriteFifo32 ( > >+; IN UINTN Port, // rcx > >+; IN UINTN Size, // rdx > >+; IN VOID *Buffer // r8 > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+IoWriteFifo32 PROC > >+ xchg rcx, rdx > >+ xchg rsi, r8 ; rsi: buffer address; r8: save rsi > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoWriteFifo32_NoRep > >+ > >+ cld > >+ rep outsd > >+ jmp @IoWriteFifo32_Done > >+ > >+@IoWriteFifo32_NoRep: > >+ jrcxz @IoWriteFifo32_Done > >+ > >+@IoWriteFifo32_Loop: > >+ mov dword [rsi], eax > >+ out dx, eax > >+ add rsi, 4 > >+ loop @IoWriteFifo32_Loop > >+ > >+@IoWriteFifo32_Done: > >+ mov rsi, r8 ; restore rsi > >+ ret > >+IoWriteFifo32 ENDP > >+ > >+ END > >+ > >diff --git a/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifoSev.nasm > >b/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifoSev.nasm > >new file mode 100644 > >index 0000000..20e3e64 > >--- /dev/null > >+++ b/MdePkg/Library/BaseIoLibIntrinsic/X64/IoFifoSev.nasm > >@@ -0,0 +1,282 @@ > >+;--------------------------------------------------------------------- > >+--------- > >+; > >+; Copyright (c) 2006 - 2012, Intel Corporation. All rights > >+reserved.
; Copyright (c) 2017, AMD Incorporated. All rights > >+reserved.
; ; This program and the accompanying materials are > >+licensed and made > >available > >+; under the terms and conditions of the BSD License which accompanies > >+this ; distribution. The full text of the license may be found at ; > >+http://opensource.org/licenses/bsd-license.php. > >+; > >+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > >BASIS, > >+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > >EXPRESS OR IMPLIED. > >+; > >+;--------------------------------------------------------------------- > >+--------- > >+ > >+ DEFAULT REL > >+ SECTION .text > >+ > >+;--------------------------------------------------------------------- > >+--------- ; Check whether we need to unroll the String I/O in SEV > >+guest ; > >+; Return // eax (1 - unroll, 0 - no unroll) > >+;--------------------------------------------------------------------- > >+--------- > >+global ASM_PFX(SevNoRepIo) > >+ASM_PFX(SevNoRepIo): > >+ > >+ ; CPUID clobbers ebx, ecx and edx > >+ push rbx > >+ push rcx > >+ push rdx > >+ > >+ ; Check if we are runing under hypervisor ; CPUID(1).ECX Bit 31 > >+ mov eax, 1 > >+ cpuid > >+ bt ecx, 31 > >+ jnc @UseRepIo > >+ > >+ ; Check if we have Memory encryption CPUID leaf > >+ mov eax, 0x80000000 > >+ cpuid > >+ cmp eax, 0x8000001f > >+ jl @UseRepIo > >+ > >+ ; Check for memory encryption feature: > >+ ; CPUID Fn8000_001F[EAX] - Bit 1 > >+ ; > >+ mov eax, 0x8000001f > >+ cpuid > >+ bt eax, 1 > >+ jnc @UseRepIo > >+ > >+ ; Check if memory encryption is enabled ; MSR_0xC0010131 - Bit 0 > >+ (SEV enabled) ; MSR_0xC0010131 - Bit 1 (SEV-ES enabled) > >+ mov ecx, 0xc0010131 > >+ rdmsr > >+ > >+ ; Check for (SevEsEnabled =3D=3D 0 && SevEnabled =3D=3D 1) > >+ and eax, 3 > >+ cmp eax, 1 > >+ je @SevNoRepIo_Done > >+ > >+@UseRepIo: > >+ xor eax, eax > >+ > >+@SevNoRepIo_Done: > >+ pop rdx > >+ pop rcx > >+ pop rbx > >+ ret > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoReadFifo8 ( > >+; IN UINTN Port, // rcx > >+; IN UINTN Size, // rdx > >+; OUT VOID *Buffer // r8 > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+global ASM_PFX(IoReadFifo8) > >+ASM_PFX(IoReadFifo8): > >+ xchg rcx, rdx > >+ xchg rdi, r8 ; rdi: buffer address; r8: save rdi > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoReadFifo8_NoRep > >+ > >+ cld > >+ rep insb > >+ jmp @IoReadFifo8_Done > >+ > >+@IoReadFifo8_NoRep: > >+ jrcxz @IoReadFifo8_Done > >+ > >+@IoReadFifo8_Loop: > >+ in al, dx > >+ mov byte [rdi], al > >+ inc rdi > >+ loop @IoReadFifo8_Loop > >+ > >+@IoReadFifo8_Done: > >+ mov rdi, r8 ; restore rdi > >+ ret > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoReadFifo16 ( > >+; IN UINTN Port, // rcx > >+; IN UINTN Size, // rdx > >+; OUT VOID *Buffer // r8 > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+global ASM_PFX(IoReadFifo16) > >+ASM_PFX(IoReadFifo16): > >+ xchg rcx, rdx > >+ xchg rdi, r8 ; rdi: buffer address; r8: save rdi > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoReadFifo16_NoRep > >+ > >+ cld > >+ rep insw > >+ jmp @IoReadFifo16_Done > >+ > >+@IoReadFifo16_NoRep: > >+ jrcxz @IoReadFifo16_Done > >+ > >+@IoReadFifo16_Loop: > >+ in ax, dx > >+ mov word [rdi], ax > >+ add rdi, 2 > >+ loop @IoReadFifo16_Loop > >+ > >+@IoReadFifo16_Done: > >+ mov rdi, r8 ; restore rdi > >+ ret > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoReadFifo32 ( > >+; IN UINTN Port, // rcx > >+; IN UINTN Size, // rdx > >+; OUT VOID *Buffer // r8 > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+global ASM_PFX(IoReadFifo32) > >+ASM_PFX(IoReadFifo32): > >+ xchg rcx, rdx > >+ xchg rdi, r8 ; rdi: buffer address; r8: save rdi > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoReadFifo32_NoRep > >+ > >+ cld > >+ rep insd > >+ jmp @IoReadFifo32_Done > >+ > >+@IoReadFifo32_NoRep: > >+ jrcxz @IoReadFifo32_Done > >+ > >+@IoReadFifo32_Loop: > >+ in eax, dx > >+ mov dword [rdi], eax > >+ add rdi, 4 > >+ loop @IoReadFifo32_Loop > >+ > >+@IoReadFifo32_Done: > >+ mov rdi, r8 ; restore rdi > >+ ret > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoWriteFifo8 ( > >+; IN UINTN Port, // rcx > >+; IN UINTN Size, // rdx > >+; IN VOID *Buffer // r8 > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+global ASM_PFX(IoWriteFifo8) > >+ASM_PFX(IoWriteFifo8): > >+ xchg rcx, rdx > >+ xchg rsi, r8 ; rsi: buffer address; r8: save rsi > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoWriteFifo8_NoRep > >+ > >+ cld > >+ rep outsb > >+ jmp @IoWriteFifo8_Done > >+ > >+@IoWriteFifo8_NoRep: > >+ jrcxz @IoWriteFifo8_Done > >+ > >+@IoWriteFifo8_Loop: > >+ mov byte [rsi], al > >+ out dx, al > >+ inc rsi > >+ loop @IoWriteFifo8_Loop > >+ > >+@IoWriteFifo8_Done: > >+ mov rsi, r8 ; restore rsi > >+ ret > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoWriteFifo16 ( > >+; IN UINTN Port, // rcx > >+; IN UINTN Size, // rdx > >+; IN VOID *Buffer // r8 > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+global ASM_PFX(IoWriteFifo16) > >+ASM_PFX(IoWriteFifo16): > >+ xchg rcx, rdx > >+ xchg rsi, r8 ; rsi: buffer address; r8: save rsi > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoWriteFifo16_NoRep > >+ > >+ cld > >+ rep outsw > >+ jmp @IoWriteFifo16_Done > >+ > >+@IoWriteFifo16_NoRep: > >+ jrcxz @IoWriteFifo16_Done > >+ > >+@IoWriteFifo16_Loop: > >+ mov word [rsi], ax > >+ out dx, ax > >+ add rsi, 2 > >+ loop @IoWriteFifo16_Loop > >+ > >+@IoWriteFifo16_Done: > >+ mov rsi, r8 ; restore rsi > >+ ret > >+ > >+;--------------------------------------------------------------------- > >+--------- > >+; VOID > >+; EFIAPI > >+; IoWriteFifo32 ( > >+; IN UINTN Port, // rcx > >+; IN UINTN Size, // rdx > >+; IN VOID *Buffer // r8 > >+; ); > >+;--------------------------------------------------------------------- > >+--------- > >+global ASM_PFX(IoWriteFifo32) > >+ASM_PFX(IoWriteFifo32): > >+ xchg rcx, rdx > >+ xchg rsi, r8 ; rsi: buffer address; r8: save rsi > >+ > >+ call SevNoRepIo ; Check if we need to unroll String I/O > >+ test eax, eax > >+ jnz @IoWriteFifo32_NoRep > >+ > >+ cld > >+ rep outsd > >+ jmp @IoWriteFifo32_Done > >+ > >+@IoWriteFifo32_NoRep: > >+ jrcxz @IoWriteFifo32_Done > >+ > >+@IoWriteFifo32_Loop: > >+ mov dword [rsi], eax > >+ out dx, eax > >+ add rsi, 4 > >+ loop @IoWriteFifo32_Loop > >+ > >+@IoWriteFifo32_Done: > >+ mov rsi, r8 ; restore rsi > >+ ret > >+ > >diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index > >2144979..56fb4cf 100644 > >--- a/MdePkg/MdePkg.dsc > >+++ b/MdePkg/MdePkg.dsc > >@@ -3,6 +3,7 @@ > > # > > # Copyright (c) 2007 - 2017, Intel Corporation. All rights > >reserved.
# Portions copyright (c) 2008 - 2009, Apple Inc. All > >rights reserved.
> >+# Copyright (c) 2017, AMD Incorporated. All rights reserved.
> > # > > # This program and the accompanying materials > > # are licensed and made available under the terms and conditions of = the > >BSD License > >@@ -134,6 +135,7 @@ > > > > [Components.IA32, Components.X64] > > MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf > >+ MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsicSev.inf > > MdePkg/Library/BaseMemoryLibMmx/BaseMemoryLibMmx.inf > > MdePkg/Library/BaseMemoryLibOptDxe/BaseMemoryLibOptDxe.inf > > MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf > >-- > >2.7.4