Home | History | Annotate | Download | only in Ipf
      1 /// @file
      2 ///  IPF specific Processor Status Register accessing functions
      3 ///
      4 /// Copyright (c) 2006 - 2010, 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 /// Module Name: AccessPsr.s
     14 ///
     15 ///
     16 
     17 #define CpuModeMask           0x0000001008020000
     18 
     19 #define CpuInVirtualMode             0x1
     20 #define CpuInPhysicalMode            0x0
     21 #define CpuInMixMode                 (0x0 - 0x1)
     22 
     23 //---------------------------------------------------------------------------------
     24 //++
     25 // AsmReadPsr
     26 //
     27 // This routine is used to read the current value of Processor Status Register (PSR).
     28 //
     29 // Arguments :
     30 //
     31 // On Entry :
     32 //
     33 // Return Value: The current PSR value.
     34 //
     35 //--
     36 //----------------------------------------------------------------------------------
     37 .text
     38 .type   AsmReadPsr, @function
     39 .proc   AsmReadPsr
     40 
     41 AsmReadPsr::
     42         mov             r8 = psr;;
     43         br.ret.dpnt     b0;;
     44 .endp   AsmReadPsr
     45 
     46 //---------------------------------------------------------------------------------
     47 //++
     48 // AsmWritePsr
     49 //
     50 // This routine is used to write the value of Processor Status Register (PSR).
     51 //
     52 // Arguments :
     53 //
     54 // On Entry : The value need to be written.
     55 //
     56 // Return Value: The value have been written.
     57 //
     58 //--
     59 //----------------------------------------------------------------------------------
     60 .text
     61 .type   AsmWritePsr, @function
     62 .proc   AsmWritePsr
     63 .regstk 1, 0, 0, 0
     64 
     65 AsmWritePsr::
     66         mov             psr.l = in0
     67         mov             r8 = in0;;
     68         srlz.d;;
     69         srlz.i;;
     70         br.ret.dpnt     b0;;
     71 .endp   AsmWritePsr
     72 
     73 //---------------------------------------------------------------------------------
     74 //++
     75 // AsmCpuVirtual
     76 //
     77 // This routine is used to determines if the CPU is currently executing
     78 // in virtual, physical, or mixed mode.
     79 //
     80 // If the CPU is in virtual mode(PSR.RT=1, PSR.DT=1, PSR.IT=1), then 1 is returned.
     81 // If the CPU is in physical mode(PSR.RT=0, PSR.DT=0, PSR.IT=0), then 0 is returned.
     82 // If the CPU is not in physical mode or virtual mode, then it is in mixed mode,
     83 // and -1 is returned.
     84 //
     85 // Arguments:
     86 //
     87 // On Entry: None
     88 //
     89 // Return Value: The CPU mode flag
     90 //               return  1  The CPU is in virtual mode.
     91 //               return  0  The CPU is in physical mode.
     92 //               return -1  The CPU is in mixed mode.
     93 //
     94 //--
     95 //----------------------------------------------------------------------------------
     96 .text
     97 .type   AsmCpuVirtual, @function
     98 .proc   AsmCpuVirtual
     99 
    100 AsmCpuVirtual::
    101         mov            r29 = psr
    102         movl           r30 = CpuModeMask;;
    103         and            r28 = r30, r29;;
    104         cmp.eq         p6, p7 = r30, r28;;
    105 (p6)    mov            r8 = CpuInVirtualMode;;
    106 (p6)    br.ret.dpnt    b0;;
    107 (p7)    cmp.eq         p6, p7 = 0x0, r28;;
    108 (p6)    mov            r8 = CpuInPhysicalMode;;
    109 (p7)    mov            r8 = CpuInMixMode;;
    110         br.ret.dpnt    b0;;
    111 .endp   AsmCpuVirtual
    112