/// @file
///  IPF specific External Interrupt Control Registers accessing functions
///
/// Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
/// 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.
///
/// Module Name: AccessEicr.s
///
///

//---------------------------------------------------------------------------------
//++
// AsmReadLid
//
// This routine is used to read the value of Local Interrupt ID Register (LID).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of LID.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadLid, @function
.proc   AsmReadLid

AsmReadLid::
         mov            r8 = cr.lid;;
         srlz.d;;
         br.ret.dpnt    b0;;
.endp    AsmReadLid

//---------------------------------------------------------------------------------
//++
// AsmWriteLid
//
// This routine is used to write the value to Local Interrupt ID Register (LID).
//
// Arguments :
//
// On Entry :  The value need to be written to LID.
//
// Return Value: The value written to LID.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmWriteLid, @function
.proc   AsmWriteLid
.regstk 1, 0, 0, 0

AsmWriteLid::
         mov            cr.lid = in0
         mov            r8 = in0;;
         srlz.d;;
         br.ret.dpnt    b0;;
.endp    AsmWriteLid


//---------------------------------------------------------------------------------
//++
// AsmReadIvr
//
// This routine is used to read the value of External Interrupt Vector Register (IVR).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of IVR.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadIvr, @function
.proc   AsmReadIvr

AsmReadIvr::
         mov            r8 = cr.ivr;;
         srlz.d;;
         br.ret.dpnt    b0;;
.endp    AsmReadIvr


//---------------------------------------------------------------------------------
//++
// AsmReadTpr
//
// This routine is used to read the value of Task Priority Register (TPR).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of TPR.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadTpr, @function
.proc   AsmReadTpr

AsmReadTpr::
         mov            r8 = cr.tpr;;
         br.ret.dpnt    b0;;
.endp    AsmReadTpr

//---------------------------------------------------------------------------------
//++
// AsmWriteTpr
//
// This routine is used to write the value to Task Priority Register (TPR).
//
// Arguments :
//
// On Entry :  The value need to be written to TPR.
//
// Return Value: The value written to TPR.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmWriteTpr, @function
.proc   AsmWriteTpr
.regstk 1, 0, 0, 0

AsmWriteTpr::
         mov            cr.tpr = in0
         mov            r8 = in0;;
         srlz.d;;
         br.ret.dpnt    b0;;
.endp    AsmWriteTpr


//---------------------------------------------------------------------------------
//++
// AsmWriteEoi
//
// This routine is used to write the value to End of External Interrupt Register (EOI).
//
// Arguments :
//
// On Entry :  The value need to be written to EOI.
//
// Return Value: The value written to EOI.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmWriteEoi, @function
.proc   AsmWriteEoi

AsmWriteEoi::
         mov            cr.eoi = r0;;
         srlz.d;;
         br.ret.dpnt    b0;;
.endp    AsmWriteEoi


//---------------------------------------------------------------------------------
//++
// AsmReadIrr0
//
// This routine is used to Read the value of External Interrupt Request Register 0 (IRR0).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of IRR0.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadIrr0, @function
.proc   AsmReadIrr0

AsmReadIrr0::
         mov            r8 = cr.irr0;;
         br.ret.dpnt    b0;;
.endp    AsmReadIrr0


//---------------------------------------------------------------------------------
//++
// AsmReadIrr1
//
// This routine is used to Read the value of External Interrupt Request Register 1 (IRR1).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of IRR1.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadIrr1, @function
.proc   AsmReadIrr1

AsmReadIrr1::
         mov            r8 = cr.irr1;;
         br.ret.dpnt    b0;;
.endp    AsmReadIrr1


//---------------------------------------------------------------------------------
//++
// AsmReadIrr2
//
// This routine is used to Read the value of External Interrupt Request Register 2 (IRR2).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of IRR2.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadIrr2, @function
.proc   AsmReadIrr2

AsmReadIrr2::
         mov            r8 = cr.irr2;;
         br.ret.dpnt    b0;;
.endp    AsmReadIrr2


//---------------------------------------------------------------------------------
//++
// AsmReadIrr3
//
// This routine is used to Read the value of External Interrupt Request Register 3 (IRR3).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of IRR3.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadIrr3, @function
.proc   AsmReadIrr3

AsmReadIrr3::
         mov            r8 = cr.irr3;;
         br.ret.dpnt    b0;;
.endp    AsmReadIrr3


//---------------------------------------------------------------------------------
//++
// AsmReadItv
//
// This routine is used to Read the value of Interval Timer Vector Register (ITV).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of ITV.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadItv, @function
.proc   AsmReadItv

