Home | History | Annotate | Download | only in Ipf
      1 /// @file
      2 ///  IPF specific control register reading functions
      3 ///
      4 /// Copyright (c) 2008, Intel Corporation. All rights reserved.<BR>
      5 /// This program and the accompanying materials
      6 /// are licensed and made available under the terms and conditions of the BSD License
      7 /// which accompanies this distribution.  The full text of the license may be found at
      8 /// http://opensource.org/licenses/bsd-license.php.
      9 ///
     10 /// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 /// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 ///
     13 ///
     14 ///
     15 
     16 
     17 
     18 //---------------------------------------------------------------------------------
     19 //++
     20 // AsmReadControlRegister
     21 //
     22 // Reads a 64-bit control register.
     23 //
     24 // Reads and returns the control register specified by Index.
     25 // If Index is invalid then 0xFFFFFFFFFFFFFFFF is returned.  This function is only available on IPF.
     26 //
     27 // Arguments :
     28 //
     29 // On Entry : The index of the control register to read.
     30 //
     31 // Return Value: The control register specified by Index.
     32 //
     33 //--
     34 //----------------------------------------------------------------------------------
     35 .text
     36 .type   AsmReadControlRegister, @function
     37 .proc   AsmReadControlRegister
     38 .regstk 1, 0, 0, 0
     39 
     40 AsmReadControlRegister::
     41   //
     42   // CRs are defined in the ranges 0-25 and 64-81 (with some holes).
     43   // Compact this list by subtracting 32 from the top range.
     44   // 0-25, 64-81 -> 0-25, 32-49
     45   //
     46   mov  r15=2
     47   mov  r14=pr                    // save predicates
     48   cmp.leu  p6,p7=64,in0          // p6 = CR# >= 64
     49   ;;
     50   (p7)  cmp.leu  p7,p0=32,in0    // p7 = 32 <= CR# < 64
     51   (p6)  add  in0=-32,in0         // if (CR >= 64) CR# -= 32
     52   ;;
     53   (p7)  mov  r15=0               // if bad range (32-63)
     54   ;;
     55   mov  ret0=-1                   // in case of illegal CR #
     56   shl  r15=r15,in0               // r15 = 0x2 << CR#
     57   ;;
     58   mov  pr=r15,-1
     59   ;;
     60 
     61   //
     62   // At this point the predicates contain a bit field of the
     63   // CR desired.  (The bit is the CR+1, since pr0 is always 1.)
     64   //
     65   .pred.rel "mutex",p1,p2,p3,p9,p17,p18,p20,p21,p22,p23,p24,p25,p26,\
     66     p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p49,p50
     67   (p1)  mov  ret0=cr.dcr        // cr0
     68   (p2)  mov  ret0=cr.itm        // cr1
     69   (p3)  mov  ret0=cr.iva        // cr2
     70   (p9)  mov  ret0=cr.pta        // cr8
     71   (p17)  mov  ret0=cr.ipsr      // cr16
     72   (p18)  mov  ret0=cr.isr       // cr17
     73   (p20)  mov  ret0=cr.iip       // cr19
     74   (p21)  mov  ret0=cr.ifa       // cr20
     75   (p22)  mov  ret0=cr.itir      // cr21
     76   (p23)  mov  ret0=cr.iipa      // cr22
     77   (p24)  mov  ret0=cr.ifs       // cr23
     78   (p25)  mov  ret0=cr.iim       // cr24
     79   (p26)  mov  ret0=cr.iha       // cr25
     80 
     81   // This is the translated (-32) range.
     82 
     83   (p33)  mov  ret0=cr.lid       // cr64
     84   (p34)  mov  ret0=cr.ivr       // cr65
     85   (p35)  mov  ret0=cr.tpr       // cr66
     86   (p36)  mov  ret0=cr.eoi       // cr67
     87   (p37)  mov  ret0=cr.irr0      // cr68
     88   (p38)  mov  ret0=cr.irr1      // cr69
     89   (p39)  mov  ret0=cr.irr2      // cr70
     90   (p40)  mov  ret0=cr.irr3      // cr71
     91   (p41)  mov  ret0=cr.itv       // cr72
     92   (p42)  mov  ret0=cr.pmv       // cr73
     93   (p43)  mov  ret0=cr.cmcv      // cr74
     94   (p49)  mov  ret0=cr.lrr0      // cr80
     95   (p50)  mov  ret0=cr.lrr1      // cr81
     96 
     97   //
     98   // Restore predicates and return.
     99   //
    100   mov  pr=r14,-1
    101   br.ret.sptk  b0
    102   .endp
    103