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
This commit is contained in:
qhuang8 2008-12-15 15:51:43 +00:00
parent 43a99f081e
commit 59e0bb0cbd
7 changed files with 301 additions and 1108 deletions

View File

@ -4897,6 +4897,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.

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -15,487 +15,95 @@
//---------------------------------------------------------------------------------
//++
// 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 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
.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

View File

@ -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;
}

View File

@ -14,469 +14,89 @@
///
//---------------------------------------------------------------------------------
//++
// 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 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
.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