);\r
\r
\r
+/**\r
+ Reads the current value of a Machine Specific Register (MSR).\r
+\r
+ Reads and returns the current value of the Machine Specific Register specified by Index. No\r
+ parameter checking is performed on Index, and if the Index value is beyond the implemented MSR\r
+ register range, a Reserved Register/Field fault may occur. The caller must either guarantee that\r
+ Index is valid, or the caller must set up fault handlers to catch the faults. This function is\r
+ only available on IPF.\r
+\r
+ @param Index The 8-bit Machine Specific Register index to read.\r
+\r
+ @return The current value of the Machine Specific Register specified by Index. \r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadMsr (\r
+ IN UINT8 Index \r
+ );\r
+\r
+\r
+/**\r
+ Writes the current value of a Machine Specific Register (MSR).\r
+\r
+ Writes Value to the Machine Specific Register specified by Index. Value is returned. No\r
+ parameter checking is performed on Index, and if the Index value is beyond the implemented MSR\r
+ register range, a Reserved Register/Field fault may occur. The caller must either guarantee that\r
+ Index is valid, or the caller must set up fault handlers to catch the faults. This function is\r
+ only available on IPF.\r
+\r
+ @param Index The 8-bit Machine Specific Register index to write.\r
+ @param Value The 64-bit value to write to the Machine Specific Register.\r
+\r
+ @return The 64-bit value to write to the Machine Specific Register. \r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteMsr (\r
+ IN UINT8 Index, \r
+ IN UINT64 Value \r
+ );\r
+\r
+\r
/**\r
Determines if the CPU is currently executing in virtual, physical, or mixed mode.\r
\r
ChkStkGcc.c | GCC \r
\r
[Sources.IPF]\r
- Ipf/AsmCpuMisc.s\r
Ipf/AccessGp.s\r
Ipf/ReadCpuid.s\r
Ipf/ExecFc.s\r
Ipf/AccessGcr.s\r
Ipf/AccessEicr.s\r
Ipf/AccessDbr.s\r
+ Ipf/AccessMsr.s | INTEL\r
Ipf/FlushCacheRange.s\r
Ipf/InternalSwitchStack.c\r
Ipf/GetInterruptState.s\r
Ipf/InterlockedCompareExchange32.s\r
Ipf/CpuBreakpoint.c | INTEL\r
Ipf/CpuBreakpointMsc.c | MSFT\r
+ Ipf/AsmCpuMisc.s | GCC\r
Ipf/Unaligned.c\r
Ipf/SwitchStack.s\r
Ipf/LongJmp.s\r
Ipf/SetJmp.s\r
Ipf/ReadCr.s\r
- Ipf/ReadControlRegister.c\r
Ipf/ReadAr.s\r
- Ipf/ReadApplicationRegister.c\r
Ipf/Ia64gen.h\r
Ipf/Asm.h\r
Math64.c\r
--- /dev/null
+/// @file\r
+/// IPF specific Machine Specific Registers accessing functions.\r
+///\r
+/// Copyright (c) 2008, Intel Corporation\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
+///\r
+///\r
+///\r
+\r
+\r
+//---------------------------------------------------------------------------------\r
+//++\r
+// AsmReadMsr\r
+//\r
+// Reads the current value of a Machine Specific Register (MSR).\r
+//\r
+// Reads and returns the current value of the Machine Specific Register specified by Index. No\r
+// parameter checking is performed on Index, and if the Index value is beyond the implemented MSR\r
+// register range, a Reserved Register/Field fault may occur. The caller must either guarantee that\r
+// Index is valid, or the caller must set up fault handlers to catch the faults. This function is\r
+// only available on IPF.\r
+//\r
+// Arguments :\r
+//\r
+// On Entry : The 8-bit Machine Specific Register index to read.\r
+//\r
+// Return Value: The current value of the Machine Specific Register specified by Index.\r
+//\r
+//--\r
+//----------------------------------------------------------------------------------\r
+.text\r
+.type AsmReadMsr, @function\r
+.proc AsmReadMsr\r
+.regstk 1, 0, 0, 0\r
+\r
+AsmReadMsr::\r
+ mov r8=msr[in0];;\r
+ br.ret.sptk b0;;\r
+.endp AsmReadMsr\r
+\r
+//---------------------------------------------------------------------------------\r
+//++\r
+// AsmWriteMsr\r
+//\r
+// Writes the current value of a Machine Specific Register (MSR).\r
+//\r
+// Writes Value to the Machine Specific Register specified by Index. Value is returned. No\r
+// parameter checking is performed on Index, and if the Index value is beyond the implemented MSR\r
+// register range, a Reserved Register/Field fault may occur. The caller must either guarantee that\r
+// Index is valid, or the caller must set up fault handlers to catch the faults. This function is\r
+// only available on IPF.\r
+//\r
+// Arguments :\r
+//\r
+// On Entry : The 8-bit Machine Specific Register index to write.\r
+// The 64-bit value to write to the Machine Specific Register.\r
+//\r
+// Return Value: The 64-bit value to write to the Machine Specific Register.\r
+//\r
+//--\r
+//----------------------------------------------------------------------------------\r
+.text\r
+.type AsmWriteMsr, @function\r
+.proc AsmWriteMsr\r
+.regstk 2, 0, 0, 0\r
+\r
+AsmWriteMsr::\r
+ mov msr[in0] = in1\r
+ mov r8 = in1;;\r
+ srlz.d;;\r
+ br.ret.sptk b0;;\r
+.endp AsmWriteMsr\r
+\r
+++ /dev/null
-/** @file\r
- Implementation of Application Register reading functions on Itanium platform.\r
-\r
- Copyright (c) 2008, Intel Corporation<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
-\r
-**/\r
-\r
-#include "BaseLibInternals.h"\r
-\r
-\r
-//\r
-// Loop up table for Index and corresponding application register access routines. \r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED REGISTER_ENTRY mApplicationRegisterAccessEntries[] = {\r
- {IPF_APPLICATION_REGISTER_K0, AsmReadApplicationRegisterK0},\r
- {IPF_APPLICATION_REGISTER_K1, AsmReadApplicationRegisterK1},\r
- {IPF_APPLICATION_REGISTER_K2, AsmReadApplicationRegisterK2},\r
- {IPF_APPLICATION_REGISTER_K3, AsmReadApplicationRegisterK3},\r
- {IPF_APPLICATION_REGISTER_K4, AsmReadApplicationRegisterK4},\r
- {IPF_APPLICATION_REGISTER_K5, AsmReadApplicationRegisterK5},\r
- {IPF_APPLICATION_REGISTER_K6, AsmReadApplicationRegisterK6},\r
- {IPF_APPLICATION_REGISTER_K7, AsmReadApplicationRegisterK7},\r
- {IPF_APPLICATION_REGISTER_RSC, AsmReadApplicationRegisterRsc},\r
- {IPF_APPLICATION_REGISTER_BSP, AsmReadApplicationRegisterBsp},\r
- {IPF_APPLICATION_REGISTER_BSPSTORE, AsmReadApplicationRegisterBspstore},\r
- {IPF_APPLICATION_REGISTER_RNAT, AsmReadApplicationRegisterRnat},\r
- {IPF_APPLICATION_REGISTER_FCR, AsmReadApplicationRegisterFcr},\r
- {IPF_APPLICATION_REGISTER_EFLAG, AsmReadApplicationRegisterEflag},\r
- {IPF_APPLICATION_REGISTER_CSD, AsmReadApplicationRegisterCsd},\r
- {IPF_APPLICATION_REGISTER_SSD, AsmReadApplicationRegisterSsd},\r
- {IPF_APPLICATION_REGISTER_CFLG, AsmReadApplicationRegisterCflg},\r
- {IPF_APPLICATION_REGISTER_FSR, AsmReadApplicationRegisterFsr},\r
- {IPF_APPLICATION_REGISTER_FIR, AsmReadApplicationRegisterFir},\r
- {IPF_APPLICATION_REGISTER_FDR, AsmReadApplicationRegisterFdr},\r
- {IPF_APPLICATION_REGISTER_CCV, AsmReadApplicationRegisterCcv},\r
- {IPF_APPLICATION_REGISTER_UNAT, AsmReadApplicationRegisterUnat},\r
- {IPF_APPLICATION_REGISTER_FPSR, AsmReadApplicationRegisterFpsr},\r
- {IPF_APPLICATION_REGISTER_ITC, AsmReadApplicationRegisterItc},\r
- {IPF_APPLICATION_REGISTER_PFS, AsmReadApplicationRegisterPfs},\r
- {IPF_APPLICATION_REGISTER_LC, AsmReadApplicationRegisterLc},\r
- {IPF_APPLICATION_REGISTER_EC, AsmReadApplicationRegisterEc}\r
-};\r
-\r
-\r
-/**\r
- Reads a 64-bit application register.\r
-\r
- Reads and returns the application register specified by Index. The valid Index valued are defined\r
- above in "Related Definitions".\r
- If Index is invalid then 0xFFFFFFFFFFFFFFFF is returned. This function is only available on IPF.\r
-\r
- @param Index The index of the application register to read.\r
-\r
- @return The application register specified by Index.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmReadApplicationRegister (\r
- IN UINT64 Index\r
- )\r
-{\r
- UINTN Item;\r
-\r
- for (Item = 0; Item < sizeof (mApplicationRegisterAccessEntries) / sizeof (mApplicationRegisterAccessEntries[0]); Item++) {\r
- if (mApplicationRegisterAccessEntries[Item].Index == Index) {\r
- return mApplicationRegisterAccessEntries[Item].Function ();\r
- }\r
- }\r
-\r
- return 0xFFFFFFFFFFFFFFFF;\r
-}\r
\r
\r
\r
-.text\r
-.type AsmReadApplicationRegisterK0, @function\r
-.proc AsmReadApplicationRegisterK0\r
-//\r
-// Reads appplication register K0.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_K0\r
-//\r
-// @return The 64-bit application register K0.\r
-//\r
-AsmReadApplicationRegisterK0::\r
- mov r8 = ar.k0;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterK0\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterK1, @function\r
-.proc AsmReadApplicationRegisterK1\r
-//\r
-// Reads appplication register K1.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_K1\r
-//\r
-// @return The 64-bit application register K1.\r
-//\r
-AsmReadApplicationRegisterK1::\r
- mov r8 = ar.k1;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterK1\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterK2, @function\r
-.proc AsmReadApplicationRegisterK2\r
-//\r
-// Reads appplication register K2.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_K2\r
-//\r
-// @return The 64-bit application register K2.\r
-//\r
-AsmReadApplicationRegisterK2::\r
- mov r8 = ar.k2;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterK2\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterK3, @function\r
-.proc AsmReadApplicationRegisterK3\r
-//\r
-// Reads appplication register K3.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_K3\r
-//\r
-// @return The 64-bit application register K3.\r
-//\r
-AsmReadApplicationRegisterK3::\r
- mov r8 = ar.k3;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterK3\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterK4, @function\r
-.proc AsmReadApplicationRegisterK4\r
-//\r
-// Reads appplication register K4.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_K4\r
-//\r
-// @return The 64-bit application register K4.\r
-//\r
-AsmReadApplicationRegisterK4::\r
- mov r8 = ar.k4;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterK4\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterK5, @function\r
-.proc AsmReadApplicationRegisterK5\r
-//\r
-// Reads appplication register K5.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_K5\r
-//\r
-// @return The 64-bit application register K5.\r
-//\r
-AsmReadApplicationRegisterK5::\r
- mov r8 = ar.k5;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterK5\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterK6, @function\r
-.proc AsmReadApplicationRegisterK6\r
-//\r
-// Reads appplication register K6.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_K6\r
-//\r
-// @return The 64-bit application register K6.\r
-//\r
-AsmReadApplicationRegisterK6::\r
- mov r8 = ar.k6;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterK6\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterK7, @function\r
-.proc AsmReadApplicationRegisterK7\r
-//\r
-// Reads appplication register K7.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_K7\r
-//\r
-// @return The 64-bit application register K7.\r
-//\r
-AsmReadApplicationRegisterK7::\r
- mov r8 = ar.k7;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterK7\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterRsc, @function\r
-.proc AsmReadApplicationRegisterRsc\r
-//\r
-// Reads appplication register RSC.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_RSC\r
-//\r
-// @return The 64-bit application register RSC.\r
-//\r
-AsmReadApplicationRegisterRsc::\r
- mov r8 = ar.rsc;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterRsc\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterBsp, @function\r
-.proc AsmReadApplicationRegisterBsp\r
-//\r
-// Reads appplication register BSP.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_BSP\r
-//\r
-// @return The 64-bit application register BSP.\r
-//\r
-AsmReadApplicationRegisterBsp::\r
- mov r8 = ar.bsp;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterBsp\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterBspstore, @function\r
-.proc AsmReadApplicationRegisterBspstore\r
-//\r
-// Reads appplication register BSPSTORE.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_BSPSTORE\r
-//\r
-// @return The 64-bit application register BSPSTORE.\r
-//\r
-AsmReadApplicationRegisterBspstore::\r
- mov r8 = ar.bspstore;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterBspstore\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterRnat, @function\r
-.proc AsmReadApplicationRegisterRnat\r
-//\r
-// Reads appplication register RNAT.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_RNAT\r
-//\r
-// @return The 64-bit application register RNAT.\r
-//\r
-AsmReadApplicationRegisterRnat::\r
- mov r8 = ar.rnat;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterRnat\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterFcr, @function\r
-.proc AsmReadApplicationRegisterFcr\r
-//\r
-// Reads appplication register FCR.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_FCR\r
-//\r
-// @return The 64-bit application register FCR.\r
-//\r
-AsmReadApplicationRegisterFcr::\r
- mov r8 = ar.fcr;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterFcr\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterEflag, @function\r
-.proc AsmReadApplicationRegisterEflag\r
-//\r
-// Reads appplication register EFLAG.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_EFLAG\r
-//\r
-// @return The 64-bit application register EFLAG.\r
-//\r
-AsmReadApplicationRegisterEflag::\r
- mov r8 = ar.eflag;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterEflag\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterCsd, @function\r
-.proc AsmReadApplicationRegisterCsd\r
-//\r
-// Reads appplication register CSD.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_CSD\r
-//\r
-// @return The 64-bit application register CSD.\r
-//\r
-AsmReadApplicationRegisterCsd::\r
- mov r8 = ar.csd;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterCsd\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterSsd, @function\r
-.proc AsmReadApplicationRegisterSsd\r
-//\r
-// Reads appplication register SSD.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_SSD\r
-//\r
-// @return The 64-bit application register SSD.\r
-//\r
-AsmReadApplicationRegisterSsd::\r
- mov r8 = ar.ssd;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterSsd\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterCflg, @function\r
-.proc AsmReadApplicationRegisterCflg\r
-//\r
-// Reads appplication register CFLG.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_CFLG\r
-//\r
-// @return The 64-bit application register CFLG.\r
-//\r
-AsmReadApplicationRegisterCflg::\r
- mov r8 = ar.cflg;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterCflg\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterFsr, @function\r
-.proc AsmReadApplicationRegisterFsr\r
-//\r
-// Reads appplication register FSR.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_FSR\r
-//\r
-// @return The 64-bit application register FSR.\r
-//\r
-AsmReadApplicationRegisterFsr::\r
- mov r8 = ar.fsr;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterFsr\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterFir, @function\r
-.proc AsmReadApplicationRegisterFir\r
-//\r
-// Reads appplication register FIR.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_FIR\r
-//\r
-// @return The 64-bit application register FIR.\r
-//\r
-AsmReadApplicationRegisterFir::\r
- mov r8 = ar.fir;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterFir\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterFdr, @function\r
-.proc AsmReadApplicationRegisterFdr\r
-//\r
-// Reads appplication register FDR.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_FDR\r
-//\r
-// @return The 64-bit application register FDR.\r
-//\r
-AsmReadApplicationRegisterFdr::\r
- mov r8 = ar.fdr;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterFdr\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterCcv, @function\r
-.proc AsmReadApplicationRegisterCcv\r
-//\r
-// Reads appplication register CCV.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_CCV\r
-//\r
-// @return The 64-bit application register CCV.\r
-//\r
-AsmReadApplicationRegisterCcv::\r
- mov r8 = ar.ccv;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterCcv\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterUnat, @function\r
-.proc AsmReadApplicationRegisterUnat\r
-//\r
-// Reads appplication register UNAT.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_UNAT\r
-//\r
-// @return The 64-bit application register UNAT.\r
-//\r
-AsmReadApplicationRegisterUnat::\r
- mov r8 = ar.unat;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterUnat\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterFpsr, @function\r
-.proc AsmReadApplicationRegisterFpsr\r
-//\r
-// Reads appplication register FPSR.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_FPSR\r
-//\r
-// @return The 64-bit application register FPSR.\r
-//\r
-AsmReadApplicationRegisterFpsr::\r
- mov r8 = ar.fpsr;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterFpsr\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterItc, @function\r
-.proc AsmReadApplicationRegisterItc\r
-//\r
-// Reads appplication register ITC.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_ITC\r
-//\r
-// @return The 64-bit application register ITC.\r
-//\r
-AsmReadApplicationRegisterItc::\r
- mov r8 = ar.itc;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterItc\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterPfs, @function\r
-.proc AsmReadApplicationRegisterPfs\r
-//\r
-// Reads appplication register PFS.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_PFS\r
-//\r
-// @return The 64-bit application register PFS.\r
-//\r
-AsmReadApplicationRegisterPfs::\r
- mov r8 = ar.pfs;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterPfs\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterLc, @function\r
-.proc AsmReadApplicationRegisterLc\r
-//\r
-// Reads appplication register LC.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_LC\r
-//\r
-// @return The 64-bit application register LC.\r
-//\r
-AsmReadApplicationRegisterLc::\r
- mov r8 = ar.lc;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterLc\r
-\r
-\r
-\r
-.text\r
-.type AsmReadApplicationRegisterEc, @function\r
-.proc AsmReadApplicationRegisterEc\r
-//\r
-// Reads appplication register EC.\r
-//\r
-// This is a worker function for AsmReadApplicationRegister()\r
-// when its parameter Index is IPF_APPLICATION_REGISTER_EC\r
-//\r
-// @return The 64-bit application register EC.\r
-//\r
-AsmReadApplicationRegisterEc::\r
- mov r8 = ar.ec;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadApplicationRegisterEc\r
-\r
+//---------------------------------------------------------------------------------\r
+//++\r
+// AsmReadApplicationRegister\r
+//\r
+// Reads a 64-bit application register.\r
+//\r
+// Reads and returns the application register specified by Index.\r
+// If Index is invalid then 0xFFFFFFFFFFFFFFFF is returned. This function is only available on IPF.\r
+//\r
+// Arguments :\r
+//\r
+// On Entry : The index of the application register to read.\r
+//\r
+// Return Value: The application register specified by Index.\r
+//\r
+//--\r
+//----------------------------------------------------------------------------------\r
+.text\r
+.type AsmReadApplicationRegister, @function\r
+.proc AsmReadApplicationRegister\r
+.regstk 1, 0, 0, 0\r
+\r
+AsmReadApplicationRegister::\r
+ //\r
+ // ARs are defined in the ranges 0-44 and 64-66 (with some holes).\r
+ // Compact this list by subtracting 16 from the top range.\r
+ // 0-44, 64-66 -> 0-44, 48-50\r
+ //\r
+ mov r15=2\r
+ mov r14=pr // save predicates\r
+ cmp.leu p6,p7=64,in0 // p6 = AR# >= 64\r
+ ;;\r
+ (p7) cmp.leu p7,p0=48,in0 // p7 = 32 <= AR# < 64\r
+ (p6) add in0=-16,in0 // if (AR >= 64) AR# -= 16\r
+ ;;\r
+ (p7) mov r15=0 // if bad range (48-63)\r
+ ;;\r
+ mov ret0=-1 // in case of illegal AR #\r
+ shl r15=r15,in0 // r15 = 0x2 << AR#\r
+ ;;\r
+ mov pr=r15,-1\r
+ ;;\r
+ //\r
+ // At this point the predicates contain a bit field of the\r
+ // AR desired. (The bit is the AR+1, since pr0 is always 1.)\r
+ //\r
+ .pred.rel "mutex",p1,p2,p3,p4,p5,p6,p7,p8,p17,p18,p19,p20,p22,p25,\\r
+ p26,p27,p28,p29,p30,p31,p33,p37,p41,p45,p49,p50,p51\r
+ (p1) mov ret0=ar.k0 // ar0\r
+ (p2) mov ret0=ar.k1 // ar1\r
+ (p3) mov ret0=ar.k2 // ar2\r
+ (p4) mov ret0=ar.k3 // ar3\r
+ (p5) mov ret0=ar.k4 // ar4\r
+ (p6) mov ret0=ar.k5 // ar5\r
+ (p7) mov ret0=ar.k6 // ar6\r
+ (p8) mov ret0=ar.k7 // ar7\r
+\r
+ (p17) mov ret0=ar.rsc // ar16\r
+ (p18) mov ret0=ar.bsp // ar17\r
+ (p19) mov ret0=ar.bspstore // ar18\r
+ (p20) mov ret0=ar.rnat // ar19\r
+\r
+ (p22) mov ret0=ar.fcr // ar21 [iA32]\r
+\r
+ (p25) mov ret0=ar.eflag // ar24 [iA32]\r
+ (p26) mov ret0=ar.csd // ar25 [iA32]\r
+ (p27) mov ret0=ar.ssd // ar26 [iA32]\r
+ (p28) mov ret0=ar.cflg // ar27 [iA32]\r
+ (p29) mov ret0=ar.fsr // ar28 [iA32]\r
+ (p30) mov ret0=ar.fir // ar29 [iA32]\r
+ (p31) mov ret0=ar.fdr // ar30 [iA32]\r
+\r
+ (p33) mov ret0=ar.ccv // ar32\r
+\r
+ (p37) mov ret0=ar.unat // ar36\r
+\r
+ (p41) mov ret0=ar.fpsr // ar40\r
+\r
+ (p45) mov ret0=ar.itc // ar44\r
+\r
+ //\r
+ // This is the translated (-16) range.\r
+ //\r
+ (p49) mov ret0=ar.pfs // ar64\r
+ (p50) mov ret0=ar.lc // ar65\r
+ (p51) mov ret0=ar.ec // ar66\r
+\r
+ // Restore predicates and return.\r
+\r
+ mov pr=r14,-1\r
+ br.ret.sptk b0\r
+ .endp\r
+++ /dev/null
-/** @file\r
- Implementation of Control Register reading functions on Itanium platform.\r
-\r
- Copyright (c) 2008, Intel Corporation<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
-\r
-**/\r
-\r
-#include "BaseLibInternals.h"\r
-\r
-\r
-//\r
-// Loop up table for Index and corresponding control register access routines. \r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED REGISTER_ENTRY mControlRegisterAccessEntries[] = {\r
- {IPF_CONTROL_REGISTER_DCR, AsmReadControlRegisterDcr},\r
- {IPF_CONTROL_REGISTER_ITM, AsmReadControlRegisterItm},\r
- {IPF_CONTROL_REGISTER_IVA, AsmReadControlRegisterIva},\r
- {IPF_CONTROL_REGISTER_PTA, AsmReadControlRegisterPta},\r
- {IPF_CONTROL_REGISTER_IPSR, AsmReadControlRegisterIpsr},\r
- {IPF_CONTROL_REGISTER_ISR, AsmReadControlRegisterIsr},\r
- {IPF_CONTROL_REGISTER_IIP, AsmReadControlRegisterIip},\r
- {IPF_CONTROL_REGISTER_IFA, AsmReadControlRegisterIfa},\r
- {IPF_CONTROL_REGISTER_ITIR, AsmReadControlRegisterItir},\r
- {IPF_CONTROL_REGISTER_IIPA, AsmReadControlRegisterIipa},\r
- {IPF_CONTROL_REGISTER_IFS, AsmReadControlRegisterIfs},\r
- {IPF_CONTROL_REGISTER_IIM, AsmReadControlRegisterIim},\r
- {IPF_CONTROL_REGISTER_IHA, AsmReadControlRegisterIha},\r
- {IPF_CONTROL_REGISTER_LID, AsmReadControlRegisterLid},\r
- {IPF_CONTROL_REGISTER_IVR, AsmReadControlRegisterIvr},\r
- {IPF_CONTROL_REGISTER_TPR, AsmReadControlRegisterTpr},\r
- {IPF_CONTROL_REGISTER_EOI, AsmReadControlRegisterEoi},\r
- {IPF_CONTROL_REGISTER_IRR0, AsmReadControlRegisterIrr0},\r
- {IPF_CONTROL_REGISTER_IRR1, AsmReadControlRegisterIrr1},\r
- {IPF_CONTROL_REGISTER_IRR2, AsmReadControlRegisterIrr2},\r
- {IPF_CONTROL_REGISTER_IRR3, AsmReadControlRegisterIrr3},\r
- {IPF_CONTROL_REGISTER_ITV, AsmReadControlRegisterItv},\r
- {IPF_CONTROL_REGISTER_PMV, AsmReadControlRegisterPmv},\r
- {IPF_CONTROL_REGISTER_CMCV, AsmReadControlRegisterCmcv},\r
- {IPF_CONTROL_REGISTER_LRR0, AsmReadControlRegisterLrr0},\r
- {IPF_CONTROL_REGISTER_LRR1, AsmReadControlRegisterLrr1}\r
-};\r
-\r
-\r
-/**\r
- Reads a 64-bit control register.\r
-\r
- Reads and returns the control register specified by Index. The valid Index valued are defined\r
- above in "Related Definitions".\r
- If Index is invalid then 0xFFFFFFFFFFFFFFFF is returned. This function is only available on IPF.\r
-\r
- @param Index The index of the control register to read.\r
-\r
- @return The control register specified by Index.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmReadControlRegister (\r
- IN UINT64 Index\r
- )\r
-{\r
- UINTN Item;\r
-\r
- for (Item = 0; Item < sizeof (mControlRegisterAccessEntries) / sizeof (mControlRegisterAccessEntries[0]); Item++) {\r
- if (mControlRegisterAccessEntries[Item].Index == Index) {\r
- return mControlRegisterAccessEntries[Item].Function ();\r
- }\r
- }\r
-\r
- return 0xFFFFFFFFFFFFFFFF;\r
-}\r
///\r
\r
\r
-.text\r
-.type AsmReadControlRegisterDcr, @function\r
-.proc AsmReadControlRegisterDcr\r
-//\r
-// Reads control register DCR.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_DCR\r
-//\r
-// @return The 64-bit control register DCR.\r
-//\r
-AsmReadControlRegisterDcr::\r
- mov r8 = cr.dcr;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterDcr\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterItm, @function\r
-.proc AsmReadControlRegisterItm\r
-//\r
-// Reads control register ITM.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_ITM\r
-//\r
-// @return The 64-bit control register ITM.\r
-//\r
-AsmReadControlRegisterItm::\r
- mov r8 = cr.itm;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterItm\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterIva, @function\r
-.proc AsmReadControlRegisterIva\r
-//\r
-// Reads control register IVA.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_IVA\r
-//\r
-// @return The 64-bit control register IVA.\r
-//\r
-AsmReadControlRegisterIva::\r
- mov r8 = cr.iva;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterIva\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterPta, @function\r
-.proc AsmReadControlRegisterPta\r
-//\r
-// Reads control register PTA.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_PTA\r
-//\r
-// @return The 64-bit control register PTA.\r
-//\r
-AsmReadControlRegisterPta::\r
- mov r8 = cr.pta;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterPta\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterIpsr, @function\r
-.proc AsmReadControlRegisterIpsr\r
-//\r
-// Reads control register IPSR.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_IPSR\r
-//\r
-// @return The 64-bit control register IPSR.\r
-//\r
-AsmReadControlRegisterIpsr::\r
- mov r8 = cr.ipsr;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterIpsr\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterIsr, @function\r
-.proc AsmReadControlRegisterIsr\r
-//\r
-// Reads control register ISR.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_ISR\r
-//\r
-// @return The 64-bit control register ISR.\r
-//\r
-AsmReadControlRegisterIsr::\r
- mov r8 = cr.isr;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterIsr\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterIip, @function\r
-.proc AsmReadControlRegisterIip\r
-//\r
-// Reads control register IIP.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_IIP\r
-//\r
-// @return The 64-bit control register IIP.\r
-//\r
-AsmReadControlRegisterIip::\r
- mov r8 = cr.iip;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterIip\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterIfa, @function\r
-.proc AsmReadControlRegisterIfa\r
-//\r
-// Reads control register IFA.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_IFA\r
-//\r
-// @return The 64-bit control register IFA.\r
-//\r
-AsmReadControlRegisterIfa::\r
- mov r8 = cr.ifa;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterIfa\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterItir, @function\r
-.proc AsmReadControlRegisterItir\r
-//\r
-// Reads control register ITIR.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_ITIR\r
-//\r
-// @return The 64-bit control register ITIR.\r
-//\r
-AsmReadControlRegisterItir::\r
- mov r8 = cr.itir;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterItir\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterIipa, @function\r
-.proc AsmReadControlRegisterIipa\r
-//\r
-// Reads control register IIPA.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_IIPA\r
-//\r
-// @return The 64-bit control register IIPA.\r
-//\r
-AsmReadControlRegisterIipa::\r
- mov r8 = cr.iipa;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterIipa\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterIfs, @function\r
-.proc AsmReadControlRegisterIfs\r
-//\r
-// Reads control register IFS.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_IFS\r
-//\r
-// @return The 64-bit control register IFS.\r
-//\r
-AsmReadControlRegisterIfs::\r
- mov r8 = cr.ifs;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterIfs\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterIim, @function\r
-.proc AsmReadControlRegisterIim\r
-//\r
-// Reads control register IIM.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_IIM\r
-//\r
-// @return The 64-bit control register IIM.\r
-//\r
-AsmReadControlRegisterIim::\r
- mov r8 = cr.iim;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterIim\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterIha, @function\r
-.proc AsmReadControlRegisterIha\r
-//\r
-// Reads control register IHA.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_IHA\r
-//\r
-// @return The 64-bit control register IHA.\r
-//\r
-AsmReadControlRegisterIha::\r
- mov r8 = cr.iha;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterIha\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterLid, @function\r
-.proc AsmReadControlRegisterLid\r
-//\r
-// Reads control register LID.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_LID\r
-//\r
-// @return The 64-bit control register LID.\r
-//\r
-AsmReadControlRegisterLid::\r
- mov r8 = cr.lid;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterLid\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterIvr, @function\r
-.proc AsmReadControlRegisterIvr\r
-//\r
-// Reads control register IVR.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_IVR\r
-//\r
-// @return The 64-bit control register IVR.\r
-//\r
-AsmReadControlRegisterIvr::\r
- mov r8 = cr.ivr;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterIvr\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterTpr, @function\r
-.proc AsmReadControlRegisterTpr\r
-//\r
-// Reads control register TPR.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_TPR\r
-//\r
-// @return The 64-bit control register TPR.\r
-//\r
-AsmReadControlRegisterTpr::\r
- mov r8 = cr.tpr;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterTpr\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterEoi, @function\r
-.proc AsmReadControlRegisterEoi\r
-//\r
-// Reads control register EOI.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_EOI\r
-//\r
-// @return The 64-bit control register EOI.\r
-//\r
-AsmReadControlRegisterEoi::\r
- mov r8 = cr.eoi;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterEoi\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterIrr0, @function\r
-.proc AsmReadControlRegisterIrr0\r
-//\r
-// Reads control register IRR0.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_IRR0\r
-//\r
-// @return The 64-bit control register IRR0.\r
-//\r
-AsmReadControlRegisterIrr0::\r
- mov r8 = cr.irr0;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterIrr0\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterIrr1, @function\r
-.proc AsmReadControlRegisterIrr1\r
-//\r
-// Reads control register IRR1.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_IRR1\r
-//\r
-// @return The 64-bit control register IRR1.\r
-//\r
-AsmReadControlRegisterIrr1::\r
- mov r8 = cr.irr1;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterIrr1\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterIrr2, @function\r
-.proc AsmReadControlRegisterIrr2\r
-//\r
-// Reads control register IRR2.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_IRR2\r
-//\r
-// @return The 64-bit control register IRR2.\r
-//\r
-AsmReadControlRegisterIrr2::\r
- mov r8 = cr.irr2;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterIrr2\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterIrr3, @function\r
-.proc AsmReadControlRegisterIrr3\r
-//\r
-// Reads control register IRR3.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_IRR3\r
-//\r
-// @return The 64-bit control register IRR3.\r
-//\r
-AsmReadControlRegisterIrr3::\r
- mov r8 = cr.irr3;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterIrr3\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterItv, @function\r
-.proc AsmReadControlRegisterItv\r
-//\r
-// Reads control register ITV.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_ITV\r
-//\r
-// @return The 64-bit control register ITV.\r
-//\r
-AsmReadControlRegisterItv::\r
- mov r8 = cr.itv;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterItv\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterPmv, @function\r
-.proc AsmReadControlRegisterPmv\r
-//\r
-// Reads control register PMV.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_PMV\r
-//\r
-// @return The 64-bit control register PMV.\r
-//\r
-AsmReadControlRegisterPmv::\r
- mov r8 = cr.pmv;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterPmv\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterCmcv, @function\r
-.proc AsmReadControlRegisterCmcv\r
-//\r
-// Reads control register CMCV.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_CMCV\r
-//\r
-// @return The 64-bit control register CMCV.\r
-//\r
-AsmReadControlRegisterCmcv::\r
- mov r8 = cr.cmcv;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterCmcv\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterLrr0, @function\r
-.proc AsmReadControlRegisterLrr0\r
-//\r
-// Reads control register LRR0.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_LRR0\r
-//\r
-// @return The 64-bit control register LRR0.\r
-//\r
-AsmReadControlRegisterLrr0::\r
- mov r8 = cr.lrr0;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterLrr0\r
-\r
-\r
-\r
-.text\r
-.type AsmReadControlRegisterLrr1, @function\r
-.proc AsmReadControlRegisterLrr1\r
-//\r
-// Reads control register LRR1.\r
-//\r
-// This is a worker function for AsmReadControlRegister()\r
-// when its parameter Index is IPF_CONTROL_REGISTER_LRR1\r
-//\r
-// @return The 64-bit control register LRR1.\r
-//\r
-AsmReadControlRegisterLrr1::\r
- mov r8 = cr.lrr1;;\r
- br.ret.dpnt b0;;\r
-.endp AsmReadControlRegisterLrr1\r
\r
+//---------------------------------------------------------------------------------\r
+//++\r
+// AsmReadControlRegister\r
+//\r
+// Reads a 64-bit control register.\r
+//\r
+// Reads and returns the control register specified by Index.\r
+// If Index is invalid then 0xFFFFFFFFFFFFFFFF is returned. This function is only available on IPF.\r
+//\r
+// Arguments :\r
+//\r
+// On Entry : The index of the control register to read.\r
+//\r
+// Return Value: The control register specified by Index.\r
+//\r
+//--\r
+//----------------------------------------------------------------------------------\r
+.text\r
+.type AsmReadControlRegister, @function\r
+.proc AsmReadControlRegister\r
+.regstk 1, 0, 0, 0\r
+\r
+AsmReadControlRegister::\r
+ //\r
+ // CRs are defined in the ranges 0-25 and 64-81 (with some holes).\r
+ // Compact this list by subtracting 32 from the top range.\r
+ // 0-25, 64-81 -> 0-25, 32-49\r
+ //\r
+ mov r15=2\r
+ mov r14=pr // save predicates\r
+ cmp.leu p6,p7=64,in0 // p6 = CR# >= 64\r
+ ;;\r
+ (p7) cmp.leu p7,p0=32,in0 // p7 = 32 <= CR# < 64\r
+ (p6) add in0=-32,in0 // if (CR >= 64) CR# -= 32\r
+ ;;\r
+ (p7) mov r15=0 // if bad range (32-63)\r
+ ;;\r
+ mov ret0=-1 // in case of illegal CR #\r
+ shl r15=r15,in0 // r15 = 0x2 << CR#\r
+ ;;\r
+ mov pr=r15,-1\r
+ ;;\r
+\r
+ //\r
+ // At this point the predicates contain a bit field of the\r
+ // CR desired. (The bit is the CR+1, since pr0 is always 1.)\r
+ //\r
+ .pred.rel "mutex",p1,p2,p3,p9,p17,p18,p20,p21,p22,p23,p24,p25,p26,\\r
+ p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p49,p50\r
+ (p1) mov ret0=cr.dcr // cr0\r
+ (p2) mov ret0=cr.itm // cr1\r
+ (p3) mov ret0=cr.iva // cr2\r
+ (p9) mov ret0=cr.pta // cr8\r
+ (p17) mov ret0=cr.ipsr // cr16\r
+ (p18) mov ret0=cr.isr // cr17\r
+ (p20) mov ret0=cr.iip // cr19\r
+ (p21) mov ret0=cr.ifa // cr20\r
+ (p22) mov ret0=cr.itir // cr21\r
+ (p23) mov ret0=cr.iipa // cr22\r
+ (p24) mov ret0=cr.ifs // cr23\r
+ (p25) mov ret0=cr.iim // cr24\r
+ (p26) mov ret0=cr.iha // cr25\r
+\r
+ // This is the translated (-32) range.\r
+\r
+ (p33) mov ret0=cr.lid // cr64\r
+ (p34) mov ret0=cr.ivr // cr65\r
+ (p35) mov ret0=cr.tpr // cr66\r
+ (p36) mov ret0=cr.eoi // cr67\r
+ (p37) mov ret0=cr.irr0 // cr68\r
+ (p38) mov ret0=cr.irr1 // cr69\r
+ (p39) mov ret0=cr.irr2 // cr70\r
+ (p40) mov ret0=cr.irr3 // cr71\r
+ (p41) mov ret0=cr.itv // cr72\r
+ (p42) mov ret0=cr.pmv // cr73\r
+ (p43) mov ret0=cr.cmcv // cr74\r
+ (p49) mov ret0=cr.lrr0 // cr80\r
+ (p50) mov ret0=cr.lrr1 // cr81\r
+ \r
+ //\r
+ // Restore predicates and return.\r
+ //\r
+ mov pr=r14,-1\r
+ br.ret.sptk b0\r
+ .endp\r