Liming, GccInline.c can be used in UnitTestHostBaseLib instance. GccInlinePriv.c is the file that cannot be used in the. UnitTestHostBaseLib instance.
Here are the grep results in the branch: baselib.inf: Ia32/GccInline.c | GCC baselib.inf: Ia32/GccInlinePriv.c | GCC baselib.inf: X64/GccInline.c | GCC baselib.inf: X64/GccInlinePriv.c | GCC unittesthostbaselib.inf: Ia32/GccInline.c | GCC unittesthostbaselib.inf: X64/GccInline.c | GCC Best regards, Mike > -----Original Message----- > From: Gao, Liming <liming....@intel.com> > Sent: Friday, July 10, 2020 1:06 AM > To: Kinney, Michael D <michael.d.kin...@intel.com>; > devel@edk2.groups.io > Cc: Sean Brogan <sean.bro...@microsoft.com>; Bret > Barkelew <bret.barke...@microsoft.com>; Yao, Jiewen > <jiewen....@intel.com> > Subject: RE: [Patch 04/15] MdePkg/BaseLib: Break out > IA32/X64 GCC inline privileged functions > > Mike: > So, GccInline.c file can't be used in the unit test > BaseLib. > > Thanks > Liming > -----Original Message----- > From: Kinney, Michael D <michael.d.kin...@intel.com> > Sent: 2020年7月10日 1:01 > To: Gao, Liming <liming....@intel.com>; > devel@edk2.groups.io; Kinney, Michael D > <michael.d.kin...@intel.com> > Cc: Sean Brogan <sean.bro...@microsoft.com>; Bret > Barkelew <bret.barke...@microsoft.com>; Yao, Jiewen > <jiewen....@intel.com> > Subject: RE: [Patch 04/15] MdePkg/BaseLib: Break out > IA32/X64 GCC inline privileged functions > > Liming, > > In order to support host based unit tests, all the code > has to be compatible with a user mode process. This > means > any functions that execute instructions that are not > allowed > in a user mode process need to be separated out. > > For the IA32/X64 specific GccInline.c files, the > analysis > was done for APIs that use instructions that would > generate an exception in a user mode process. > > In addition, the BaseLib functions that return system > state (e.g. CS/DS/ES/SS/FS/GS) are also split out. It > does not make sense to return system state information > from the currently executing user mode process. > Instead, > the FW code under test would expect system state that > matches a FW execution environment. Each unit test > implementation has the option of providing emulation > of this system state if that is required to exercise the > code under test. > > No changes to the MSFT specific BaseLib implementation > were required because there those are already split out > to one function per file. > > Best regards, > > Mike > > > -----Original Message----- > > From: Gao, Liming <liming....@intel.com> > > Sent: Thursday, July 9, 2020 7:07 AM > > To: Kinney, Michael D <michael.d.kin...@intel.com>; > > devel@edk2.groups.io > > Cc: Sean Brogan <sean.bro...@microsoft.com>; Bret > > Barkelew <bret.barke...@microsoft.com>; Yao, Jiewen > > <jiewen....@intel.com> > > Subject: RE: [Patch 04/15] MdePkg/BaseLib: Break out > > IA32/X64 GCC inline privileged functions > > > > Mike: > > Is there the rule to know which function can't be in > > unit test? And, those functions will be in GccInline.c > > or GccInlinePriv.c? There is no change in 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 <michael.d.kin...@intel.com> > > > Sent: Monday, June 15, 2020 8:19 AM > > > To: devel@edk2.groups.io > > > Cc: Gao, Liming <liming....@intel.com>; Sean Brogan > > <sean.bro...@microsoft.com>; Bret Barkelew > > <bret.barke...@microsoft.com>; > > > Yao, Jiewen <jiewen....@intel.com> > > > Subject: [Patch 04/15] MdePkg/BaseLib: Break out > > IA32/X64 GCC inline privileged functions > > > > > > https://bugzilla.tianocore.org/show_bug.cgi?id=2800 > > > > > > 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. > > > > > > Cc: Liming Gao <liming....@intel.com> > > > Cc: Sean Brogan <sean.bro...@microsoft.com> > > > Cc: Bret Barkelew <bret.barke...@microsoft.com> > > > Cc: Jiewen Yao <jiewen....@intel.com> > > > Signed-off-by: Michael D Kinney > > <michael.d.kin...@intel.com> > > > --- > > > MdePkg/Library/BaseLib/BaseLib.inf | > 4 > > +- > > > MdePkg/Library/BaseLib/Ia32/GccInline.c | > 1181 > > +--------------- > > > .../Ia32/{GccInline.c => GccInlinePriv.c} | > 601 > > +------- > > > MdePkg/Library/BaseLib/X64/GccInline.c | > 1240 > > +---------------- > > > .../X64/{GccInline.c => GccInlinePriv.c} | > 572 > > +------- > > > 5 files changed, 11 insertions(+), 3587 deletions(- > ) > > > copy MdePkg/Library/BaseLib/Ia32/{GccInline.c => > > GccInlinePriv.c} (62%) > > > copy MdePkg/Library/BaseLib/X64/{GccInline.c => > > GccInlinePriv.c} (65%) > > > > > > 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.<BR> > > > +# Copyright (c) 2007 - 2020, Intel Corporation. > All > > rights reserved.<BR> > > > # Portions copyright (c) 2008 - 2009, Apple Inc. > All > > rights reserved.<BR> > > > # Portions copyright (c) 2011 - 2013, ARM Ltd. All > > rights reserved.<BR> > > > # Copyright (c) 2020, Hewlett Packard Enterprise > > Development LP. All rights reserved.<BR> > > > @@ -156,6 +156,7 @@ [Sources.Ia32] > > > > > > > > > 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/BaseLib/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. > > > > > > - Copyright (c) 2006 - 2018, Intel Corporation. All > > rights reserved.<BR> > > > + Copyright (c) 2006 - 2020, Intel Corporation. All > > rights reserved.<BR> > > > Portions copyright (c) 2008 - 2009, Apple Inc. > All > > rights reserved.<BR> > > > SPDX-License-Identifier: BSD-2-Clause-Patent > > > > > > @@ -10,8 +10,6 @@ > > > > > > #include "BaseLibInternals.h" > > > > > > - > > > - > > > /** > > > Used to serialize load and store operations. > > > > > > @@ -31,41 +29,6 @@ MemoryFence ( > > > __asm__ __volatile__ ("":::"memory"); > > > } > > > > > > - > > > -/** > > > - 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. > > > > > > @@ -82,7 +45,6 @@ CpuPause ( > > > __asm__ __volatile__ ("pause"); > > > } > > > > > > - > > > /** > > > Generates a breakpoint on the CPU. > > > > > > @@ -99,75 +61,6 @@ CpuBreakpoint ( > > > __asm__ __volatile__ ("int $3"); > > > } > > > > > > - > > > - > > > -/** > > > - Returns a 64-bit Machine Specific Register(MSR). > > > - > > > - Reads and returns the 64-bit MSR specified by > > Index. No parameter checking is > > > - performed on Index, and some Index values may > cause > > CPU exceptions. The > > > - caller must either guarantee that Index is valid, > > or the caller must set up > > > - exception handlers to catch the exceptions. This > > function is only available > > > - 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" > > > - : "=A" (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 Index. 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 exceptions. The > > > - caller must either guarantee that Index and Value > > are valid, or the caller > > > - must establish proper exception handlers. This > > function is only available 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. > > > > > > @@ -195,965 +88,6 @@ AsmReadEflags ( > > > return Eflags; > > > } > > > > > > - > > > - > > > -/** > > > - Reads the current value of the Control Register 0 > > (CR0). > > > - > > > - Reads and returns the current value of CR0. This > > function 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 The value of the Control Register 0 > (CR0). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadCr0 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movl %%cr0,%0" > > > - : "=a" (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 available > > > - on IA-32 and X64. This returns a 32-bit value on > > IA-32 and a 64-bit value on > > > - X64. > > > - > > > - @return The value of the Control Register 2 > (CR2). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadCr2 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movl %%cr2, %0" > > > - : "=r" (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 available > > > - on IA-32 and X64. This returns a 32-bit value on > > IA-32 and a 64-bit value on > > > - X64. > > > - > > > - @return The value of the Control Register 3 > (CR3). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadCr3 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movl %%cr3, %0" > > > - : "=r" (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 available > > > - on IA-32 and X64. This returns a 32-bit value on > > IA-32 and a 64-bit value on > > > - X64. > > > - > > > - @return The value of the Control Register 4 > (CR4). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadCr4 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movl %%cr4, %0" > > > - : "=a" (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 available > > > - on IA-32 and X64. This returns a 32-bit value on > > IA-32 and a 64-bit value on > > > - X64. > > > - > > > - @return The value of Debug Register 0 (DR0). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr0 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movl %%dr0, %0" > > > - : "=r" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Debug Register 1 > (DR1). > > > - > > > - Reads and returns the current value of DR1. This > > function 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 The value of Debug Register 1 (DR1). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr1 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movl %%dr1, %0" > > > - : "=r" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Debug Register 2 > (DR2). > > > - > > > - Reads and returns the current value of DR2. This > > function 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 The value of Debug Register 2 (DR2). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr2 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movl %%dr2, %0" > > > - : "=r" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Debug Register 3 > (DR3). > > > - > > > - Reads and returns the current value of DR3. This > > function 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 The value of Debug Register 3 (DR3). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr3 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movl %%dr3, %0" > > > - : "=r" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Debug Register 4 > (DR4). > > > - > > > - Reads and returns the current value of DR4. This > > function 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 The value of Debug Register 4 (DR4). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr4 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movl %%dr4, %0" > > > - : "=r" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Debug Register 5 > (DR5). > > > - > > > - Reads and returns the current value of DR5. This > > function 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 The value of Debug Register 5 (DR5). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr5 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movl %%dr5, %0" > > > - : "=r" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Debug Register 6 > (DR6). > > > - > > > - Reads and returns the current value of DR6. This > > function 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 The value of Debug Register 6 (DR6). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr6 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movl %%dr6, %0" > > > - : "=r" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Debug Register 7 > (DR7). > > > - > > > - Reads and returns the current value of DR7. This > > function 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 The value of Debug Register 7 (DR7). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr7 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movl %%dr7, %0" > > > - : "=r" (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 available on > > > - IA-32 and X64. > > > - > > > - @return The current value of CS. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadCs ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%cs, %0" > > > - :"=a" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Data Segment Register > > (DS). > > > - > > > - Reads and returns the current value of DS. This > > function is only available on > > > - IA-32 and X64. > > > - > > > - @return The current value of DS. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadDs ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%ds, %0" > > > - :"=a" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Extra Segment Register > > (ES). > > > - > > > - Reads and returns the current value of ES. This > > function is only available on > > > - IA-32 and X64. > > > - > > > - @return The current value of ES. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadEs ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%es, %0" > > > - :"=a" (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 available on > > > - IA-32 and X64. > > > - > > > - @return The current value of FS. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadFs ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%fs, %0" > > > - :"=a" (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 available on > > > - IA-32 and X64. > > > - > > > - @return The current value of GS. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadGs ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%gs, %0" > > > - :"=a" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Stack Segment Register > > (SS). > > > - > > > - Reads and returns the current value of SS. This > > function is only available on > > > - IA-32 and X64. > > > - > > > - @return The current value of SS. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadSs ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%ds, %0" > > > - :"=a" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Task Register (TR). > > > - > > > - Reads and returns the current value of TR. This > > function is only available on > > > - IA-32 and X64. > > > - > > > - @return The current value of TR. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadTr ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "str %0" > > > - : "=a" (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" > > > - : "=m" (*Gdtr) > > > - ); > > > -} > > > - > > > - > > > -/** > > > - Writes the current Global Descriptor Table > Register > > (GDTR) descriptor. > > > - > > > - Writes and the current GDTR descriptor specified > by > > Gdtr. This function 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" > > > - : "=m" (*Idtr) > > > - ); > > > -} > > > - > > > - > > > -/** > > > - Writes the current Interrupt Descriptor Table > > Register(GDTR) descriptor. > > > - > > > - Writes 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 > > > -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 function is > > > - only available on IA-32 and X64. > > > - > > > - @return The current selector of LDT. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadLdtr ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "sldt %0" > > > - : "=g" (Data) // %0 > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Writes the current Local Descriptor Table > Register > > (GDTR) selector. > > > - > > > - Writes and the current LDTR descriptor specified > by > > Ldtr. This function 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. > > > > > > @@ -1650,116 +584,3 @@ AsmReadTsc ( > > > > > > return Data; > > > } > > > - > > > - > > > -/** > > > - Reads the current value of a Performance Counter > > (PMC). > > > - > > > - Reads and returns the current value of > performance > > counter specified by > > > - 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" > > > - : "=A" (Data) > > > - : "c" (Index) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > - > > > - > > > -/** > > > - Executes a WBINVD instruction. > > > - > > > - Executes a WBINVD instruction. This function is > > only available on IA-32 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 the > > > - coherency domain of the CPU. > > > - > > > - Flushed the cache line specified by > LinearAddress, > > and returns LinearAddress. > > > - This function is only available on IA-32 and X64. > > > - > > > - @param LinearAddress The address of the cache > line > > to flush. If the CPU is > > > - in a physical addressing > > mode, then LinearAddress 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) == 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/BaseLib/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. > > > > > > - Copyright (c) 2006 - 2018, Intel Corporation. All > > rights reserved.<BR> > > > + Copyright (c) 2006 - 2020, Intel Corporation. All > > rights reserved.<BR> > > > Portions copyright (c) 2008 - 2009, Apple Inc. > All > > rights reserved.<BR> > > > SPDX-License-Identifier: BSD-2-Clause-Patent > > > > > > @@ -10,28 +11,6 @@ > > > > > > #include "BaseLibInternals.h" > > > > > > - > > > - > > > -/** > > > - Used to serialize load and store operations. > > > - > > > - All loads and stores that proceed calls to this > > function are guaranteed 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 _ReadWriteBarrier > > > - // Microsoft specific intrinsic > > > - __asm__ __volatile__ ("":::"memory"); > > > -} > > > - > > > - > > > /** > > > Enables CPU interrupts. > > > > > > @@ -63,44 +42,6 @@ DisableInterrupts ( > > > __asm__ __volatile__ ("cli"::: "memory"); > > > } > > > > > > - > > > - > > > - > > > -/** > > > - 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). > > > > > > @@ -166,37 +107,6 @@ AsmWriteMsr64 ( > > > return Value; > > > } > > > > > > - > > > - > > > -/** > > > - Reads the current value of the EFLAGS register. > > > - > > > - Reads and returns the current value of the EFLAGS > > register. This function 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 " > > > - : "=r" (Eflags) > > > - ); > > > - > > > - return Eflags; > > > -} > > > - > > > - > > > - > > > /** > > > Reads the current value of the Control Register 0 > > (CR0). > > > > > > @@ -1153,505 +1063,6 @@ AsmWriteLdtr ( > > > ); > > > } > > > > > > - > > > -/** > > > - Save the current floating point/SSE/SSE2 context > to > > a buffer. > > > - > > > - Saves the current floating point/SSE/SSE2 state > to > > the buffer specified 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 specified > > > - 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 available > > > - 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" > > > - : "=A" (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 available > > > - 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" > > > - : "=A" (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 available > > > - 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" > > > - : "=A" (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 available > > > - 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" > > > - : "=A" (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 available > > > - 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" > > > - : "=A" (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 available > > > - 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" > > > - : "=A" (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 available > > > - 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" > > > - : "=A" (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 available > > > - 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" > > > - : "=A" (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 IA32 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 IA32 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 IA32 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 IA32 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 IA32 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 IA32 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 IA32 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 IA32 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 available > > > - on IA-32 and X64. > > > - > > > - @return The current value of TSC > > > - > > > -**/ > > > -UINT64 > > > -EFIAPI > > > -AsmReadTsc ( > > > - VOID > > > - ) > > > -{ > > > - UINT64 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "rdtsc" > > > - : "=A" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > /** > > > Reads the current value of a Performance Counter > > (PMC). > > > > > > @@ -1680,9 +1091,6 @@ AsmReadPmc ( > > > return Data; > > > } > > > > > > - > > > - > > > - > > > /** > > > Executes a WBINVD instruction. > > > > > > @@ -1699,7 +1107,6 @@ AsmWbinvd ( > > > __asm__ __volatile__ ("wbinvd":::"memory"); > > > } > > > > > > - > > > /** > > > Executes a INVD instruction. > > > > > > @@ -1761,5 +1168,3 @@ AsmFlushCacheLine ( > > > > > > return LinearAddress; > > > } > > > - > > > - > > > diff --git a/MdePkg/Library/BaseLib/X64/GccInline.c > > b/MdePkg/Library/BaseLib/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. > > > > > > - Copyright (c) 2006 - 2018, Intel Corporation. All > > rights reserved.<BR> > > > + Copyright (c) 2006 - 2020, Intel Corporation. All > > rights reserved.<BR> > > > Portions copyright (c) 2008 - 2009, Apple Inc. > All > > rights reserved.<BR> > > > SPDX-License-Identifier: BSD-2-Clause-Patent > > > > > > @@ -33,40 +33,6 @@ MemoryFence ( > > > } > > > > > > > > > -/** > > > - 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. > > > > > > @@ -101,83 +67,6 @@ CpuBreakpoint ( > > > } > > > > > > > > > - > > > -/** > > > - Returns a 64-bit Machine Specific Register(MSR). > > > - > > > - Reads and returns the 64-bit MSR specified by > > Index. No parameter checking is > > > - performed on Index, and some Index values may > cause > > CPU exceptions. The > > > - caller must either guarantee that Index is valid, > > or the caller must set up > > > - exception handlers to catch the exceptions. This > > function is only available > > > - 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" > > > - : "=a" (LowData), // %0 > > > - "=d" (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 Index. 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 exceptions. The > > > - caller must either guarantee that Index and Value > > are valid, or the caller > > > - must establish proper exception handlers. This > > function is only available 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 = (UINT32)(Value); > > > - HighData = (UINT32)(Value >> 32); > > > - > > > - __asm__ __volatile__ ( > > > - "wrmsr" > > > - : > > > - : "c" (Index), > > > - "a" (LowData), > > > - "d" (HighData) > > > - ); > > > - > > > - return Value; > > > -} > > > - > > > - > > > - > > > /** > > > Reads the current value of the EFLAGS register. > > > > > > @@ -205,965 +94,6 @@ AsmReadEflags ( > > > return Eflags; > > > } > > > > > > - > > > - > > > -/** > > > - Reads the current value of the Control Register 0 > > (CR0). > > > - > > > - Reads and returns the current value of CR0. This > > function 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 The value of the Control Register 0 > (CR0). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadCr0 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%cr0,%0" > > > - : "=r" (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 available > > > - on IA-32 and X64. This returns a 32-bit value on > > IA-32 and a 64-bit value on > > > - X64. > > > - > > > - @return The value of the Control Register 2 > (CR2). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadCr2 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%cr2, %0" > > > - : "=r" (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 available > > > - on IA-32 and X64. This returns a 32-bit value on > > IA-32 and a 64-bit value on > > > - X64. > > > - > > > - @return The value of the Control Register 3 > (CR3). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadCr3 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%cr3, %0" > > > - : "=r" (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 available > > > - on IA-32 and X64. This returns a 32-bit value on > > IA-32 and a 64-bit value on > > > - X64. > > > - > > > - @return The value of the Control Register 4 > (CR4). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadCr4 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%cr4, %0" > > > - : "=r" (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 available > > > - on IA-32 and X64. This returns a 32-bit value on > > IA-32 and a 64-bit value on > > > - X64. > > > - > > > - @return The value of Debug Register 0 (DR0). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr0 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%dr0, %0" > > > - : "=r" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Debug Register 1 > (DR1). > > > - > > > - Reads and returns the current value of DR1. This > > function 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 The value of Debug Register 1 (DR1). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr1 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%dr1, %0" > > > - : "=r" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Debug Register 2 > (DR2). > > > - > > > - Reads and returns the current value of DR2. This > > function 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 The value of Debug Register 2 (DR2). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr2 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%dr2, %0" > > > - : "=r" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Debug Register 3 > (DR3). > > > - > > > - Reads and returns the current value of DR3. This > > function 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 The value of Debug Register 3 (DR3). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr3 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%dr3, %0" > > > - : "=r" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Debug Register 4 > (DR4). > > > - > > > - Reads and returns the current value of DR4. This > > function 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 The value of Debug Register 4 (DR4). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr4 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%dr4, %0" > > > - : "=r" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Debug Register 5 > (DR5). > > > - > > > - Reads and returns the current value of DR5. This > > function 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 The value of Debug Register 5 (DR5). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr5 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%dr5, %0" > > > - : "=r" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Debug Register 6 > (DR6). > > > - > > > - Reads and returns the current value of DR6. This > > function 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 The value of Debug Register 6 (DR6). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr6 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%dr6, %0" > > > - : "=r" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Debug Register 7 > (DR7). > > > - > > > - Reads and returns the current value of DR7. This > > function 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 The value of Debug Register 7 (DR7). > > > - > > > -**/ > > > -UINTN > > > -EFIAPI > > > -AsmReadDr7 ( > > > - VOID > > > - ) > > > -{ > > > - UINTN Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%dr7, %0" > > > - : "=r" (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 available on > > > - IA-32 and X64. > > > - > > > - @return The current value of CS. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadCs ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%cs, %0" > > > - :"=a" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Data Segment Register > > (DS). > > > - > > > - Reads and returns the current value of DS. This > > function is only available on > > > - IA-32 and X64. > > > - > > > - @return The current value of DS. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadDs ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%ds, %0" > > > - :"=a" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Extra Segment Register > > (ES). > > > - > > > - Reads and returns the current value of ES. This > > function is only available on > > > - IA-32 and X64. > > > - > > > - @return The current value of ES. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadEs ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%es, %0" > > > - :"=a" (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 available on > > > - IA-32 and X64. > > > - > > > - @return The current value of FS. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadFs ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%fs, %0" > > > - :"=a" (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 available on > > > - IA-32 and X64. > > > - > > > - @return The current value of GS. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadGs ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%gs, %0" > > > - :"=a" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Stack Segment Register > > (SS). > > > - > > > - Reads and returns the current value of SS. This > > function is only available on > > > - IA-32 and X64. > > > - > > > - @return The current value of SS. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadSs ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "mov %%ds, %0" > > > - :"=a" (Data) > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Reads the current value of Task Register (TR). > > > - > > > - Reads and returns the current value of TR. This > > function is only available on > > > - IA-32 and X64. > > > - > > > - @return The current value of TR. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadTr ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "str %0" > > > - : "=r" (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" > > > - : "=m" (*Gdtr) > > > - ); > > > -} > > > - > > > - > > > -/** > > > - Writes the current Global Descriptor Table > Register > > (GDTR) descriptor. > > > - > > > - Writes and the current GDTR descriptor specified > by > > Gdtr. This function 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" > > > - : "=m" (*Idtr) > > > - ); > > > -} > > > - > > > - > > > -/** > > > - Writes the current Interrupt Descriptor Table > > Register(GDTR) descriptor. > > > - > > > - Writes 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 > > > -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 function is > > > - only available on IA-32 and X64. > > > - > > > - @return The current selector of LDT. > > > - > > > -**/ > > > -UINT16 > > > -EFIAPI > > > -AsmReadLdtr ( > > > - VOID > > > - ) > > > -{ > > > - UINT16 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "sldt %0" > > > - : "=g" (Data) // %0 > > > - ); > > > - > > > - return Data; > > > -} > > > - > > > - > > > -/** > > > - Writes the current Local Descriptor Table > Register > > (GDTR) selector. > > > - > > > - Writes and the current LDTR descriptor specified > by > > Ldtr. This function 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. > > > > > > @@ -1630,171 +560,3 @@ AsmReadTsc ( > > > > > > return (((UINT64)HiData) << 32) | LowData; > > > } > > > - > > > - > > > -/** > > > - Reads the current value of a Performance Counter > > (PMC). > > > - > > > - Reads and returns the current value of > performance > > counter specified by > > > - 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" > > > - : "=a" (LowData), > > > - "=d" (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 Eax, 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 MONITOR > > > - instruction. > > > - @param Ecx The value to load into ECX or RCX > > before executing the MONITOR > > > - instruction. > > > - @param Edx The value to load into EDX or RDX > > before executing the MONITOR > > > - 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 MONITOR > > > - instruction. > > > - @param Ecx The value to load into ECX or RCX > > before executing the MONITOR > > > - 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-32 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 the > > > - coherency domain of the CPU. > > > - > > > - Flushed the cache line specified by > LinearAddress, > > and returns LinearAddress. > > > - This function is only available on IA-32 and X64. > > > - > > > - @param LinearAddress The address of the cache > line > > to flush. If the CPU is > > > - in a physical addressing > > mode, then LinearAddress 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/BaseLib/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. > > > > > > - Copyright (c) 2006 - 2018, Intel Corporation. All > > rights reserved.<BR> > > > + Copyright (c) 2006 - 2020, Intel Corporation. All > > rights reserved.<BR> > > > Portions copyright (c) 2008 - 2009, Apple Inc. > All > > rights reserved.<BR> > > > SPDX-License-Identifier: BSD-2-Clause-Patent > > > > > > @@ -10,29 +11,6 @@ > > > > > > #include "BaseLibInternals.h" > > > > > > - > > > - > > > - > > > -/** > > > - Used to serialize load and store operations. > > > - > > > - All loads and stores that proceed calls to this > > function are guaranteed 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 _ReadWriteBarrier > > > - // Microsoft specific intrinsic > > > - __asm__ __volatile__ ("":::"memory"); > > > -} > > > - > > > - > > > /** > > > Enables CPU interrupts. > > > > > > @@ -64,44 +42,6 @@ DisableInterrupts ( > > > __asm__ __volatile__ ("cli"::: "memory"); > > > } > > > > > > - > > > - > > > - > > > -/** > > > - 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). > > > > > > @@ -176,37 +116,6 @@ AsmWriteMsr64 ( > > > return Value; > > > } > > > > > > - > > > - > > > -/** > > > - Reads the current value of the EFLAGS register. > > > - > > > - Reads and returns the current value of the EFLAGS > > register. This function 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 " > > > - : "=r" (Eflags) // %0 > > > - ); > > > - > > > - return Eflags; > > > -} > > > - > > > - > > > - > > > /** > > > Reads the current value of the Control Register 0 > > (CR0). > > > > > > @@ -1163,475 +1072,6 @@ AsmWriteLdtr ( > > > ); > > > } > > > > > > - > > > -/** > > > - Save the current floating point/SSE/SSE2 context > to > > a buffer. > > > - > > > - Saves the current floating point/SSE/SSE2 state > to > > the buffer specified 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 specified > > > - 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 available > > > - on IA-32 and X64. > > > - > > > - @return The current value of MM0. > > > - > > > -**/ > > > -UINT64 > > > -EFIAPI > > > -AsmReadMm0 ( > > > - VOID > > > - ) > > > -{ > > > - UINT64 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movd %%mm0, %0 \n\t" > > > - : "=r" (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 available > > > - on IA-32 and X64. > > > - > > > - @return The current value of MM1. > > > - > > > -**/ > > > -UINT64 > > > -EFIAPI > > > -AsmReadMm1 ( > > > - VOID > > > - ) > > > -{ > > > - UINT64 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movd %%mm1, %0 \n\t" > > > - : "=r" (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 available > > > - on IA-32 and X64. > > > - > > > - @return The current value of MM2. > > > - > > > -**/ > > > -UINT64 > > > -EFIAPI > > > -AsmReadMm2 ( > > > - VOID > > > - ) > > > -{ > > > - UINT64 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movd %%mm2, %0 \n\t" > > > - : "=r" (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 available > > > - on IA-32 and X64. > > > - > > > - @return The current value of MM3. > > > - > > > -**/ > > > -UINT64 > > > -EFIAPI > > > -AsmReadMm3 ( > > > - VOID > > > - ) > > > -{ > > > - UINT64 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movd %%mm3, %0 \n\t" > > > - : "=r" (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 available > > > - on IA-32 and X64. > > > - > > > - @return The current value of MM4. > > > - > > > -**/ > > > -UINT64 > > > -EFIAPI > > > -AsmReadMm4 ( > > > - VOID > > > - ) > > > -{ > > > - UINT64 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movd %%mm4, %0 \n\t" > > > - : "=r" (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 available > > > - on IA-32 and X64. > > > - > > > - @return The current value of MM5. > > > - > > > -**/ > > > -UINT64 > > > -EFIAPI > > > -AsmReadMm5 ( > > > - VOID > > > - ) > > > -{ > > > - UINT64 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movd %%mm5, %0 \n\t" > > > - : "=r" (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 available > > > - on IA-32 and X64. > > > - > > > - @return The current value of MM6. > > > - > > > -**/ > > > -UINT64 > > > -EFIAPI > > > -AsmReadMm6 ( > > > - VOID > > > - ) > > > -{ > > > - UINT64 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movd %%mm6, %0 \n\t" > > > - : "=r" (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 available > > > - on IA-32 and X64. > > > - > > > - @return The current value of MM7. > > > - > > > -**/ > > > -UINT64 > > > -EFIAPI > > > -AsmReadMm7 ( > > > - VOID > > > - ) > > > -{ > > > - UINT64 Data; > > > - > > > - __asm__ __volatile__ ( > > > - "movd %%mm7, %0 \n\t" > > > - : "=r" (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 IA32 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 IA32 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 IA32 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 IA32 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 IA32 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 IA32 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 IA32 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 IA32 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 available > > > - on IA-32 and X64. > > > - > > > - @return The current value of TSC > > > - > > > -**/ > > > -UINT64 > > > -EFIAPI > > > -AsmReadTsc ( > > > - VOID > > > - ) > > > -{ > > > - UINT32 LowData; > > > - UINT32 HiData; > > > - > > > - __asm__ __volatile__ ( > > > - "rdtsc" > > > - : "=a" (LowData), > > > - "=d" (HiData) > > > - ); > > > - > > > - return (((UINT64)HiData) << 32) | LowData; > > > -} > > > - > > > - > > > /** > > > Reads the current value of a Performance Counter > > (PMC). > > > > > > @@ -1662,7 +1102,6 @@ AsmReadPmc ( > > > return (((UINT64)HiData) << 32) | LowData; > > > } > > > > > > - > > > /** > > > Sets up a monitor buffer that is used by > > AsmMwait(). > > > > > > @@ -1698,7 +1137,6 @@ AsmMonitor ( > > > return Eax; > > > } > > > > > > - > > > /** > > > Executes an MWAIT instruction. > > > > > > @@ -1730,7 +1168,6 @@ AsmMwait ( > > > return Eax; > > > } > > > > > > - > > > /** > > > Executes a WBINVD instruction. > > > > > > @@ -1747,7 +1184,6 @@ AsmWbinvd ( > > > __asm__ __volatile__ ("wbinvd":::"memory"); > > > } > > > > > > - > > > /** > > > Executes a INVD instruction. > > > > > > @@ -1796,5 +1232,3 @@ AsmFlushCacheLine ( > > > > > > return LinearAddress; > > > } > > > - > > > - > > > -- > > > 2.21.0.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#62349): https://edk2.groups.io/g/devel/message/62349 Mute This Topic: https://groups.io/mt/74885911/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-