From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (NAM11-BN8-obe.outbound.protection.outlook.com [40.107.236.52]) by mx.groups.io with SMTP id smtpd.web12.28668.1595450930312565235 for ; Wed, 22 Jul 2020 13:48:50 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@amdcloud.onmicrosoft.com header.s=selector2-amdcloud-onmicrosoft-com header.b=I7ZQracn; spf=none, err=SPF record not found (domain: amd.com, ip: 40.107.236.52, mailfrom: thomas.lendacky@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LE5N7D3PozSupW8Fb/gDMXGP8zQjtB/rmUjk+HHmZ1+RlwfMG4ioRUV69Pw3gYhojDJ8zR/EpOH5bw/FP0OB7w6pIxMuaPmPUrJmS9rmiYvixEalLlIhet/7LL9KNq7oxMY2Szao4B8TQXTaRgh/DxdOtr/tHLgBQ0I2FMopknX2VNTfLfTQkSHTtgFZqgZWyFJ8jrlXgLqHLS5OWaOU39YQvjzcvsV0iYuIj5QkJzVys21EZjoOTWSK685DluzXLLbe5yfh64N+2I5/vJwTa7ob95lxIJ546+jeGqCY6cmzLSqRxWchfmaJ9VCbHenrOSuR/1JoCy/AkcFVOsFLTA== 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=uAtQPE+vZ2A1GOpDNB14XV1Vp+19rKWle+L2fdHqlF4=; b=gRNowlr+BWtec1zXKvr8MMgP6ossvwdM9Db4r7bmt+JSh5Cf9llB4i51V/VRTnsYWg3fUlH0tnvaTHj28bVin3yxCK82gykSCkqdf0KNUIHR0TBPMW5266Hfu72VtPvlj6/shBLwSNzFgkIiZWH46xHMSTB9qziVYEYjboBksl9/6eE90zT5kdfHB5ZERIqQFMJyN16kLACgY3X9cINZzUsYa3SCnp3cGWcy+kTU9xXJ59gcVtL07LWsZPLfdbfQDxPGb+BEMmH4RBK9QZEbQvGIQIg2xVfLWUKzHvCTqb29tD6S9MYM9Ndot+jMqoPHkKSZwaqWlN2pP3PZcXC0lg== 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=uAtQPE+vZ2A1GOpDNB14XV1Vp+19rKWle+L2fdHqlF4=; b=I7ZQracnNZbmVd4stW7dNN25YJzTWu2KM+77KnsWxZEQwg3VXzmXjik9MHbMgesp2jLS44RnI6ZC+vxolgWTlQBQHMc6ZCqSVWH0zsmTvud+Xt0TZ3wbzqHNdKIHI3MJ8cNFku7QpGBkaxNkCnjC0EQ8dfBAIanZKPPA/M1ucm0= Authentication-Results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=amd.com; Received: from DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by DM5PR12MB1771.namprd12.prod.outlook.com (2603:10b6:3:110::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3216.23; Wed, 22 Jul 2020 20:48:46 +0000 Received: from DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::25ec:e6ba:197c:4eb0]) by DM5PR12MB1355.namprd12.prod.outlook.com ([fe80::25ec:e6ba:197c:4eb0%8]) with mapi id 15.20.3216.021; Wed, 22 Jul 2020 20:48:46 +0000 Subject: Re: [edk2-devel] [PATCH v11 06/46] MdePkg/BaseLib: Add support for the XGETBV instruction To: Laszlo Ersek , "Liu, Zhiguang" , "devel@edk2.groups.io" Cc: Brijesh Singh , Ard Biesheuvel , "Dong, Eric" , "Justen, Jordan L" , "Gao, Liming" , "Kinney, Michael D" , "Ni, Ray" References: <0d091f43ae96ca4617f6a95a018bfaed6280eec2.1595366363.git.thomas.lendacky@amd.com> <59baa2d3-69e0-2f98-27b8-92010f393109@redhat.com> From: "Lendacky, Thomas" Message-ID: Date: Wed, 22 Jul 2020 15:48:44 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 In-Reply-To: <59baa2d3-69e0-2f98-27b8-92010f393109@redhat.com> X-ClientProxiedBy: SN4PR0201CA0015.namprd02.prod.outlook.com (2603:10b6:803:2b::25) 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 [10.236.30.118] (165.204.77.1) by SN4PR0201CA0015.namprd02.prod.outlook.com (2603:10b6:803:2b::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3216.23 via Frontend Transport; Wed, 22 Jul 2020 20:48:45 +0000 X-Originating-IP: [165.204.77.1] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 4905c0df-0068-43ba-87ae-08d82e80a0c9 X-MS-TrafficTypeDiagnostic: DM5PR12MB1771: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:9508; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: YFfFDzNmeZ16UtmSWb9QRyMcay1w7yFn7fXI1noGIKAf306JdiXwJP2PFL7+cUklBABy/Zikow4kG6TK/Q2uQ02Q58N4FUBXFqFmFsTOTwYU0xvdwavFpVBJve1wf9lgUsLd3Ha4XHX46IcJCNnRRWCBUAyUww42QJiBxeGr0L0l26l/fNMw2sOxkgmwwj0Eo4Gn6cfCdReUN/tT8S6TDSmLm5CwQPGIOKp3Y403x5PuKlXHc/KrS3Rj7a5QV9j9BLHz6Rt3mRr7OTmeR7sS3ZLx7IO1ZYU9aHe5pcVIqkM5Qs/mTmA1kG9cqxXPDSd0/I67jpoY81aXBOQ2F95wVehUIonLH4+EbGm6XG39PFpUe11fhf5qVXVKfH2YcwIWpgdOhtbqBZmzRjso7xa+nLTWtxW333yi2azKE67cEKnL/49lrwiCI06QdKzcDYYUQkdpE8gFJOzmfwIwSDq6QQ== 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)(39860400002)(136003)(396003)(376002)(366004)(346002)(66556008)(66476007)(26005)(66946007)(16526019)(54906003)(16576012)(5660300002)(186003)(316002)(956004)(31686004)(2616005)(110136005)(8676002)(966005)(8936002)(36756003)(19627235002)(86362001)(478600001)(45080400002)(6486002)(53546011)(52116002)(4326008)(83380400001)(2906002)(31696002)(43740500002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData: cs7xiwUktfSeiT+0CDPoFa3WDNGPcHiYR+YjD9HO05qVYrPEMIV1xxxMOk0+ipixMnJUhF28jyUQ+oqDlpavCYLZJ9EeiR0KyjUEyj6AlZiEagLUFPIscFhEkT6ADRKuICMIYKTC0XIHqqUFtr7BWSOc41zaRi2Ic5fDc/mVgdPIkuDxHdS+cwzlAWyRAqoG8uGnNGSkwhvBADvzoZmjEgtp7qbZ8yrScQRarxw/9X0ieDL/35pbF5wJH2s+AXjizTOuVWQsrQqBXlvDy6QM6sRkovBv03HCg6plUA3hiyegqwJNcSNqpztHbkeolgbeh1ZNaKQC7CNUauTrzTTEg6IoA5tUZPny+qfUbm49iKjR2ruGdxf/gfFjjoI3iZ92T/jWqIgvqb4yRJ7VQK2ong5VNWVExxVCbBONs7EcSwFo2RZ4eJDnD789DpGaMnF8vgA07pNc4mY44kgi1OpFmum/6aNqw0Q9ASAhfBnzwLA= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4905c0df-0068-43ba-87ae-08d82e80a0c9 X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jul 2020 20:48:46.3137 (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: 7tB5AL3oTKTBEdcLOgvyqzuy0RrLZFJHOzRF++91DBrQl9DaStGDUGYtmd1lDC9NtDYqcSaekkaLuTvitzJmbg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR12MB1771 Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit On 7/22/20 3:27 PM, Laszlo Ersek wrote: > On 07/22/20 02:55, Liu, Zhiguang wrote: >> Hi Tom, >> Nasm is a cross-OS assembly code and can be used in Linux. >> So I think we don't need implement the same function in GccInline.c, we can just use the nasm file in Linux. > > I could agree, but this would create an inconsistency with the existent > functions (where both gcc inline assembly and NASM exists). > > For example, consider AsmReadEflags(): > - inline assembly for MSFT IA32 ("Ia32/ReadEflags.c") > - NASM for MSFT X64 ("X64/ReadEflags.nasm") > - inline assembly for GCC IA32 ("Ia32/GccInline.c") > - inline assembly for GCC X64 ("X64/GccInline.c") > > The source file "X64/ReadEflags.nasm" could be used with GCC X64 too, > not just with MSFT X64. > > So why do we have the gcc inline implementation for AsmReadEflags() in > "X64/GccInline.c", in the first place? > > The pattern that a contributor is supposed to follow is not clear to me. Thanks for replying Laszlo. For some reason the original email from Zhiguang has not made it to my inbox. Hopefully it is only delayed vs going into some bit-bucket in our mail server... I'll keep an eye out on the edk2.groups.io site to try and not miss anything. Thanks, Tom > > Thanks, > Laszlo > >>> -----Original Message----- >>> From: devel@edk2.groups.io On Behalf Of >>> Lendacky, Thomas >>> Sent: Wednesday, July 22, 2020 5:19 AM >>> To: devel@edk2.groups.io >>> Cc: Brijesh Singh ; Ard Biesheuvel >>> ; Dong, Eric ; Justen, >>> Jordan L ; Laszlo Ersek ; >>> Gao, Liming ; Kinney, Michael D >>> ; Ni, Ray >>> Subject: [edk2-devel] [PATCH v11 06/46] MdePkg/BaseLib: Add support for >>> the XGETBV instruction >>> >>> From: Tom Lendacky >>> >>> 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%7C71ad2ee66be84e95474b08d82e7dbcd7%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637310464865695923&sdata=GRMR9I8VwFIc2NtpOUDBFeoCpy9UgzWidaYEcx1wYfg%3D&reserved=0 >>> >>> Under SEV-ES, a CPUID instruction requires the current value of the XCR0 >>> register. In order to retrieve that value, the XGETBV instruction needs >>> to be executed. >>> >>> Provide the necessary support to execute the XGETBV instruction. >>> >>> Cc: Michael D Kinney >>> Cc: Liming Gao >>> Signed-off-by: Tom Lendacky >>> --- >>> MdePkg/Library/BaseLib/BaseLib.inf | 2 ++ >>> MdePkg/Include/Library/BaseLib.h | 17 +++++++++++++ >>> MdePkg/Library/BaseLib/Ia32/GccInline.c | 28 ++++++++++++++++++++ >>> MdePkg/Library/BaseLib/X64/GccInline.c | 30 ++++++++++++++++++++++ >>> MdePkg/Library/BaseLib/Ia32/XGetBv.nasm | 31 >>> ++++++++++++++++++++++ >>> MdePkg/Library/BaseLib/X64/XGetBv.nasm | 34 >>> +++++++++++++++++++++++++ >>> 6 files changed, 142 insertions(+) >>> create mode 100644 MdePkg/Library/BaseLib/Ia32/XGetBv.nasm >>> create mode 100644 MdePkg/Library/BaseLib/X64/XGetBv.nasm >>> >>> diff --git a/MdePkg/Library/BaseLib/BaseLib.inf >>> b/MdePkg/Library/BaseLib/BaseLib.inf >>> index c740a819cacf..e26c0d8cb0ac 100644 >>> --- a/MdePkg/Library/BaseLib/BaseLib.inf >>> +++ b/MdePkg/Library/BaseLib/BaseLib.inf >>> @@ -153,6 +153,7 @@ [Sources.Ia32] >>> Ia32/ARShiftU64.c | MSFT >>> Ia32/EnableCache.c | MSFT >>> Ia32/DisableCache.c | MSFT >>> + Ia32/XGetBv.nasm | MSFT >>> >>> >>> Ia32/GccInline.c | GCC >>> @@ -288,6 +289,7 @@ [Sources.X64] >>> X64/ReadCr2.nasm| MSFT >>> X64/ReadCr0.nasm| MSFT >>> X64/ReadEflags.nasm| MSFT >>> + X64/XGetBv.nasm | MSFT >>> >>> >>> X64/Non-existing.c >>> diff --git a/MdePkg/Include/Library/BaseLib.h >>> b/MdePkg/Include/Library/BaseLib.h >>> index 8e7b87cbda4e..7edf0051a0a0 100644 >>> --- a/MdePkg/Include/Library/BaseLib.h >>> +++ b/MdePkg/Include/Library/BaseLib.h >>> @@ -7831,6 +7831,23 @@ AsmLfence ( >>> VOID >>> ); >>> >>> +/** >>> + Executes a XGETBV instruction >>> + >>> + Executes a XGETBV instruction. This function is only available on IA-32 and >>> + x64. >>> + >>> + @param[in] Index Extended control register index >>> + >>> + @return The current value of the extended control register >>> +**/ >>> +UINT64 >>> +EFIAPI >>> +AsmXGetBv ( >>> + IN UINT32 Index >>> + ); >>> + >>> + >>> /** >>> Patch the immediate operand of an IA32 or X64 instruction such that the >>> byte, >>> word, dword or qword operand is encoded at the end of the instruction's >>> diff --git a/MdePkg/Library/BaseLib/Ia32/GccInline.c >>> b/MdePkg/Library/BaseLib/Ia32/GccInline.c >>> index 6ed938187a08..c2565ab9a183 100644 >>> --- a/MdePkg/Library/BaseLib/Ia32/GccInline.c >>> +++ b/MdePkg/Library/BaseLib/Ia32/GccInline.c >>> @@ -584,3 +584,31 @@ AsmReadTsc ( >>> >>> return Data; >>> } >>> + >>> + >>> +/** >>> + Executes a XGETBV instruction >>> + >>> + Executes a XGETBV instruction. This function is only available on IA-32 and >>> + x64. >>> + >>> + @param[in] Index Extended control register index >>> + >>> + @return The current value of the extended control register >>> +**/ >>> +UINT64 >>> +EFIAPI >>> +AsmXGetBv ( >>> + IN UINT32 Index >>> + ) >>> +{ >>> + UINT64 Data; >>> + >>> + __asm__ __volatile__ ( >>> + "xgetbv" >>> + : "=A" (Data) >>> + : "c" (Index) >>> + ); >>> + >>> + return Data; >>> +} >>> diff --git a/MdePkg/Library/BaseLib/X64/GccInline.c >>> b/MdePkg/Library/BaseLib/X64/GccInline.c >>> index 40a208f1985f..65f864e35922 100644 >>> --- a/MdePkg/Library/BaseLib/X64/GccInline.c >>> +++ b/MdePkg/Library/BaseLib/X64/GccInline.c >>> @@ -560,3 +560,33 @@ AsmReadTsc ( >>> >>> return (((UINT64)HiData) << 32) | LowData; >>> } >>> + >>> + >>> +/** >>> + Executes a XGETBV instruction >>> + >>> + Executes a XGETBV instruction. This function is only available on IA-32 and >>> + x64. >>> + >>> + @param[in] Index Extended control register index >>> + >>> + @return The current value of the extended control register >>> +**/ >>> +UINT64 >>> +EFIAPI >>> +AsmXGetBv ( >>> + IN UINT32 Index >>> + ) >>> +{ >>> + UINT32 LowData; >>> + UINT32 HighData; >>> + >>> + __asm__ __volatile__ ( >>> + "xgetbv" >>> + : "=a" (LowData), >>> + "=d" (HighData) >>> + : "c" (Index) >>> + ); >>> + >>> + return (((UINT64)HighData) << 32) | LowData; >>> +} >>> diff --git a/MdePkg/Library/BaseLib/Ia32/XGetBv.nasm >>> b/MdePkg/Library/BaseLib/Ia32/XGetBv.nasm >>> new file mode 100644 >>> index 000000000000..9f7b03bbff35 >>> --- /dev/null >>> +++ b/MdePkg/Library/BaseLib/Ia32/XGetBv.nasm >>> @@ -0,0 +1,31 @@ >>> +;------------------------------------------------------------------------------ >>> +; >>> +; Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.
>>> +; SPDX-License-Identifier: BSD-2-Clause-Patent >>> +; >>> +; Module Name: >>> +; >>> +; XGetBv.Asm >>> +; >>> +; Abstract: >>> +; >>> +; AsmXgetBv function >>> +; >>> +; Notes: >>> +; >>> +;------------------------------------------------------------------------------ >>> + >>> + SECTION .text >>> + >>> +;------------------------------------------------------------------------------ >>> +; UINT64 >>> +; EFIAPI >>> +; AsmXGetBv ( >>> +; IN UINT32 Index >>> +; ); >>> +;------------------------------------------------------------------------------ >>> +global ASM_PFX(AsmXGetBv) >>> +ASM_PFX(AsmXGetBv): >>> + mov ecx, [esp + 4] >>> + xgetbv >>> + ret >>> diff --git a/MdePkg/Library/BaseLib/X64/XGetBv.nasm >>> b/MdePkg/Library/BaseLib/X64/XGetBv.nasm >>> new file mode 100644 >>> index 000000000000..09f3be8ae0a8 >>> --- /dev/null >>> +++ b/MdePkg/Library/BaseLib/X64/XGetBv.nasm >>> @@ -0,0 +1,34 @@ >>> +;------------------------------------------------------------------------------ >>> +; >>> +; Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.
>>> +; SPDX-License-Identifier: BSD-2-Clause-Patent >>> +; >>> +; Module Name: >>> +; >>> +; XGetBv.Asm >>> +; >>> +; Abstract: >>> +; >>> +; AsmXgetBv function >>> +; >>> +; Notes: >>> +; >>> +;------------------------------------------------------------------------------ >>> + >>> + DEFAULT REL >>> + SECTION .text >>> + >>> +;------------------------------------------------------------------------------ >>> +; UINT64 >>> +; EFIAPI >>> +; AsmXGetBv ( >>> +; IN UINT32 Index >>> +; ); >>> +;------------------------------------------------------------------------------ >>> +global ASM_PFX(AsmXGetBv) >>> +ASM_PFX(AsmXGetBv): >>> + xgetbv >>> + shl rdx, 32 >>> + or rax, rdx >>> + ret >>> + >>> -- >>> 2.27.0 >>> >>> >>> >> >