From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mx.groups.io with SMTP id smtpd.web12.7738.1594303642915718099 for ; Thu, 09 Jul 2020 07:07:23 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=Sqnkr6+k; spf=pass (domain: intel.com, ip: 134.134.136.24, mailfrom: liming.gao@intel.com) IronPort-SDR: 2md+VgzALbdb0ovT915MXUV3Nsfn7dom5A6j9n3F1T1baJp5oauZtrwW3c5oW/3K/XbpjsHFYj +MdPfHQ1deXA== X-IronPort-AV: E=McAfee;i="6000,8403,9676"; a="149483685" X-IronPort-AV: E=Sophos;i="5.75,331,1589266800"; d="scan'208";a="149483685" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Jul 2020 07:07:21 -0700 IronPort-SDR: zGhwatwTkH1GqBvp+gqAa839NpWbWfx/sVChmBEWDs1Oz6lWntezkUWtZSDA/aznvLnijBfP+q 8C9RjIxYijKw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,331,1589266800"; d="scan'208";a="457916464" Received: from orsmsx110.amr.corp.intel.com ([10.22.240.8]) by orsmga005.jf.intel.com with ESMTP; 09 Jul 2020 07:07:21 -0700 Received: from orsmsx161.amr.corp.intel.com (10.22.240.84) by ORSMSX110.amr.corp.intel.com (10.22.240.8) with Microsoft SMTP Server (TLS) id 14.3.439.0; Thu, 9 Jul 2020 07:07:21 -0700 Received: from ORSEDG001.ED.cps.intel.com (10.7.248.4) by ORSMSX161.amr.corp.intel.com (10.22.240.84) with Microsoft SMTP Server (TLS) id 14.3.439.0; Thu, 9 Jul 2020 07:07:21 -0700 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (104.47.58.109) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (TLS) id 14.3.439.0; Thu, 9 Jul 2020 07:07:20 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=jRzRKmNt1IJTq1JMph0NBR8IKplytIOLSe0Os3CMF76tAKUEvVB7XjGugzta5uXIIYZHEGwute6KlMRIaET4fF+s7Oql1HFnLqg690VjL+tpbl1EGwQvzFxZcJpvQxhvGEKDCFiXRiM8uwYB5+NPNmYbptX8YW01T6Th8uUt6XerVe9rob2Nx0sE1Y498jkJDI2NkgpJmc7IhHtdkFs1iqGz6SnU9v+5W3yZdqcVpHXebmojpX1sNRIm5oHZ70b/QNze4EemCwP2ezu7ZHIMH9t2IxhyivF6CTVtJ058WE37dltklaXd7vle8k7SVG/z31q1ofwAnRHMVv8vluJ80A== 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=KOAGa9QxOmTsREpBpTb2mLExjDknDD5D3O1V61svTmI=; b=bb5IunkjaJ8RhysiPgrycmVqSgXIekW1iSvv64ceHDqI7z6UoNnSuxQVWWFoCSMFJ55m8GKOR4QJ3kU7ioH8/T5f2OJ1X0ibxkZ07JqJNng0Phl2qcgljJLYl9AzqtY7vJitvJ5YraN7zLIYmcZb6OErrCCPQLrd4y8kuaWNzl02g4SSpF2K3gfYrOD79qQy4oTJI4jAyiqoR+ELMeUC4naQtP8MlJwj1ZqsD2YT+a2vP7VsFT4hJp+IDz6ItCJyR8nYBrLiaTQy57V2+UtSIlL1rL6W7sDC2md1HBxs+I8/sRGLG/VuqRGOPCdC+NqEOz0KfiRoZSgLrB0+MxaE+Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=KOAGa9QxOmTsREpBpTb2mLExjDknDD5D3O1V61svTmI=; b=Sqnkr6+k8PosDNIUHesxij2ZzEFfCxiYpNGXngr5hY/cS/erTBWcFoJJT/pm24w2QQKbn/7fKgnYBuNKnrlrfZ09ovwY+94rFMCS/BHFmWW4+3C6qX5b8xn/l+GhZXqS77hfXXQOS6+jtJ4LvbKsonD8R89/mvir8c/fFDxdT3g= Received: from MWHPR11MB1630.namprd11.prod.outlook.com (2603:10b6:301:e::7) by MW3PR11MB4524.namprd11.prod.outlook.com (2603:10b6:303:2c::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3153.21; Thu, 9 Jul 2020 14:07:18 +0000 Received: from MWHPR11MB1630.namprd11.prod.outlook.com ([fe80::7847:b564:1b55:b67e]) by MWHPR11MB1630.namprd11.prod.outlook.com ([fe80::7847:b564:1b55:b67e%6]) with mapi id 15.20.3174.021; Thu, 9 Jul 2020 14:07:18 +0000 From: "Liming Gao" To: "Kinney, Michael D" , "devel@edk2.groups.io" CC: Sean Brogan , Bret Barkelew , "Yao, Jiewen" Subject: Re: [Patch 04/15] MdePkg/BaseLib: Break out IA32/X64 GCC inline privileged functions Thread-Topic: [Patch 04/15] MdePkg/BaseLib: Break out IA32/X64 GCC inline privileged functions Thread-Index: AQHWQqqmlcMXDxldM0WGasoSQZP0aaj/bkPw Date: Thu, 9 Jul 2020 14:07:18 +0000 Message-ID: References: <20200615001918.22164-1-michael.d.kinney@intel.com> <20200615001918.22164-5-michael.d.kinney@intel.com> In-Reply-To: <20200615001918.22164-5-michael.d.kinney@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-version: 11.2.0.6 dlp-product: dlpe-windows dlp-reaction: no-action authentication-results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=intel.com; x-originating-ip: [192.198.147.213] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: c122a749-d9bf-45d1-99b9-08d824116400 x-ms-traffictypediagnostic: MW3PR11MB4524: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:8273; x-forefront-prvs: 04599F3534 x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: O/yvFeDN2hIVWH8Pc87DiOf5q1J+dbE1uTJg9QvcXnu0yFPvaQa/Jds8YyI3jeR8dIB4RdoaIdT+0UCh+vCw568Z7TYQf55mXVSJWpNqWOqXSRHc4f0mFT4+EgH6Wiez0m7ojjZYt5frmEojgl2+nPHxPfIzjo2GZ+SrwZ/i6pPw+w8EOGmLhP4tXDDuy15m0tOizeOLyWNhx7PbPRPzCbbg7Uh4FYdXTyvx+JP+74KClcDYnCs1hGYOr9cwJZnAvxXLpWjcdlyolYLBoH9MH1krrS3KcfDcHtCRoRHN8ryvOObNWS6RSUG3gxpCffCC/dZEipK0390datFzFQnKedOoSKOVMbMXJSqBnWFvAlJmGku356u7R9OR8aCJdu74pYomWXKjpbu1ycVFJhkfjA== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MWHPR11MB1630.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFTY:;SFS:(4636009)(136003)(376002)(39860400002)(346002)(366004)(396003)(186003)(5660300002)(2906002)(71200400001)(9686003)(52536014)(55016002)(54906003)(8676002)(66556008)(66446008)(66476007)(966005)(53546011)(64756008)(33656002)(26005)(30864003)(83380400001)(6506007)(66946007)(19627235002)(86362001)(7696005)(4326008)(316002)(107886003)(110136005)(76116006)(8936002)(478600001)(45080400002)(579004)(559001);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata: r44ChTXtwxDxPjh3Cy89BIzVnJlVTwbCe2xewV5edHBeWqOj68+Us8Vqq15boKzTZ/7duWaDHvhkCGF08Gi0W8OP4e80TqPdYtLZrxn2v+GBBnQ3+zWdWgRZJeBJNEBWruFL/vkOFiNPXntoIEdLRgROgh6GlNV5GUQsQ+NjFcRDewrSCR3gEZZoNtUmdX5kHGpk7fIapDpu8bCwi3Poeah0r2y/7NN+Na7oBYseGMIx0/Q+5aF0iLZg2KyGpyAcHZL7qzRwquG2vt+5bvFm7L+g8WHQ1AdtpNBH1s2+uuNcNCP5AJXjBU7lC8SDnDw/LWj74lIO8p8Ma7KCgxK1HKUiOwU0ASu2o8FC/oYgh9QjkRO8yOcbDNcm5mvuw4P/Wm+29TK/rYtVf99y+z9f9cykjBMJqUEZzC90J05dLigLHd0oXc1E2/WW9IGpJJCvJGjPZeN8cDbkDhOiFkm513feAsBPEO9rRpjfavN9kgPZxHUryyxKMCNlV6Vf1VxW MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MWHPR11MB1630.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: c122a749-d9bf-45d1-99b9-08d824116400 X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Jul 2020 14:07:18.2390 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Qnel5VZM4a7pBmCcQxJzMcPvbsv0g1KnJsBOY4IsfMcgKUtSRNruDIQn6X/hs2udpc35OJIaxUSNwsepSVnheA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW3PR11MB4524 Return-Path: liming.gao@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Mike: Is there the rule to know which function can't be in unit test? And, thos= e functions will be in GccInline.c or GccInlinePriv.c? There is no change i= n MSFT C source file, because MSFT C source file has been separated as the = function level. Right? Thanks Liming > -----Original Message----- > From: Kinney, Michael D > Sent: Monday, June 15, 2020 8:19 AM > To: devel@edk2.groups.io > Cc: Gao, Liming ; Sean Brogan ; Bret Barkelew ; > Yao, Jiewen > Subject: [Patch 04/15] MdePkg/BaseLib: Break out IA32/X64 GCC inline priv= ileged functions >=20 > https://bugzilla.tianocore.org/show_bug.cgi?id=3D2800 >=20 > Break out the IA32/X64 GCC inline functions that can not be used > in a unit test host application into their own source file. This > does not make any changes to the BaseLib library instance. This > is in preparation for a new BaseLib instances that is safe to use > with host-based unit test applications. >=20 > Cc: Liming Gao > Cc: Sean Brogan > Cc: Bret Barkelew > Cc: Jiewen Yao > Signed-off-by: Michael D Kinney > --- > MdePkg/Library/BaseLib/BaseLib.inf | 4 +- > MdePkg/Library/BaseLib/Ia32/GccInline.c | 1181 +--------------- > .../Ia32/{GccInline.c =3D> GccInlinePriv.c} | 601 +------- > MdePkg/Library/BaseLib/X64/GccInline.c | 1240 +---------------- > .../X64/{GccInline.c =3D> GccInlinePriv.c} | 572 +------- > 5 files changed, 11 insertions(+), 3587 deletions(-) > copy MdePkg/Library/BaseLib/Ia32/{GccInline.c =3D> GccInlinePriv.c} (62%= ) > copy MdePkg/Library/BaseLib/X64/{GccInline.c =3D> GccInlinePriv.c} (65%) >=20 > diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/= BaseLib.inf > index a57ae2da31..c740a819ca 100644 > --- a/MdePkg/Library/BaseLib/BaseLib.inf > +++ b/MdePkg/Library/BaseLib/BaseLib.inf > @@ -1,7 +1,7 @@ > ## @file > # Base Library implementation. > # > -# Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved. > +# Copyright (c) 2007 - 2020, Intel Corporation. All rights reserved. > # Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved. > # Portions copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.
> # Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All ri= ghts reserved.
> @@ -156,6 +156,7 @@ [Sources.Ia32] >=20 >=20 > Ia32/GccInline.c | GCC > + Ia32/GccInlinePriv.c | GCC > Ia32/Thunk16.nasm > Ia32/EnableDisableInterrupts.nasm| GCC > Ia32/EnablePaging64.nasm > @@ -310,6 +311,7 @@ [Sources.X64] > X86PatchInstruction.c > X86SpeculationBarrier.c > X64/GccInline.c | GCC > + X64/GccInlinePriv.c | GCC > X64/EnableDisableInterrupts.nasm > X64/DisablePaging64.nasm > X64/RdRand.nasm > diff --git a/MdePkg/Library/BaseLib/Ia32/GccInline.c b/MdePkg/Library/Bas= eLib/Ia32/GccInline.c > index 5287200f87..6ed938187a 100644 > --- a/MdePkg/Library/BaseLib/Ia32/GccInline.c > +++ b/MdePkg/Library/BaseLib/Ia32/GccInline.c > @@ -1,7 +1,7 @@ > /** @file > GCC inline implementation of BaseLib processor specific functions. >=20 > - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
> + Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.
> Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved. > SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > @@ -10,8 +10,6 @@ >=20 > #include "BaseLibInternals.h" >=20 > - > - > /** > Used to serialize load and store operations. >=20 > @@ -31,41 +29,6 @@ MemoryFence ( > __asm__ __volatile__ ("":::"memory"); > } >=20 > - > -/** > - Enables CPU interrupts. > - > - Enables CPU interrupts. > - > -**/ > -VOID > -EFIAPI > -EnableInterrupts ( > - VOID > - ) > -{ > - __asm__ __volatile__ ("sti"::: "memory"); > -} > - > - > -/** > - Disables CPU interrupts. > - > - Disables CPU interrupts. > - > -**/ > -VOID > -EFIAPI > -DisableInterrupts ( > - VOID > - ) > -{ > - __asm__ __volatile__ ("cli"::: "memory"); > -} > - > - > - > - > /** > Requests CPU to pause for a short period of time. >=20 > @@ -82,7 +45,6 @@ CpuPause ( > __asm__ __volatile__ ("pause"); > } >=20 > - > /** > Generates a breakpoint on the CPU. >=20 > @@ -99,75 +61,6 @@ CpuBreakpoint ( > __asm__ __volatile__ ("int $3"); > } >=20 > - > - > -/** > - Returns a 64-bit Machine Specific Register(MSR). > - > - Reads and returns the 64-bit MSR specified by Index. No parameter chec= king is > - performed on Index, and some Index values may cause CPU exceptions. Th= e > - caller must either guarantee that Index is valid, or the caller must s= et up > - exception handlers to catch the exceptions. This function is only avai= lable > - on IA-32 and X64. > - > - @param Index The 32-bit MSR index to read. > - > - @return The value of the MSR identified by Index. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMsr64 ( > - IN UINT32 Index > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "rdmsr" > - : "=3DA" (Data) // %0 > - : "c" (Index) // %1 > - ); > - > - return Data; > -} > - > -/** > - Writes a 64-bit value to a Machine Specific Register(MSR), and returns= the > - value. > - > - Writes the 64-bit value specified by Value to the MSR specified by Ind= ex. The > - 64-bit value written to the MSR is returned. No parameter checking is > - performed on Index or Value, and some of these may cause CPU exception= s. The > - caller must either guarantee that Index and Value are valid, or the ca= ller > - must establish proper exception handlers. This function is only availa= ble on > - IA-32 and X64. > - > - @param Index The 32-bit MSR index to write. > - @param Value The 64-bit value to write to the MSR. > - > - @return Value > - > -**/ > -UINT64 > -EFIAPI > -AsmWriteMsr64 ( > - IN UINT32 Index, > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "wrmsr" > - : > - : "c" (Index), > - "A" (Value) > - ); > - > - return Value; > -} > - > - > - > /** > Reads the current value of the EFLAGS register. >=20 > @@ -195,965 +88,6 @@ AsmReadEflags ( > return Eflags; > } >=20 > - > - > -/** > - Reads the current value of the Control Register 0 (CR0). > - > - Reads and returns the current value of CR0. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of the Control Register 0 (CR0). > - > -**/ > -UINTN > -EFIAPI > -AsmReadCr0 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "movl %%cr0,%0" > - : "=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of the Control Register 2 (CR2). > - > - Reads and returns the current value of CR2. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of the Control Register 2 (CR2). > - > -**/ > -UINTN > -EFIAPI > -AsmReadCr2 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "movl %%cr2, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > -/** > - Reads the current value of the Control Register 3 (CR3). > - > - Reads and returns the current value of CR3. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of the Control Register 3 (CR3). > - > -**/ > -UINTN > -EFIAPI > -AsmReadCr3 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "movl %%cr3, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of the Control Register 4 (CR4). > - > - Reads and returns the current value of CR4. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of the Control Register 4 (CR4). > - > -**/ > -UINTN > -EFIAPI > -AsmReadCr4 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "movl %%cr4, %0" > - : "=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Writes a value to Control Register 0 (CR0). > - > - Writes and returns a new value to CR0. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Cr0 The value to write to CR0. > - > - @return The value written to CR0. > - > -**/ > -UINTN > -EFIAPI > -AsmWriteCr0 ( > - UINTN Cr0 > - ) > -{ > - __asm__ __volatile__ ( > - "movl %0, %%cr0" > - : > - : "r" (Cr0) > - ); > - return Cr0; > -} > - > - > -/** > - Writes a value to Control Register 2 (CR2). > - > - Writes and returns a new value to CR2. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Cr2 The value to write to CR2. > - > - @return The value written to CR2. > - > -**/ > -UINTN > -EFIAPI > -AsmWriteCr2 ( > - UINTN Cr2 > - ) > -{ > - __asm__ __volatile__ ( > - "movl %0, %%cr2" > - : > - : "r" (Cr2) > - ); > - return Cr2; > -} > - > - > -/** > - Writes a value to Control Register 3 (CR3). > - > - Writes and returns a new value to CR3. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Cr3 The value to write to CR3. > - > - @return The value written to CR3. > - > -**/ > -UINTN > -EFIAPI > -AsmWriteCr3 ( > - UINTN Cr3 > - ) > -{ > - __asm__ __volatile__ ( > - "movl %0, %%cr3" > - : > - : "r" (Cr3) > - ); > - return Cr3; > -} > - > - > -/** > - Writes a value to Control Register 4 (CR4). > - > - Writes and returns a new value to CR4. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Cr4 The value to write to CR4. > - > - @return The value written to CR4. > - > -**/ > -UINTN > -EFIAPI > -AsmWriteCr4 ( > - UINTN Cr4 > - ) > -{ > - __asm__ __volatile__ ( > - "movl %0, %%cr4" > - : > - : "r" (Cr4) > - ); > - return Cr4; > -} > - > - > -/** > - Reads the current value of Debug Register 0 (DR0). > - > - Reads and returns the current value of DR0. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 0 (DR0). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr0 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "movl %%dr0, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Debug Register 1 (DR1). > - > - Reads and returns the current value of DR1. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 1 (DR1). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr1 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "movl %%dr1, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Debug Register 2 (DR2). > - > - Reads and returns the current value of DR2. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 2 (DR2). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr2 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "movl %%dr2, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Debug Register 3 (DR3). > - > - Reads and returns the current value of DR3. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 3 (DR3). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr3 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "movl %%dr3, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Debug Register 4 (DR4). > - > - Reads and returns the current value of DR4. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 4 (DR4). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr4 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "movl %%dr4, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Debug Register 5 (DR5). > - > - Reads and returns the current value of DR5. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 5 (DR5). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr5 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "movl %%dr5, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Debug Register 6 (DR6). > - > - Reads and returns the current value of DR6. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 6 (DR6). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr6 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "movl %%dr6, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Debug Register 7 (DR7). > - > - Reads and returns the current value of DR7. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 7 (DR7). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr7 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "movl %%dr7, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Writes a value to Debug Register 0 (DR0). > - > - Writes and returns a new value to DR0. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr0 The value to write to Dr0. > - > - @return The value written to Debug Register 0 (DR0). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr0 ( > - UINTN Dr0 > - ) > -{ > - __asm__ __volatile__ ( > - "movl %0, %%dr0" > - : > - : "r" (Dr0) > - ); > - return Dr0; > -} > - > - > -/** > - Writes a value to Debug Register 1 (DR1). > - > - Writes and returns a new value to DR1. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr1 The value to write to Dr1. > - > - @return The value written to Debug Register 1 (DR1). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr1 ( > - UINTN Dr1 > - ) > -{ > - __asm__ __volatile__ ( > - "movl %0, %%dr1" > - : > - : "r" (Dr1) > - ); > - return Dr1; > -} > - > - > -/** > - Writes a value to Debug Register 2 (DR2). > - > - Writes and returns a new value to DR2. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr2 The value to write to Dr2. > - > - @return The value written to Debug Register 2 (DR2). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr2 ( > - UINTN Dr2 > - ) > -{ > - __asm__ __volatile__ ( > - "movl %0, %%dr2" > - : > - : "r" (Dr2) > - ); > - return Dr2; > -} > - > - > -/** > - Writes a value to Debug Register 3 (DR3). > - > - Writes and returns a new value to DR3. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr3 The value to write to Dr3. > - > - @return The value written to Debug Register 3 (DR3). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr3 ( > - UINTN Dr3 > - ) > -{ > - __asm__ __volatile__ ( > - "movl %0, %%dr3" > - : > - : "r" (Dr3) > - ); > - return Dr3; > -} > - > - > -/** > - Writes a value to Debug Register 4 (DR4). > - > - Writes and returns a new value to DR4. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr4 The value to write to Dr4. > - > - @return The value written to Debug Register 4 (DR4). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr4 ( > - UINTN Dr4 > - ) > -{ > - __asm__ __volatile__ ( > - "movl %0, %%dr4" > - : > - : "r" (Dr4) > - ); > - return Dr4; > -} > - > - > -/** > - Writes a value to Debug Register 5 (DR5). > - > - Writes and returns a new value to DR5. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr5 The value to write to Dr5. > - > - @return The value written to Debug Register 5 (DR5). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr5 ( > - UINTN Dr5 > - ) > -{ > - __asm__ __volatile__ ( > - "movl %0, %%dr5" > - : > - : "r" (Dr5) > - ); > - return Dr5; > -} > - > - > -/** > - Writes a value to Debug Register 6 (DR6). > - > - Writes and returns a new value to DR6. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr6 The value to write to Dr6. > - > - @return The value written to Debug Register 6 (DR6). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr6 ( > - UINTN Dr6 > - ) > -{ > - __asm__ __volatile__ ( > - "movl %0, %%dr6" > - : > - : "r" (Dr6) > - ); > - return Dr6; > -} > - > - > -/** > - Writes a value to Debug Register 7 (DR7). > - > - Writes and returns a new value to DR7. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr7 The value to write to Dr7. > - > - @return The value written to Debug Register 7 (DR7). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr7 ( > - UINTN Dr7 > - ) > -{ > - __asm__ __volatile__ ( > - "movl %0, %%dr7" > - : > - : "r" (Dr7) > - ); > - return Dr7; > -} > - > - > -/** > - Reads the current value of Code Segment Register (CS). > - > - Reads and returns the current value of CS. This function is only avail= able on > - IA-32 and X64. > - > - @return The current value of CS. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadCs ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "mov %%cs, %0" > - :"=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Data Segment Register (DS). > - > - Reads and returns the current value of DS. This function is only avail= able on > - IA-32 and X64. > - > - @return The current value of DS. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadDs ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "mov %%ds, %0" > - :"=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Extra Segment Register (ES). > - > - Reads and returns the current value of ES. This function is only avail= able on > - IA-32 and X64. > - > - @return The current value of ES. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadEs ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "mov %%es, %0" > - :"=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of FS Data Segment Register (FS). > - > - Reads and returns the current value of FS. This function is only avail= able on > - IA-32 and X64. > - > - @return The current value of FS. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadFs ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "mov %%fs, %0" > - :"=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of GS Data Segment Register (GS). > - > - Reads and returns the current value of GS. This function is only avail= able on > - IA-32 and X64. > - > - @return The current value of GS. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadGs ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "mov %%gs, %0" > - :"=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Stack Segment Register (SS). > - > - Reads and returns the current value of SS. This function is only avail= able on > - IA-32 and X64. > - > - @return The current value of SS. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadSs ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "mov %%ds, %0" > - :"=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Task Register (TR). > - > - Reads and returns the current value of TR. This function is only avail= able on > - IA-32 and X64. > - > - @return The current value of TR. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadTr ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "str %0" > - : "=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current Global Descriptor Table Register(GDTR) descriptor. > - > - Reads and returns the current GDTR descriptor and returns it in Gdtr. = This > - function is only available on IA-32 and X64. > - > - @param Gdtr The pointer to a GDTR descriptor. > - > -**/ > -VOID > -EFIAPI > -InternalX86ReadGdtr ( > - OUT IA32_DESCRIPTOR *Gdtr > - ) > -{ > - __asm__ __volatile__ ( > - "sgdt %0" > - : "=3Dm" (*Gdtr) > - ); > -} > - > - > -/** > - Writes the current Global Descriptor Table Register (GDTR) descriptor. > - > - Writes and the current GDTR descriptor specified by Gdtr. This functio= n is > - only available on IA-32 and X64. > - > - @param Gdtr The pointer to a GDTR descriptor. > - > -**/ > -VOID > -EFIAPI > -InternalX86WriteGdtr ( > - IN CONST IA32_DESCRIPTOR *Gdtr > - ) > -{ > - __asm__ __volatile__ ( > - "lgdt %0" > - : > - : "m" (*Gdtr) > - ); > - > -} > - > - > -/** > - Reads the current Interrupt Descriptor Table Register(GDTR) descriptor= . > - > - Reads and returns the current IDTR descriptor and returns it in Idtr. = This > - function is only available on IA-32 and X64. > - > - @param Idtr The pointer to a IDTR descriptor. > - > -**/ > -VOID > -EFIAPI > -InternalX86ReadIdtr ( > - OUT IA32_DESCRIPTOR *Idtr > - ) > -{ > - __asm__ __volatile__ ( > - "sidt %0" > - : "=3Dm" (*Idtr) > - ); > -} > - > - > -/** > - Writes the current Interrupt Descriptor Table Register(GDTR) descripto= r. > - > - Writes the current IDTR descriptor and returns it in Idtr. This functi= on is > - only available on IA-32 and X64. > - > - @param Idtr The pointer to a IDTR descriptor. > - > -**/ > -VOID > -EFIAPI > -InternalX86WriteIdtr ( > - IN CONST IA32_DESCRIPTOR *Idtr > - ) > -{ > - __asm__ __volatile__ ( > - "lidt %0" > - : > - : "m" (*Idtr) > - ); > -} > - > - > -/** > - Reads the current Local Descriptor Table Register(LDTR) selector. > - > - Reads and returns the current 16-bit LDTR descriptor value. This funct= ion is > - only available on IA-32 and X64. > - > - @return The current selector of LDT. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadLdtr ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "sldt %0" > - : "=3Dg" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Writes the current Local Descriptor Table Register (GDTR) selector. > - > - Writes and the current LDTR descriptor specified by Ldtr. This functio= n is > - only available on IA-32 and X64. > - > - @param Ldtr 16-bit LDTR selector value. > - > -**/ > -VOID > -EFIAPI > -AsmWriteLdtr ( > - IN UINT16 Ldtr > - ) > -{ > - __asm__ __volatile__ ( > - "lldtw %0" > - : > - : "g" (Ldtr) // %0 > - ); > -} > - > - > /** > Save the current floating point/SSE/SSE2 context to a buffer. >=20 > @@ -1650,116 +584,3 @@ AsmReadTsc ( >=20 > return Data; > } > - > - > -/** > - Reads the current value of a Performance Counter (PMC). > - > - Reads and returns the current value of performance counter specified b= y > - Index. This function is only available on IA-32 and X64. > - > - @param Index The 32-bit Performance Counter index to read. > - > - @return The value of the PMC specified by Index. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadPmc ( > - IN UINT32 Index > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "rdpmc" > - : "=3DA" (Data) > - : "c" (Index) > - ); > - > - return Data; > -} > - > - > - > - > -/** > - Executes a WBINVD instruction. > - > - Executes a WBINVD instruction. This function is only available on IA-3= 2 and > - X64. > - > -**/ > -VOID > -EFIAPI > -AsmWbinvd ( > - VOID > - ) > -{ > - __asm__ __volatile__ ("wbinvd":::"memory"); > -} > - > - > -/** > - Executes a INVD instruction. > - > - Executes a INVD instruction. This function is only available on IA-32 = and > - X64. > - > -**/ > -VOID > -EFIAPI > -AsmInvd ( > - VOID > - ) > -{ > - __asm__ __volatile__ ("invd":::"memory"); > - > -} > - > - > -/** > - Flushes a cache line from all the instruction and data caches within t= he > - coherency domain of the CPU. > - > - Flushed the cache line specified by LinearAddress, and returns LinearA= ddress. > - This function is only available on IA-32 and X64. > - > - @param LinearAddress The address of the cache line to flush. If the C= PU is > - in a physical addressing mode, then LinearAddres= s is a > - physical address. If the CPU is in a virtual > - addressing mode, then LinearAddress is a virtual > - address. > - > - @return LinearAddress > -**/ > -VOID * > -EFIAPI > -AsmFlushCacheLine ( > - IN VOID *LinearAddress > - ) > -{ > - UINT32 RegEdx; > - > - // > - // If the CPU does not support CLFLUSH instruction, > - // then promote flush range to flush entire cache. > - // > - AsmCpuid (0x01, NULL, NULL, NULL, &RegEdx); > - if ((RegEdx & BIT19) =3D=3D 0) { > - __asm__ __volatile__ ("wbinvd":::"memory"); > - return LinearAddress; > - } > - > - > - __asm__ __volatile__ ( > - "clflush (%0)" > - : "+a" (LinearAddress) > - : > - : "memory" > - ); > - > - return LinearAddress; > -} > - > - > diff --git a/MdePkg/Library/BaseLib/Ia32/GccInline.c b/MdePkg/Library/Bas= eLib/Ia32/GccInlinePriv.c > similarity index 62% > copy from MdePkg/Library/BaseLib/Ia32/GccInline.c > copy to MdePkg/Library/BaseLib/Ia32/GccInlinePriv.c > index 5287200f87..30aa63243b 100644 > --- a/MdePkg/Library/BaseLib/Ia32/GccInline.c > +++ b/MdePkg/Library/BaseLib/Ia32/GccInlinePriv.c > @@ -1,7 +1,8 @@ > /** @file > - GCC inline implementation of BaseLib processor specific functions. > + GCC inline implementation of BaseLib processor specific functions that= use > + privlidged instructions. >=20 > - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
> + Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.
> Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved. > SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > @@ -10,28 +11,6 @@ >=20 > #include "BaseLibInternals.h" >=20 > - > - > -/** > - Used to serialize load and store operations. > - > - All loads and stores that proceed calls to this function are guarantee= d to be > - globally visible when this function returns. > - > -**/ > -VOID > -EFIAPI > -MemoryFence ( > - VOID > - ) > -{ > - // This is a little bit of overkill and it is more about the compiler = that it is > - // actually processor synchronization. This is like the _ReadWriteBarr= ier > - // Microsoft specific intrinsic > - __asm__ __volatile__ ("":::"memory"); > -} > - > - > /** > Enables CPU interrupts. >=20 > @@ -63,44 +42,6 @@ DisableInterrupts ( > __asm__ __volatile__ ("cli"::: "memory"); > } >=20 > - > - > - > -/** > - Requests CPU to pause for a short period of time. > - > - Requests CPU to pause for a short period of time. Typically used in MP > - systems to prevent memory starvation while waiting for a spin lock. > - > -**/ > -VOID > -EFIAPI > -CpuPause ( > - VOID > - ) > -{ > - __asm__ __volatile__ ("pause"); > -} > - > - > -/** > - Generates a breakpoint on the CPU. > - > - Generates a breakpoint on the CPU. The breakpoint must be implemented = such > - that code can resume normal execution after the breakpoint. > - > -**/ > -VOID > -EFIAPI > -CpuBreakpoint ( > - VOID > - ) > -{ > - __asm__ __volatile__ ("int $3"); > -} > - > - > - > /** > Returns a 64-bit Machine Specific Register(MSR). >=20 > @@ -166,37 +107,6 @@ AsmWriteMsr64 ( > return Value; > } >=20 > - > - > -/** > - Reads the current value of the EFLAGS register. > - > - Reads and returns the current value of the EFLAGS register. This funct= ion is > - only available on IA-32 and X64. This returns a 32-bit value on IA-32 = and a > - 64-bit value on X64. > - > - @return EFLAGS on IA-32 or RFLAGS on X64. > - > -**/ > -UINTN > -EFIAPI > -AsmReadEflags ( > - VOID > - ) > -{ > - UINTN Eflags; > - > - __asm__ __volatile__ ( > - "pushfl \n\t" > - "popl %0 " > - : "=3Dr" (Eflags) > - ); > - > - return Eflags; > -} > - > - > - > /** > Reads the current value of the Control Register 0 (CR0). >=20 > @@ -1153,505 +1063,6 @@ AsmWriteLdtr ( > ); > } >=20 > - > -/** > - Save the current floating point/SSE/SSE2 context to a buffer. > - > - Saves the current floating point/SSE/SSE2 state to the buffer specifie= d by > - Buffer. Buffer must be aligned on a 16-byte boundary. This function is= only > - available on IA-32 and X64. > - > - @param Buffer The pointer to a buffer to save the floating point/SSE= /SSE2 context. > - > -**/ > -VOID > -EFIAPI > -InternalX86FxSave ( > - OUT IA32_FX_BUFFER *Buffer > - ) > -{ > - __asm__ __volatile__ ( > - "fxsave %0" > - : > - : "m" (*Buffer) // %0 > - ); > -} > - > - > -/** > - Restores the current floating point/SSE/SSE2 context from a buffer. > - > - Restores the current floating point/SSE/SSE2 state from the buffer spe= cified > - by Buffer. Buffer must be aligned on a 16-byte boundary. This function= is > - only available on IA-32 and X64. > - > - @param Buffer The pointer to a buffer to save the floating point/SSE= /SSE2 context. > - > -**/ > -VOID > -EFIAPI > -InternalX86FxRestore ( > - IN CONST IA32_FX_BUFFER *Buffer > - ) > -{ > - __asm__ __volatile__ ( > - "fxrstor %0" > - : > - : "m" (*Buffer) // %0 > - ); > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #0 (MM0). > - > - Reads and returns the current value of MM0. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM0. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm0 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "push %%eax \n\t" > - "push %%eax \n\t" > - "movq %%mm0, (%%esp)\n\t" > - "pop %%eax \n\t" > - "pop %%edx \n\t" > - : "=3DA" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #1 (MM1). > - > - Reads and returns the current value of MM1. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM1. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm1 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "push %%eax \n\t" > - "push %%eax \n\t" > - "movq %%mm1, (%%esp)\n\t" > - "pop %%eax \n\t" > - "pop %%edx \n\t" > - : "=3DA" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #2 (MM2). > - > - Reads and returns the current value of MM2. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM2. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm2 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "push %%eax \n\t" > - "push %%eax \n\t" > - "movq %%mm2, (%%esp)\n\t" > - "pop %%eax \n\t" > - "pop %%edx \n\t" > - : "=3DA" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #3 (MM3). > - > - Reads and returns the current value of MM3. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM3. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm3 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "push %%eax \n\t" > - "push %%eax \n\t" > - "movq %%mm3, (%%esp)\n\t" > - "pop %%eax \n\t" > - "pop %%edx \n\t" > - : "=3DA" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #4 (MM4). > - > - Reads and returns the current value of MM4. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM4. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm4 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "push %%eax \n\t" > - "push %%eax \n\t" > - "movq %%mm4, (%%esp)\n\t" > - "pop %%eax \n\t" > - "pop %%edx \n\t" > - : "=3DA" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #5 (MM5). > - > - Reads and returns the current value of MM5. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM5. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm5 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "push %%eax \n\t" > - "push %%eax \n\t" > - "movq %%mm5, (%%esp)\n\t" > - "pop %%eax \n\t" > - "pop %%edx \n\t" > - : "=3DA" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #6 (MM6). > - > - Reads and returns the current value of MM6. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM6. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm6 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "push %%eax \n\t" > - "push %%eax \n\t" > - "movq %%mm6, (%%esp)\n\t" > - "pop %%eax \n\t" > - "pop %%edx \n\t" > - : "=3DA" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #7 (MM7). > - > - Reads and returns the current value of MM7. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM7. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm7 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "push %%eax \n\t" > - "push %%eax \n\t" > - "movq %%mm7, (%%esp)\n\t" > - "pop %%eax \n\t" > - "pop %%edx \n\t" > - : "=3DA" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #0 (MM0). > - > - Writes the current value of MM0. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM0. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm0 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movq %0, %%mm0" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #1 (MM1). > - > - Writes the current value of MM1. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM1. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm1 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movq %0, %%mm1" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #2 (MM2). > - > - Writes the current value of MM2. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM2. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm2 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movq %0, %%mm2" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #3 (MM3). > - > - Writes the current value of MM3. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM3. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm3 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movq %0, %%mm3" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #4 (MM4). > - > - Writes the current value of MM4. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM4. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm4 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movq %0, %%mm4" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #5 (MM5). > - > - Writes the current value of MM5. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM5. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm5 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movq %0, %%mm5" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #6 (MM6). > - > - Writes the current value of MM6. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM6. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm6 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movq %0, %%mm6" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #7 (MM7). > - > - Writes the current value of MM7. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM7. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm7 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movq %0, %%mm7" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Reads the current value of Time Stamp Counter (TSC). > - > - Reads and returns the current value of TSC. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of TSC > - > -**/ > -UINT64 > -EFIAPI > -AsmReadTsc ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "rdtsc" > - : "=3DA" (Data) > - ); > - > - return Data; > -} > - > - > /** > Reads the current value of a Performance Counter (PMC). >=20 > @@ -1680,9 +1091,6 @@ AsmReadPmc ( > return Data; > } >=20 > - > - > - > /** > Executes a WBINVD instruction. >=20 > @@ -1699,7 +1107,6 @@ AsmWbinvd ( > __asm__ __volatile__ ("wbinvd":::"memory"); > } >=20 > - > /** > Executes a INVD instruction. >=20 > @@ -1761,5 +1168,3 @@ AsmFlushCacheLine ( >=20 > return LinearAddress; > } > - > - > diff --git a/MdePkg/Library/BaseLib/X64/GccInline.c b/MdePkg/Library/Base= Lib/X64/GccInline.c > index 154ce1f57e..40a208f198 100644 > --- a/MdePkg/Library/BaseLib/X64/GccInline.c > +++ b/MdePkg/Library/BaseLib/X64/GccInline.c > @@ -1,7 +1,7 @@ > /** @file > GCC inline implementation of BaseLib processor specific functions. >=20 > - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
> + Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.
> Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved. > SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > @@ -33,40 +33,6 @@ MemoryFence ( > } >=20 >=20 > -/** > - Enables CPU interrupts. > - > - Enables CPU interrupts. > - > -**/ > -VOID > -EFIAPI > -EnableInterrupts ( > - VOID > - ) > -{ > - __asm__ __volatile__ ("sti"::: "memory"); > -} > - > - > -/** > - Disables CPU interrupts. > - > - Disables CPU interrupts. > - > -**/ > -VOID > -EFIAPI > -DisableInterrupts ( > - VOID > - ) > -{ > - __asm__ __volatile__ ("cli"::: "memory"); > -} > - > - > - > - > /** > Requests CPU to pause for a short period of time. >=20 > @@ -101,83 +67,6 @@ CpuBreakpoint ( > } >=20 >=20 > - > -/** > - Returns a 64-bit Machine Specific Register(MSR). > - > - Reads and returns the 64-bit MSR specified by Index. No parameter chec= king is > - performed on Index, and some Index values may cause CPU exceptions. Th= e > - caller must either guarantee that Index is valid, or the caller must s= et up > - exception handlers to catch the exceptions. This function is only avai= lable > - on IA-32 and X64. > - > - @param Index The 32-bit MSR index to read. > - > - @return The value of the MSR identified by Index. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMsr64 ( > - IN UINT32 Index > - ) > -{ > - UINT32 LowData; > - UINT32 HighData; > - > - __asm__ __volatile__ ( > - "rdmsr" > - : "=3Da" (LowData), // %0 > - "=3Dd" (HighData) // %1 > - : "c" (Index) // %2 > - ); > - > - return (((UINT64)HighData) << 32) | LowData; > -} > - > -/** > - Writes a 64-bit value to a Machine Specific Register(MSR), and returns= the > - value. > - > - Writes the 64-bit value specified by Value to the MSR specified by Ind= ex. The > - 64-bit value written to the MSR is returned. No parameter checking is > - performed on Index or Value, and some of these may cause CPU exception= s. The > - caller must either guarantee that Index and Value are valid, or the ca= ller > - must establish proper exception handlers. This function is only availa= ble on > - IA-32 and X64. > - > - @param Index The 32-bit MSR index to write. > - @param Value The 64-bit value to write to the MSR. > - > - @return Value > - > -**/ > -UINT64 > -EFIAPI > -AsmWriteMsr64 ( > - IN UINT32 Index, > - IN UINT64 Value > - ) > -{ > - UINT32 LowData; > - UINT32 HighData; > - > - LowData =3D (UINT32)(Value); > - HighData =3D (UINT32)(Value >> 32); > - > - __asm__ __volatile__ ( > - "wrmsr" > - : > - : "c" (Index), > - "a" (LowData), > - "d" (HighData) > - ); > - > - return Value; > -} > - > - > - > /** > Reads the current value of the EFLAGS register. >=20 > @@ -205,965 +94,6 @@ AsmReadEflags ( > return Eflags; > } >=20 > - > - > -/** > - Reads the current value of the Control Register 0 (CR0). > - > - Reads and returns the current value of CR0. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of the Control Register 0 (CR0). > - > -**/ > -UINTN > -EFIAPI > -AsmReadCr0 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "mov %%cr0,%0" > - : "=3Dr" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of the Control Register 2 (CR2). > - > - Reads and returns the current value of CR2. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of the Control Register 2 (CR2). > - > -**/ > -UINTN > -EFIAPI > -AsmReadCr2 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "mov %%cr2, %0" > - : "=3Dr" (Data) // %0 > - ); > - > - return Data; > -} > - > -/** > - Reads the current value of the Control Register 3 (CR3). > - > - Reads and returns the current value of CR3. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of the Control Register 3 (CR3). > - > -**/ > -UINTN > -EFIAPI > -AsmReadCr3 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "mov %%cr3, %0" > - : "=3Dr" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of the Control Register 4 (CR4). > - > - Reads and returns the current value of CR4. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of the Control Register 4 (CR4). > - > -**/ > -UINTN > -EFIAPI > -AsmReadCr4 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "mov %%cr4, %0" > - : "=3Dr" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Writes a value to Control Register 0 (CR0). > - > - Writes and returns a new value to CR0. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Cr0 The value to write to CR0. > - > - @return The value written to CR0. > - > -**/ > -UINTN > -EFIAPI > -AsmWriteCr0 ( > - UINTN Cr0 > - ) > -{ > - __asm__ __volatile__ ( > - "mov %0, %%cr0" > - : > - : "r" (Cr0) > - ); > - return Cr0; > -} > - > - > -/** > - Writes a value to Control Register 2 (CR2). > - > - Writes and returns a new value to CR2. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Cr2 The value to write to CR2. > - > - @return The value written to CR2. > - > -**/ > -UINTN > -EFIAPI > -AsmWriteCr2 ( > - UINTN Cr2 > - ) > -{ > - __asm__ __volatile__ ( > - "mov %0, %%cr2" > - : > - : "r" (Cr2) > - ); > - return Cr2; > -} > - > - > -/** > - Writes a value to Control Register 3 (CR3). > - > - Writes and returns a new value to CR3. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Cr3 The value to write to CR3. > - > - @return The value written to CR3. > - > -**/ > -UINTN > -EFIAPI > -AsmWriteCr3 ( > - UINTN Cr3 > - ) > -{ > - __asm__ __volatile__ ( > - "mov %0, %%cr3" > - : > - : "r" (Cr3) > - ); > - return Cr3; > -} > - > - > -/** > - Writes a value to Control Register 4 (CR4). > - > - Writes and returns a new value to CR4. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Cr4 The value to write to CR4. > - > - @return The value written to CR4. > - > -**/ > -UINTN > -EFIAPI > -AsmWriteCr4 ( > - UINTN Cr4 > - ) > -{ > - __asm__ __volatile__ ( > - "mov %0, %%cr4" > - : > - : "r" (Cr4) > - ); > - return Cr4; > -} > - > - > -/** > - Reads the current value of Debug Register 0 (DR0). > - > - Reads and returns the current value of DR0. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 0 (DR0). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr0 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "mov %%dr0, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Debug Register 1 (DR1). > - > - Reads and returns the current value of DR1. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 1 (DR1). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr1 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "mov %%dr1, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Debug Register 2 (DR2). > - > - Reads and returns the current value of DR2. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 2 (DR2). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr2 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "mov %%dr2, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Debug Register 3 (DR3). > - > - Reads and returns the current value of DR3. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 3 (DR3). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr3 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "mov %%dr3, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Debug Register 4 (DR4). > - > - Reads and returns the current value of DR4. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 4 (DR4). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr4 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "mov %%dr4, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Debug Register 5 (DR5). > - > - Reads and returns the current value of DR5. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 5 (DR5). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr5 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "mov %%dr5, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Debug Register 6 (DR6). > - > - Reads and returns the current value of DR6. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 6 (DR6). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr6 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "mov %%dr6, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Debug Register 7 (DR7). > - > - Reads and returns the current value of DR7. This function is only avai= lable > - on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit va= lue on > - X64. > - > - @return The value of Debug Register 7 (DR7). > - > -**/ > -UINTN > -EFIAPI > -AsmReadDr7 ( > - VOID > - ) > -{ > - UINTN Data; > - > - __asm__ __volatile__ ( > - "mov %%dr7, %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Writes a value to Debug Register 0 (DR0). > - > - Writes and returns a new value to DR0. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr0 The value to write to Dr0. > - > - @return The value written to Debug Register 0 (DR0). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr0 ( > - UINTN Dr0 > - ) > -{ > - __asm__ __volatile__ ( > - "mov %0, %%dr0" > - : > - : "r" (Dr0) > - ); > - return Dr0; > -} > - > - > -/** > - Writes a value to Debug Register 1 (DR1). > - > - Writes and returns a new value to DR1. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr1 The value to write to Dr1. > - > - @return The value written to Debug Register 1 (DR1). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr1 ( > - UINTN Dr1 > - ) > -{ > - __asm__ __volatile__ ( > - "mov %0, %%dr1" > - : > - : "r" (Dr1) > - ); > - return Dr1; > -} > - > - > -/** > - Writes a value to Debug Register 2 (DR2). > - > - Writes and returns a new value to DR2. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr2 The value to write to Dr2. > - > - @return The value written to Debug Register 2 (DR2). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr2 ( > - UINTN Dr2 > - ) > -{ > - __asm__ __volatile__ ( > - "mov %0, %%dr2" > - : > - : "r" (Dr2) > - ); > - return Dr2; > -} > - > - > -/** > - Writes a value to Debug Register 3 (DR3). > - > - Writes and returns a new value to DR3. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr3 The value to write to Dr3. > - > - @return The value written to Debug Register 3 (DR3). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr3 ( > - UINTN Dr3 > - ) > -{ > - __asm__ __volatile__ ( > - "mov %0, %%dr3" > - : > - : "r" (Dr3) > - ); > - return Dr3; > -} > - > - > -/** > - Writes a value to Debug Register 4 (DR4). > - > - Writes and returns a new value to DR4. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr4 The value to write to Dr4. > - > - @return The value written to Debug Register 4 (DR4). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr4 ( > - UINTN Dr4 > - ) > -{ > - __asm__ __volatile__ ( > - "mov %0, %%dr4" > - : > - : "r" (Dr4) > - ); > - return Dr4; > -} > - > - > -/** > - Writes a value to Debug Register 5 (DR5). > - > - Writes and returns a new value to DR5. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr5 The value to write to Dr5. > - > - @return The value written to Debug Register 5 (DR5). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr5 ( > - UINTN Dr5 > - ) > -{ > - __asm__ __volatile__ ( > - "mov %0, %%dr5" > - : > - : "r" (Dr5) > - ); > - return Dr5; > -} > - > - > -/** > - Writes a value to Debug Register 6 (DR6). > - > - Writes and returns a new value to DR6. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr6 The value to write to Dr6. > - > - @return The value written to Debug Register 6 (DR6). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr6 ( > - UINTN Dr6 > - ) > -{ > - __asm__ __volatile__ ( > - "mov %0, %%dr6" > - : > - : "r" (Dr6) > - ); > - return Dr6; > -} > - > - > -/** > - Writes a value to Debug Register 7 (DR7). > - > - Writes and returns a new value to DR7. This function is only available= on > - IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value = on X64. > - > - @param Dr7 The value to write to Dr7. > - > - @return The value written to Debug Register 7 (DR7). > - > -**/ > -UINTN > -EFIAPI > -AsmWriteDr7 ( > - UINTN Dr7 > - ) > -{ > - __asm__ __volatile__ ( > - "mov %0, %%dr7" > - : > - : "r" (Dr7) > - ); > - return Dr7; > -} > - > - > -/** > - Reads the current value of Code Segment Register (CS). > - > - Reads and returns the current value of CS. This function is only avail= able on > - IA-32 and X64. > - > - @return The current value of CS. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadCs ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "mov %%cs, %0" > - :"=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Data Segment Register (DS). > - > - Reads and returns the current value of DS. This function is only avail= able on > - IA-32 and X64. > - > - @return The current value of DS. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadDs ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "mov %%ds, %0" > - :"=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Extra Segment Register (ES). > - > - Reads and returns the current value of ES. This function is only avail= able on > - IA-32 and X64. > - > - @return The current value of ES. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadEs ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "mov %%es, %0" > - :"=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of FS Data Segment Register (FS). > - > - Reads and returns the current value of FS. This function is only avail= able on > - IA-32 and X64. > - > - @return The current value of FS. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadFs ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "mov %%fs, %0" > - :"=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of GS Data Segment Register (GS). > - > - Reads and returns the current value of GS. This function is only avail= able on > - IA-32 and X64. > - > - @return The current value of GS. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadGs ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "mov %%gs, %0" > - :"=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Stack Segment Register (SS). > - > - Reads and returns the current value of SS. This function is only avail= able on > - IA-32 and X64. > - > - @return The current value of SS. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadSs ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "mov %%ds, %0" > - :"=3Da" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of Task Register (TR). > - > - Reads and returns the current value of TR. This function is only avail= able on > - IA-32 and X64. > - > - @return The current value of TR. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadTr ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "str %0" > - : "=3Dr" (Data) > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current Global Descriptor Table Register(GDTR) descriptor. > - > - Reads and returns the current GDTR descriptor and returns it in Gdtr. = This > - function is only available on IA-32 and X64. > - > - @param Gdtr The pointer to a GDTR descriptor. > - > -**/ > -VOID > -EFIAPI > -InternalX86ReadGdtr ( > - OUT IA32_DESCRIPTOR *Gdtr > - ) > -{ > - __asm__ __volatile__ ( > - "sgdt %0" > - : "=3Dm" (*Gdtr) > - ); > -} > - > - > -/** > - Writes the current Global Descriptor Table Register (GDTR) descriptor. > - > - Writes and the current GDTR descriptor specified by Gdtr. This functio= n is > - only available on IA-32 and X64. > - > - @param Gdtr The pointer to a GDTR descriptor. > - > -**/ > -VOID > -EFIAPI > -InternalX86WriteGdtr ( > - IN CONST IA32_DESCRIPTOR *Gdtr > - ) > -{ > - __asm__ __volatile__ ( > - "lgdt %0" > - : > - : "m" (*Gdtr) > - ); > - > -} > - > - > -/** > - Reads the current Interrupt Descriptor Table Register(GDTR) descriptor= . > - > - Reads and returns the current IDTR descriptor and returns it in Idtr. = This > - function is only available on IA-32 and X64. > - > - @param Idtr The pointer to a IDTR descriptor. > - > -**/ > -VOID > -EFIAPI > -InternalX86ReadIdtr ( > - OUT IA32_DESCRIPTOR *Idtr > - ) > -{ > - __asm__ __volatile__ ( > - "sidt %0" > - : "=3Dm" (*Idtr) > - ); > -} > - > - > -/** > - Writes the current Interrupt Descriptor Table Register(GDTR) descripto= r. > - > - Writes the current IDTR descriptor and returns it in Idtr. This functi= on is > - only available on IA-32 and X64. > - > - @param Idtr The pointer to a IDTR descriptor. > - > -**/ > -VOID > -EFIAPI > -InternalX86WriteIdtr ( > - IN CONST IA32_DESCRIPTOR *Idtr > - ) > -{ > - __asm__ __volatile__ ( > - "lidt %0" > - : > - : "m" (*Idtr) > - ); > -} > - > - > -/** > - Reads the current Local Descriptor Table Register(LDTR) selector. > - > - Reads and returns the current 16-bit LDTR descriptor value. This funct= ion is > - only available on IA-32 and X64. > - > - @return The current selector of LDT. > - > -**/ > -UINT16 > -EFIAPI > -AsmReadLdtr ( > - VOID > - ) > -{ > - UINT16 Data; > - > - __asm__ __volatile__ ( > - "sldt %0" > - : "=3Dg" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Writes the current Local Descriptor Table Register (GDTR) selector. > - > - Writes and the current LDTR descriptor specified by Ldtr. This functio= n is > - only available on IA-32 and X64. > - > - @param Ldtr 16-bit LDTR selector value. > - > -**/ > -VOID > -EFIAPI > -AsmWriteLdtr ( > - IN UINT16 Ldtr > - ) > -{ > - __asm__ __volatile__ ( > - "lldtw %0" > - : > - : "g" (Ldtr) // %0 > - ); > -} > - > - > /** > Save the current floating point/SSE/SSE2 context to a buffer. >=20 > @@ -1630,171 +560,3 @@ AsmReadTsc ( >=20 > return (((UINT64)HiData) << 32) | LowData; > } > - > - > -/** > - Reads the current value of a Performance Counter (PMC). > - > - Reads and returns the current value of performance counter specified b= y > - Index. This function is only available on IA-32 and X64. > - > - @param Index The 32-bit Performance Counter index to read. > - > - @return The value of the PMC specified by Index. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadPmc ( > - IN UINT32 Index > - ) > -{ > - UINT32 LowData; > - UINT32 HiData; > - > - __asm__ __volatile__ ( > - "rdpmc" > - : "=3Da" (LowData), > - "=3Dd" (HiData) > - : "c" (Index) > - ); > - > - return (((UINT64)HiData) << 32) | LowData; > -} > - > - > -/** > - Sets up a monitor buffer that is used by AsmMwait(). > - > - Executes a MONITOR instruction with the register state specified by Ea= x, Ecx > - and Edx. Returns Eax. This function is only available on IA-32 and X64= . > - > - @param Eax The value to load into EAX or RAX before executing the MON= ITOR > - instruction. > - @param Ecx The value to load into ECX or RCX before executing the MON= ITOR > - instruction. > - @param Edx The value to load into EDX or RDX before executing the MON= ITOR > - instruction. > - > - @return Eax > - > -**/ > -UINTN > -EFIAPI > -AsmMonitor ( > - IN UINTN Eax, > - IN UINTN Ecx, > - IN UINTN Edx > - ) > -{ > - __asm__ __volatile__ ( > - "monitor" > - : > - : "a" (Eax), > - "c" (Ecx), > - "d" (Edx) > - ); > - > - return Eax; > -} > - > - > -/** > - Executes an MWAIT instruction. > - > - Executes an MWAIT instruction with the register state specified by Eax= and > - Ecx. Returns Eax. This function is only available on IA-32 and X64. > - > - @param Eax The value to load into EAX or RAX before executing the MON= ITOR > - instruction. > - @param Ecx The value to load into ECX or RCX before executing the MON= ITOR > - instruction. > - > - @return Eax > - > -**/ > -UINTN > -EFIAPI > -AsmMwait ( > - IN UINTN Eax, > - IN UINTN Ecx > - ) > -{ > - __asm__ __volatile__ ( > - "mwait" > - : > - : "a" (Eax), > - "c" (Ecx) > - ); > - > - return Eax; > -} > - > - > -/** > - Executes a WBINVD instruction. > - > - Executes a WBINVD instruction. This function is only available on IA-3= 2 and > - X64. > - > -**/ > -VOID > -EFIAPI > -AsmWbinvd ( > - VOID > - ) > -{ > - __asm__ __volatile__ ("wbinvd":::"memory"); > -} > - > - > -/** > - Executes a INVD instruction. > - > - Executes a INVD instruction. This function is only available on IA-32 = and > - X64. > - > -**/ > -VOID > -EFIAPI > -AsmInvd ( > - VOID > - ) > -{ > - __asm__ __volatile__ ("invd":::"memory"); > - > -} > - > - > -/** > - Flushes a cache line from all the instruction and data caches within t= he > - coherency domain of the CPU. > - > - Flushed the cache line specified by LinearAddress, and returns LinearA= ddress. > - This function is only available on IA-32 and X64. > - > - @param LinearAddress The address of the cache line to flush. If the C= PU is > - in a physical addressing mode, then LinearAddres= s is a > - physical address. If the CPU is in a virtual > - addressing mode, then LinearAddress is a virtual > - address. > - > - @return LinearAddress > -**/ > -VOID * > -EFIAPI > -AsmFlushCacheLine ( > - IN VOID *LinearAddress > - ) > -{ > - __asm__ __volatile__ ( > - "clflush (%0)" > - : > - : "r" (LinearAddress) > - : "memory" > - ); > - > - return LinearAddress; > -} > - > - > diff --git a/MdePkg/Library/BaseLib/X64/GccInline.c b/MdePkg/Library/Base= Lib/X64/GccInlinePriv.c > similarity index 65% > copy from MdePkg/Library/BaseLib/X64/GccInline.c > copy to MdePkg/Library/BaseLib/X64/GccInlinePriv.c > index 154ce1f57e..98be19b3c7 100644 > --- a/MdePkg/Library/BaseLib/X64/GccInline.c > +++ b/MdePkg/Library/BaseLib/X64/GccInlinePriv.c > @@ -1,7 +1,8 @@ > /** @file > - GCC inline implementation of BaseLib processor specific functions. > + GCC inline implementation of BaseLib processor specific functions that= use > + privlidged instructions. >=20 > - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
> + Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.
> Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved. > SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > @@ -10,29 +11,6 @@ >=20 > #include "BaseLibInternals.h" >=20 > - > - > - > -/** > - Used to serialize load and store operations. > - > - All loads and stores that proceed calls to this function are guarantee= d to be > - globally visible when this function returns. > - > -**/ > -VOID > -EFIAPI > -MemoryFence ( > - VOID > - ) > -{ > - // This is a little bit of overkill and it is more about the compiler = that it is > - // actually processor synchronization. This is like the _ReadWriteBarr= ier > - // Microsoft specific intrinsic > - __asm__ __volatile__ ("":::"memory"); > -} > - > - > /** > Enables CPU interrupts. >=20 > @@ -64,44 +42,6 @@ DisableInterrupts ( > __asm__ __volatile__ ("cli"::: "memory"); > } >=20 > - > - > - > -/** > - Requests CPU to pause for a short period of time. > - > - Requests CPU to pause for a short period of time. Typically used in MP > - systems to prevent memory starvation while waiting for a spin lock. > - > -**/ > -VOID > -EFIAPI > -CpuPause ( > - VOID > - ) > -{ > - __asm__ __volatile__ ("pause"); > -} > - > - > -/** > - Generates a breakpoint on the CPU. > - > - Generates a breakpoint on the CPU. The breakpoint must be implemented = such > - that code can resume normal execution after the breakpoint. > - > -**/ > -VOID > -EFIAPI > -CpuBreakpoint ( > - VOID > - ) > -{ > - __asm__ __volatile__ ("int $3"); > -} > - > - > - > /** > Returns a 64-bit Machine Specific Register(MSR). >=20 > @@ -176,37 +116,6 @@ AsmWriteMsr64 ( > return Value; > } >=20 > - > - > -/** > - Reads the current value of the EFLAGS register. > - > - Reads and returns the current value of the EFLAGS register. This funct= ion is > - only available on IA-32 and X64. This returns a 32-bit value on IA-32 = and a > - 64-bit value on X64. > - > - @return EFLAGS on IA-32 or RFLAGS on X64. > - > -**/ > -UINTN > -EFIAPI > -AsmReadEflags ( > - VOID > - ) > -{ > - UINTN Eflags; > - > - __asm__ __volatile__ ( > - "pushfq \n\t" > - "pop %0 " > - : "=3Dr" (Eflags) // %0 > - ); > - > - return Eflags; > -} > - > - > - > /** > Reads the current value of the Control Register 0 (CR0). >=20 > @@ -1163,475 +1072,6 @@ AsmWriteLdtr ( > ); > } >=20 > - > -/** > - Save the current floating point/SSE/SSE2 context to a buffer. > - > - Saves the current floating point/SSE/SSE2 state to the buffer specifie= d by > - Buffer. Buffer must be aligned on a 16-byte boundary. This function is= only > - available on IA-32 and X64. > - > - @param Buffer The pointer to a buffer to save the floating point/SSE= /SSE2 context. > - > -**/ > -VOID > -EFIAPI > -InternalX86FxSave ( > - OUT IA32_FX_BUFFER *Buffer > - ) > -{ > - __asm__ __volatile__ ( > - "fxsave %0" > - : > - : "m" (*Buffer) // %0 > - ); > -} > - > - > -/** > - Restores the current floating point/SSE/SSE2 context from a buffer. > - > - Restores the current floating point/SSE/SSE2 state from the buffer spe= cified > - by Buffer. Buffer must be aligned on a 16-byte boundary. This function= is > - only available on IA-32 and X64. > - > - @param Buffer The pointer to a buffer to save the floating point/SSE= /SSE2 context. > - > -**/ > -VOID > -EFIAPI > -InternalX86FxRestore ( > - IN CONST IA32_FX_BUFFER *Buffer > - ) > -{ > - __asm__ __volatile__ ( > - "fxrstor %0" > - : > - : "m" (*Buffer) // %0 > - ); > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #0 (MM0). > - > - Reads and returns the current value of MM0. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM0. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm0 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "movd %%mm0, %0 \n\t" > - : "=3Dr" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #1 (MM1). > - > - Reads and returns the current value of MM1. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM1. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm1 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "movd %%mm1, %0 \n\t" > - : "=3Dr" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #2 (MM2). > - > - Reads and returns the current value of MM2. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM2. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm2 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "movd %%mm2, %0 \n\t" > - : "=3Dr" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #3 (MM3). > - > - Reads and returns the current value of MM3. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM3. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm3 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "movd %%mm3, %0 \n\t" > - : "=3Dr" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #4 (MM4). > - > - Reads and returns the current value of MM4. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM4. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm4 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "movd %%mm4, %0 \n\t" > - : "=3Dr" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #5 (MM5). > - > - Reads and returns the current value of MM5. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM5. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm5 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "movd %%mm5, %0 \n\t" > - : "=3Dr" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #6 (MM6). > - > - Reads and returns the current value of MM6. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM6. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm6 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "movd %%mm6, %0 \n\t" > - : "=3Dr" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Reads the current value of 64-bit MMX Register #7 (MM7). > - > - Reads and returns the current value of MM7. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of MM7. > - > -**/ > -UINT64 > -EFIAPI > -AsmReadMm7 ( > - VOID > - ) > -{ > - UINT64 Data; > - > - __asm__ __volatile__ ( > - "movd %%mm7, %0 \n\t" > - : "=3Dr" (Data) // %0 > - ); > - > - return Data; > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #0 (MM0). > - > - Writes the current value of MM0. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM0. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm0 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movd %0, %%mm0" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #1 (MM1). > - > - Writes the current value of MM1. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM1. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm1 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movd %0, %%mm1" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #2 (MM2). > - > - Writes the current value of MM2. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM2. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm2 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movd %0, %%mm2" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #3 (MM3). > - > - Writes the current value of MM3. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM3. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm3 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movd %0, %%mm3" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #4 (MM4). > - > - Writes the current value of MM4. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM4. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm4 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movd %0, %%mm4" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #5 (MM5). > - > - Writes the current value of MM5. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM5. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm5 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movd %0, %%mm5" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #6 (MM6). > - > - Writes the current value of MM6. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM6. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm6 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movd %0, %%mm6" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Writes the current value of 64-bit MMX Register #7 (MM7). > - > - Writes the current value of MM7. This function is only available on IA= 32 and > - X64. > - > - @param Value The 64-bit value to write to MM7. > - > -**/ > -VOID > -EFIAPI > -AsmWriteMm7 ( > - IN UINT64 Value > - ) > -{ > - __asm__ __volatile__ ( > - "movd %0, %%mm7" // %0 > - : > - : "m" (Value) > - ); > -} > - > - > -/** > - Reads the current value of Time Stamp Counter (TSC). > - > - Reads and returns the current value of TSC. This function is only avai= lable > - on IA-32 and X64. > - > - @return The current value of TSC > - > -**/ > -UINT64 > -EFIAPI > -AsmReadTsc ( > - VOID > - ) > -{ > - UINT32 LowData; > - UINT32 HiData; > - > - __asm__ __volatile__ ( > - "rdtsc" > - : "=3Da" (LowData), > - "=3Dd" (HiData) > - ); > - > - return (((UINT64)HiData) << 32) | LowData; > -} > - > - > /** > Reads the current value of a Performance Counter (PMC). >=20 > @@ -1662,7 +1102,6 @@ AsmReadPmc ( > return (((UINT64)HiData) << 32) | LowData; > } >=20 > - > /** > Sets up a monitor buffer that is used by AsmMwait(). >=20 > @@ -1698,7 +1137,6 @@ AsmMonitor ( > return Eax; > } >=20 > - > /** > Executes an MWAIT instruction. >=20 > @@ -1730,7 +1168,6 @@ AsmMwait ( > return Eax; > } >=20 > - > /** > Executes a WBINVD instruction. >=20 > @@ -1747,7 +1184,6 @@ AsmWbinvd ( > __asm__ __volatile__ ("wbinvd":::"memory"); > } >=20 > - > /** > Executes a INVD instruction. >=20 > @@ -1796,5 +1232,3 @@ AsmFlushCacheLine ( >=20 > return LinearAddress; > } > - > - > -- > 2.21.0.windows.1