]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Library/BaseLib/Ipf/ReadCr.s
Update the copyright notice format
[mirror_edk2.git] / MdePkg / Library / BaseLib / Ipf / ReadCr.s
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