/// @file
///  IPF specific Global Control Registers accessing functions
///
/// Copyright (c) 2006 - 2008, 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: AccessGcr.s
///
///

//---------------------------------------------------------------------------------
//++
// AsmReadDcr
//
// This routine is used to Read the value of Default Control Register (DCR).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of DCR.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadDcr, @function
.proc   AsmReadDcr

AsmReadDcr::
         mov            r8 = cr.dcr;;
         br.ret.dpnt    b0;;
.endp    AsmReadDcr

//---------------------------------------------------------------------------------
//++
// AsmWriteDcr
//
// This routine is used to write the value to Default Control Register (DCR).
//
// Arguments :
//
// On Entry : The value need to be written to DCR
//
// Return Value: The value written to DCR.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmWriteDcr, @function
.proc   AsmWriteDcr
.regstk 1, 0, 0, 0

AsmWriteDcr::
         mov            cr.dcr = in0
         mov            r8 = in0;;
         srlz.i;;
         srlz.d;;
         br.ret.dpnt    b0;;
.endp    AsmWriteDcr


//---------------------------------------------------------------------------------
//++
// AsmReadItc
//
// This routine is used to Read the value of Interval Timer Counter Register (ITC).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of ITC.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadItc, @function
.proc   AsmReadItc

AsmReadItc::
         mov            r8 = ar.itc;;
         br.ret.dpnt    b0;;
.endp    AsmReadItc

//---------------------------------------------------------------------------------
//++
// AsmWriteItc
//
// This routine is used to write the value to Interval Timer Counter Register (ITC).
//
// Arguments :
//
// On Entry : The value need to be written to the ITC
//
// Return Value: The value written to the ITC.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmWriteItc, @function
.proc   AsmWriteItc
.regstk 1, 0, 0, 0

AsmWriteItc::
         mov            ar.itc = in0
         mov            r8 = in0;;
         br.ret.dpnt    b0;;
.endp    AsmWriteItc


//---------------------------------------------------------------------------------
//++
// AsmReadItm
//
// This routine is used to Read the value of Interval Timer Match Register (ITM).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of ITM.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadItm, @function
.proc   AsmReadItm

AsmReadItm::
         mov            r8 = cr.itm;;
         br.ret.dpnt    b0;;
.endp    AsmReadItm

//---------------------------------------------------------------------------------
//++
// AsmWriteItm
//
// This routine is used to write the value to Interval Timer Match Register (ITM).
//
// Arguments :
//
// On Entry : The value need to be written to ITM
//
// Return Value: The value written to ITM.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmWriteItm, @function
.proc   AsmWriteItm
.regstk 1, 0, 0, 0

AsmWriteItm::
         mov            cr.itm = in0
         mov            r8 = in0;;
         srlz.d;
         br.ret.dpnt    b0;;
.endp    AsmWriteItm


//---------------------------------------------------------------------------------
//++
// AsmReadIva
//
// This routine is used to read the value of Interruption Vector Address Register (IVA).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of IVA.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadIva, @function
.proc   AsmReadIva

AsmReadIva::
         mov            r8 = cr.iva;;
         br.ret.dpnt    b0;;
.endp    AsmReadIva

//---------------------------------------------------------------------------------
//++
// AsmWriteIva
//
// This routine is used to write the value to Interruption Vector Address Register (IVA).
//
// Arguments :
//
// On Entry : The value need to be written to IVA
//
// Return Value: The value written to IVA.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmWriteIva, @function
.proc   AsmWriteIva
.regstk 1, 3, 0, 0

AsmWriteIva::
        alloc loc1=ar.pfs,1,4,0,0 ;;

        mov         loc2 = psr
        rsm         0x6000                      // Make sure interrupts are masked

        mov            cr.iva = in0
        srlz.i;;
        mov         psr.l = loc2;;
        srlz.i;;
        srlz.d;;
        mov ar.pfs=loc1 ;;
        mov            r8 = in0;;
        br.ret.dpnt    b0;;
.endp   AsmWriteIva


//---------------------------------------------------------------------------------
//++
// AsmReadPta
//
// This routine is used to read the value of Page Table Address Register (PTA).
//
// Arguments :
//
// On Entry :
//
// Return Value: The current value of PTA.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmReadPta, @function
.proc   AsmReadPta

AsmReadPta::
         mov            r8 = cr.pta;;
         br.ret.dpnt    b0;;
.endp    AsmReadPta

//---------------------------------------------------------------------------------
//++
// AsmWritePta
//
// This routine is used to write the value to Page Table Address Register (PTA)).
//
// Arguments :
//
// On Entry : The value need to be written to PTA
//
// Return Value: The value written to PTA.
//
//--
//----------------------------------------------------------------------------------
.text
.type   AsmWritePta, @function
.proc   AsmWritePta
.regstk 1, 0, 0, 0

AsmWritePta::
         mov            cr.pta = in0
         mov            r8 = in0;;
         srlz.i;;
         srlz.d;;
         br.ret.dpnt    b0;;
.endp    AsmWritePta
