From: "Liming Gao" <liming.gao@intel.com>
To: "Kinney, Michael D" <michael.d.kinney@intel.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: Sean Brogan <sean.brogan@microsoft.com>,
Bret Barkelew <Bret.Barkelew@microsoft.com>,
"Yao, Jiewen" <jiewen.yao@intel.com>
Subject: Re: [Patch 04/15] MdePkg/BaseLib: Break out IA32/X64 GCC inline privileged functions
Date: Thu, 9 Jul 2020 14:07:18 +0000 [thread overview]
Message-ID: <MWHPR11MB1630C3EDC8E0F58419169BB580640@MWHPR11MB1630.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20200615001918.22164-5-michael.d.kinney@intel.com>
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.kinney@intel.com>
> Sent: Monday, June 15, 2020 8:19 AM
> To: devel@edk2.groups.io
> Cc: Gao, Liming <liming.gao@intel.com>; Sean Brogan <sean.brogan@microsoft.com>; Bret Barkelew <Bret.Barkelew@microsoft.com>;
> Yao, Jiewen <jiewen.yao@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.gao@intel.com>
> Cc: Sean Brogan <sean.brogan@microsoft.com>
> Cc: Bret Barkelew <Bret.Barkelew@microsoft.com>
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Signed-off-by: Michael D Kinney <michael.d.kinney@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
next prev parent reply other threads:[~2020-07-09 14:07 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-15 0:19 [Patch 00/15] UnitTestFrameworkPkg: Enhancements and bug fixes Michael D Kinney
2020-06-15 0:19 ` [Patch 01/15] BaseTools/Python: Allow HOST_APPLICATION to use NULL libraries Michael D Kinney
2020-06-15 6:22 ` [edk2-devel] " Yuwei Chen
2020-06-15 0:19 ` [Patch 02/15] MdePkg/BaseCpuLibNull: Add Null version of CpuLib for host testing Michael D Kinney
2020-07-09 14:03 ` Liming Gao
2020-06-15 0:19 ` [Patch 03/15] MdePkg/BaseCacheMaintenanceLibNull: Add Null instance " Michael D Kinney
2020-07-09 14:03 ` Liming Gao
2020-06-15 0:19 ` [Patch 04/15] MdePkg/BaseLib: Break out IA32/X64 GCC inline privileged functions Michael D Kinney
2020-07-09 14:07 ` Liming Gao [this message]
2020-07-09 17:00 ` Michael D Kinney
2020-07-10 8:06 ` Liming Gao
2020-07-10 16:24 ` Michael D Kinney
2020-06-15 0:19 ` [Patch 05/15] MdePkg/Library/BaseLib: Add BaseLib instance for host based unit tests Michael D Kinney
2020-06-15 0:19 ` [Patch 06/15] UnitTestFrameworkPkg: Use host libraries from MdePkg Michael D Kinney
2020-06-15 0:19 ` [Patch 07/15] UnitTestFrameworkPkg: Enable source level debug for host tests Michael D Kinney
2020-06-15 0:19 ` [Patch 08/15] UnitTestFrameworkPkg: Set host application stack size to 256KB Michael D Kinney
2020-06-15 0:19 ` [Patch 09/15] UnitTestFrameworkPkg: Change target mode DebugLib mapping Michael D Kinney
2020-06-15 0:19 ` [Patch 10/15] UnitTestFrameworkPkg/UnitTestLib: Move print log into cleanup Michael D Kinney
2020-06-15 0:19 ` [Patch 11/15] UnitTestFrameworkPkg/UnitTestLib: Fix target mode log messages Michael D Kinney
2020-06-15 0:19 ` [Patch 12/15] UnitTestFrameworkPkg/UnitTestLib: Add checks for ASSERT() Michael D Kinney
2020-06-15 0:19 ` [Patch 13/15] MdePkg/Include: Hook DebugLib _ASSERT() for unit tests Michael D Kinney
2020-06-15 0:19 ` [Patch 14/15] MdePkg/Include: Add UT_EXPECT_ASSERT_FAILURE() to UnitTestLib Michael D Kinney
2020-06-15 0:19 ` [Patch 15/15] UnitTestFramewokPkg/SampleUnitTest: Use UT_EXPECT_ASSERT_FAILURE() Michael D Kinney
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=MWHPR11MB1630C3EDC8E0F58419169BB580640@MWHPR11MB1630.namprd11.prod.outlook.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox