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
40AsmReadControlRegister::
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