AsmReadItv::
         mov            r8 = cr.itv;;
         br.ret.dpnt    b0;;
.endp    AsmReadItv

//---------------------------------------------------------------------------------
//++
// AsmWriteItv
//
// This routine is used to write the value to Interval Timer Vector Register (ITV).
//
// Arguments :
//
// On Entry : The value need to be written to ITV
//
// Return Value: The value written to ITV.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmWriteItv, @function
.proc   AsmWriteItv
.regstk 1, 0, 0, 0

AsmWriteItv::
         mov            cr.itv = in0
         mov            r8 = in0;;
         srlz.d;;
         br.ret.dpnt    b0;;
.endp    AsmWriteItv


//---------------------------------------------------------------------------------
//++
// AsmReadPmv
//
// This routine is used to Read the value of Performance Monitoring Vector Register (PMV).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of PMV.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadPmv, @function
.proc   AsmReadPmv

AsmReadPmv::
         mov            r8 = cr.pmv;;
         br.ret.dpnt    b0;;
.endp    AsmReadPmv

//---------------------------------------------------------------------------------
//++
// AsmWritePmv
//
// This routine is used to write the value to Performance Monitoring Vector Register (PMV).
//
// Arguments :
//
// On Entry : The value need to be written to PMV
//
// Return Value: The value written to PMV.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmWritePmv, @function
.proc   AsmWritePmv
.regstk 1, 0, 0, 0

AsmWritePmv::
         mov            cr.pmv = in0
         mov            r8 = in0;;
         srlz.d;;
         br.ret.dpnt    b0;;
.endp    AsmWritePmv


//---------------------------------------------------------------------------------
//++
// AsmReadCmcv
//
// This routine is used to Read the value of Corrected Machine Check Vector Register (CMCV).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of CMCV.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadCmcv, @function
.proc   AsmReadCmcv

AsmReadCmcv::
         mov            r8 = cr.cmcv;;
         br.ret.dpnt    b0;;
.endp    AsmReadCmcv

//---------------------------------------------------------------------------------
//++
// AsmWriteCmcv
//
// This routine is used to write the value to Corrected Machine Check Vector Register (CMCV).
//
// Arguments :
//
// On Entry : The value need to be written to CMCV
//
// Return Value: The value written to CMCV.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmWriteCmcv, @function
.proc   AsmWriteCmcv
.regstk 1, 0, 0, 0

AsmWriteCmcv::
         mov            cr.cmcv = in0
         mov            r8 = in0;;
         srlz.d;;
         br.ret.dpnt    b0;;
.endp    AsmWriteCmcv


//---------------------------------------------------------------------------------
//++
// AsmReadLrr0
//
// This routine is used to read the value of Local Redirection Register 0 (LRR0).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of LRR0.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadLrr0, @function
.proc   AsmReadLrr0

AsmReadLrr0::
         mov            r8 = cr.lrr0;;
         br.ret.dpnt    b0;;
.endp    AsmReadLrr0

//---------------------------------------------------------------------------------
//++
// AsmWriteLrr0
//
// This routine is used to write the value to Local Redirection Register 0 (LRR0).
//
// Arguments :
//
// On Entry :  The value need to be written to LRR0.
//
// Return Value: The value written to LRR0.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmWriteLrr0, @function
.proc   AsmWriteLrr0
.regstk 1, 0, 0, 0

AsmWriteLrr0::
         mov            cr.lrr0 = in0
         mov            r8 = in0;;
         srlz.d;;
         br.ret.dpnt    b0;;
.endp    AsmWriteLrr0


//---------------------------------------------------------------------------------
//++
// AsmReadLrr1
//
// This routine is used to read the value of Local Redirection Register 1 (LRR1).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of LRR1.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadLrr1, @function
.proc   AsmReadLrr1

AsmReadLrr1::
         mov            r8 = cr.lrr1;;
         br.ret.dpnt    b0;;
.endp    AsmReadLrr1

//---------------------------------------------------------------------------------
//++
// AsmWriteLrr1
//
// This routine is used to write the value to Local Redirection Register 1 (LRR1).
//
// Arguments :
//
// On Entry :  The value need to be written to LRR1.
//
// Return Value: The value written to LRR1.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmWriteLrr1, @function
.proc   AsmWriteLrr1
.regstk 1, 0, 0, 0

AsmWriteLrr1::
         mov            cr.lrr1 = in0
         mov            r8 = in0;;
         srlz.d;;
         br.ret.dpnt    b0;;
.endp    AsmWriteLrr1