/** @file\r
GCC inline implementation of BaseLib processor specific functions.\r
- \r
- Copyright (c) 2006 - 2010, Intel Corporation<BR>\r
- Portions copyright (c) 2008-2009 Apple Inc. All rights reserved.<BR> \r
- All rights reserved. This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
)\r
{\r
// This is a little bit of overkill and it is more about the compiler that it is\r
- // actually processor syncronization. This is like the _ReadWriteBarrier \r
- // Microsft specific intrinsic\r
+ // actually processor synchronization. This is like the _ReadWriteBarrier\r
+ // Microsoft specific intrinsic\r
__asm__ __volatile__ ("":::"memory");\r
}\r
\r
DisableInterrupts (\r
VOID\r
)\r
-{ \r
+{\r
__asm__ __volatile__ ("cli"::: "memory");\r
}\r
\r
{\r
UINT32 LowData;\r
UINT32 HighData;\r
- \r
+\r
__asm__ __volatile__ (\r
"rdmsr"\r
: "=a" (LowData), // %0\r
"=d" (HighData) // %1\r
: "c" (Index) // %2\r
);\r
- \r
+\r
return (((UINT64)HighData) << 32) | LowData;\r
}\r
\r
\r
LowData = (UINT32)(Value);\r
HighData = (UINT32)(Value >> 32);\r
- \r
+\r
__asm__ __volatile__ (\r
"wrmsr"\r
:\r
"a" (LowData),\r
"d" (HighData)\r
);\r
- \r
+\r
return Value;\r
}\r
\r
)\r
{\r
UINTN Eflags;\r
- \r
+\r
__asm__ __volatile__ (\r
"pushfq \n\t"\r
"pop %0 "\r
: "=r" (Eflags) // %0\r
);\r
- \r
+\r
return Eflags;\r
}\r
\r
)\r
{\r
UINTN Data;\r
- \r
+\r
__asm__ __volatile__ (\r
- "mov %%cr0,%0" \r
+ "mov %%cr0,%0"\r
: "=r" (Data) // %0\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINTN Data;\r
- \r
+\r
__asm__ __volatile__ (\r
- "mov %%cr2, %0" \r
+ "mov %%cr2, %0"\r
: "=r" (Data) // %0\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINTN Data;\r
- \r
+\r
__asm__ __volatile__ (\r
- "mov %%cr3, %0" \r
+ "mov %%cr3, %0"\r
: "=r" (Data) // %0\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINTN Data;\r
- \r
+\r
__asm__ __volatile__ (\r
- "mov %%cr4, %0" \r
+ "mov %%cr4, %0"\r
: "=r" (Data) // %0\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINTN Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"mov %%dr0, %0"\r
: "=r" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINTN Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"mov %%dr1, %0"\r
: "=r" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINTN Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"mov %%dr2, %0"\r
: "=r" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINTN Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"mov %%dr3, %0"\r
: "=r" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINTN Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"mov %%dr4, %0"\r
: "=r" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINTN Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"mov %%dr5, %0"\r
: "=r" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINTN Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"mov %%dr6, %0"\r
: "=r" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINTN Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"mov %%dr7, %0"\r
: "=r" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINT16 Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"mov %%cs, %0"\r
:"=a" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINT16 Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"mov %%ds, %0"\r
:"=a" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINT16 Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"mov %%es, %0"\r
:"=a" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINT16 Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"mov %%fs, %0"\r
:"=a" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINT16 Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"mov %%gs, %0"\r
:"=a" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINT16 Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"mov %%ds, %0"\r
:"=a" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
)\r
{\r
UINT16 Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"str %0"\r
: "=r" (Data)\r
);\r
- \r
+\r
return Data;\r
}\r
\r
Reads and returns the current GDTR descriptor and returns it in Gdtr. This\r
function is only available on IA-32 and X64.\r
\r
- @param Gdtr Pointer to a GDTR descriptor.\r
+ @param Gdtr The pointer to a GDTR descriptor.\r
\r
**/\r
VOID\r
Writes and the current GDTR descriptor specified by Gdtr. This function is\r
only available on IA-32 and X64.\r
\r
- @param Gdtr Pointer to a GDTR descriptor.\r
+ @param Gdtr The pointer to a GDTR descriptor.\r
\r
**/\r
VOID\r
:\r
: "m" (*Gdtr)\r
);\r
- \r
+\r
}\r
\r
\r
Reads and returns the current IDTR descriptor and returns it in Idtr. This\r
function is only available on IA-32 and X64.\r
\r
- @param Idtr Pointer to a IDTR descriptor.\r
+ @param Idtr The pointer to a IDTR descriptor.\r
\r
**/\r
VOID\r
)\r
{\r
__asm__ __volatile__ (\r
- "sldt %0"\r
+ "sidt %0"\r
: "=m" (*Idtr)\r
);\r
}\r
Writes the current IDTR descriptor and returns it in Idtr. This function is\r
only available on IA-32 and X64.\r
\r
- @param Idtr Pointer to a IDTR descriptor.\r
+ @param Idtr The pointer to a IDTR descriptor.\r
\r
**/\r
VOID\r
)\r
{\r
UINT16 Data;\r
- \r
+\r
__asm__ __volatile__ (\r
"sldt %0"\r
: "=g" (Data) // %0\r
);\r
- \r
+\r
return Data;\r
}\r
\r
Buffer. Buffer must be aligned on a 16-byte boundary. This function is only\r
available on IA-32 and X64.\r
\r
- @param Buffer Pointer to a buffer to save the floating point/SSE/SSE2 context.\r
+ @param Buffer The pointer to a buffer to save the floating point/SSE/SSE2 context.\r
\r
**/\r
VOID\r
"fxsave %0"\r
:\r
: "m" (*Buffer) // %0\r
- ); \r
+ );\r
}\r
\r
\r
by Buffer. Buffer must be aligned on a 16-byte boundary. This function is\r
only available on IA-32 and X64.\r
\r
- @param Buffer Pointer to a buffer to save the floating point/SSE/SSE2 context.\r
+ @param Buffer The pointer to a buffer to save the floating point/SSE/SSE2 context.\r
\r
**/\r
VOID\r
"movd %%mm0, %0 \n\t"\r
: "=r" (Data) // %0\r
);\r
- \r
+\r
return Data;\r
}\r
\r
"movd %%mm1, %0 \n\t"\r
: "=r" (Data) // %0\r
);\r
- \r
+\r
return Data;\r
}\r
\r
"movd %%mm2, %0 \n\t"\r
: "=r" (Data) // %0\r
);\r
- \r
+\r
return Data;\r
}\r
\r
"movd %%mm3, %0 \n\t"\r
: "=r" (Data) // %0\r
);\r
- \r
+\r
return Data;\r
}\r
\r
"movd %%mm4, %0 \n\t"\r
: "=r" (Data) // %0\r
);\r
- \r
+\r
return Data;\r
}\r
\r
"movd %%mm5, %0 \n\t"\r
: "=r" (Data) // %0\r
);\r
- \r
+\r
return Data;\r
}\r
\r
"movd %%mm6, %0 \n\t"\r
: "=r" (Data) // %0\r
);\r
- \r
+\r
return Data;\r
}\r
\r
"movd %%mm7, %0 \n\t"\r
: "=r" (Data) // %0\r
);\r
- \r
+\r
return Data;\r
}\r
\r
{\r
__asm__ __volatile__ (\r
"movd %0, %%mm0" // %0\r
- : \r
+ :\r
: "m" (Value)\r
);\r
}\r
{\r
__asm__ __volatile__ (\r
"movd %0, %%mm1" // %0\r
- : \r
+ :\r
: "m" (Value)\r
);\r
}\r
{\r
__asm__ __volatile__ (\r
"movd %0, %%mm2" // %0\r
- : \r
+ :\r
: "m" (Value)\r
);\r
}\r
{\r
__asm__ __volatile__ (\r
"movd %0, %%mm3" // %0\r
- : \r
+ :\r
: "m" (Value)\r
);\r
}\r
{\r
__asm__ __volatile__ (\r
"movd %0, %%mm4" // %0\r
- : \r
+ :\r
: "m" (Value)\r
);\r
}\r
{\r
__asm__ __volatile__ (\r
"movd %0, %%mm5" // %0\r
- : \r
+ :\r
: "m" (Value)\r
);\r
}\r
{\r
__asm__ __volatile__ (\r
"movd %0, %%mm6" // %0\r
- : \r
+ :\r
: "m" (Value)\r
);\r
}\r
{\r
__asm__ __volatile__ (\r
"movd %0, %%mm7" // %0\r
- : \r
+ :\r
: "m" (Value)\r
);\r
}\r
{\r
UINT32 LowData;\r
UINT32 HiData;\r
- \r
+\r
__asm__ __volatile__ (\r
"rdtsc"\r
: "=a" (LowData),\r
"=d" (HiData)\r
);\r
- \r
- return (((UINT64)HiData) << 32) | LowData; \r
+\r
+ return (((UINT64)HiData) << 32) | LowData;\r
}\r
\r
\r
{\r
UINT32 LowData;\r
UINT32 HiData;\r
- \r
+\r
__asm__ __volatile__ (\r
"rdpmc"\r
: "=a" (LowData),\r
"=d" (HiData)\r
: "c" (Index)\r
);\r
- \r
- return (((UINT64)HiData) << 32) | LowData; \r
+\r
+ return (((UINT64)HiData) << 32) | LowData;\r
}\r
\r
\r
"c" (Ecx),\r
"d" (Edx)\r
);\r
- \r
+\r
return Eax;\r
}\r
\r
{\r
__asm__ __volatile__ (\r
"mwait"\r
- : \r
+ :\r
: "a" (Eax),\r
"c" (Ecx)\r
);\r
- \r
- return Eax; \r
+\r
+ return Eax;\r
}\r
\r
\r
)\r
{\r
__asm__ __volatile__ ("invd":::"memory");\r
- \r
+\r
}\r
\r
\r
__asm__ __volatile__ (\r
"clflush (%0)"\r
:\r
- : "r" (LinearAddress) \r
+ : "r" (LinearAddress)\r
: "memory"\r
);\r
- \r
+\r
return LinearAddress;\r
}\r
\r