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