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