]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1. Simplify the implementation of AsmReadApplicationRegister() & AsmReadControlRegist...
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 15 Dec 2008 15:51:43 +0000 (15:51 +0000)
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 15 Dec 2008 15:51:43 +0000 (15:51 +0000)
2. Add AsmReadMsr() & AsmWriteMsr() for IPF architecture
3. update AsmCpuMisc.s to only support GCC tool chain to avoid symbol collision.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7034 6f19259b-4bc3-4df7-8a09-765794883524

MdePkg/Include/Library/BaseLib.h
MdePkg/Library/BaseLib/BaseLib.inf
MdePkg/Library/BaseLib/Ipf/AccessMsr.s [new file with mode: 0644]
MdePkg/Library/BaseLib/Ipf/ReadApplicationRegister.c [deleted file]
MdePkg/Library/BaseLib/Ipf/ReadAr.s
MdePkg/Library/BaseLib/Ipf/ReadControlRegister.c [deleted file]
MdePkg/Library/BaseLib/Ipf/ReadCr.s

index ca90c0323b9b47975c1b93aa594db016b1cf104e..72ac6f47ed99e356baedd30a6743e6571fbd3a5c 100644 (file)
@@ -4897,6 +4897,50 @@ AsmReadApplicationRegister (
   );\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
index 3a38f2ba1cac3360a27a857d4a5eb58382718f11..519dea10e3cd185f02b41a580ac2f0d9fc356c57 100644 (file)
   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
diff --git a/MdePkg/Library/BaseLib/Ipf/AccessMsr.s b/MdePkg/Library/BaseLib/Ipf/AccessMsr.s
new file mode 100644 (file)
index 0000000..bb8ae34
--- /dev/null
@@ -0,0 +1,79 @@
+/// @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
diff --git a/MdePkg/Library/BaseLib/Ipf/ReadApplicationRegister.c b/MdePkg/Library/BaseLib/Ipf/ReadApplicationRegister.c
deleted file mode 100644 (file)
index 818e6ac..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/** @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
index 56225269ad3dd5fb10a81d92c66b004873ffc245..9f3176bce3169ad4d8d320923edffab686db84f6 100644 (file)
 \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
diff --git a/MdePkg/Library/BaseLib/Ipf/ReadControlRegister.c b/MdePkg/Library/BaseLib/Ipf/ReadControlRegister.c
deleted file mode 100644 (file)
index a3a8e11..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/** @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
index 839ea6fb34613a829d9321f6b8edf4fb3bdeeb97..fe5d80dcbdc69d778552793b8a6c12c763ec7f28 100644 (file)
 ///\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