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