Home | History | Annotate | Download | only in AArch64
      1 #------------------------------------------------------------------------------
      2 #
      3 # Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
      4 # Copyright (c) 2011 - 2014, ARM Limited. All rights reserved.
      5 #
      6 # This program and the accompanying materials
      7 # are licensed and made available under the terms and conditions of the BSD License
      8 # which accompanies this distribution.  The full text of the license may be found at
      9 # http://opensource.org/licenses/bsd-license.php
     10 #
     11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 #
     14 #------------------------------------------------------------------------------
     15 
     16 #include <AsmMacroIoLibV8.h>
     17 
     18 .text
     19 .align 3
     20 GCC_ASM_EXPORT (ArmReadMidr)
     21 GCC_ASM_EXPORT (ArmCacheInfo)
     22 GCC_ASM_EXPORT (ArmGetInterruptState)
     23 GCC_ASM_EXPORT (ArmGetFiqState)
     24 GCC_ASM_EXPORT (ArmGetTTBR0BaseAddress)
     25 GCC_ASM_EXPORT (ArmSetTTBR0)
     26 GCC_ASM_EXPORT (ArmGetTCR)
     27 GCC_ASM_EXPORT (ArmSetTCR)
     28 GCC_ASM_EXPORT (ArmGetMAIR)
     29 GCC_ASM_EXPORT (ArmSetMAIR)
     30 GCC_ASM_EXPORT (ArmWriteCpacr)
     31 GCC_ASM_EXPORT (ArmWriteAuxCr)
     32 GCC_ASM_EXPORT (ArmReadAuxCr)
     33 GCC_ASM_EXPORT (ArmInvalidateTlb)
     34 GCC_ASM_EXPORT (ArmUpdateTranslationTableEntry)
     35 GCC_ASM_EXPORT (ArmWriteCptr)
     36 GCC_ASM_EXPORT (ArmWriteScr)
     37 GCC_ASM_EXPORT (ArmWriteMVBar)
     38 GCC_ASM_EXPORT (ArmCallWFE)
     39 GCC_ASM_EXPORT (ArmCallSEV)
     40 GCC_ASM_EXPORT (ArmReadCpuActlr)
     41 GCC_ASM_EXPORT (ArmWriteCpuActlr)
     42 
     43 #------------------------------------------------------------------------------
     44 
     45 .set DAIF_FIQ_BIT,   (1 << 0)
     46 .set DAIF_IRQ_BIT,   (1 << 1)
     47 
     48 ASM_PFX(ArmReadMidr):
     49   mrs     x0, midr_el1        // Read from Main ID Register (MIDR)
     50   ret
     51 
     52 ASM_PFX(ArmCacheInfo):
     53   mrs     x0, ctr_el0         // Read from Cache Type Regiter (CTR)
     54   ret
     55 
     56 ASM_PFX(ArmGetInterruptState):
     57   mrs     x0, daif
     58   tst     w0, #DAIF_IRQ_BIT   // Check if IRQ is enabled. Enabled if 0.
     59   mov     w0, #0
     60   mov     w1, #1
     61   csel    w0, w1, w0, ne
     62   ret
     63 
     64 ASM_PFX(ArmGetFiqState):
     65   mrs     x0, daif
     66   tst     w0, #DAIF_FIQ_BIT   // Check if FIQ is enabled. Enabled if 0.
     67   mov     w0, #0
     68   mov     w1, #1
     69   csel    w0, w1, w0, ne
     70   ret
     71 
     72 ASM_PFX(ArmWriteCpacr):
     73   msr     cpacr_el1, x0      // Coprocessor Access Control Reg (CPACR)
     74   ret
     75 
     76 ASM_PFX(ArmWriteAuxCr):
     77   EL1_OR_EL2(x1)
     78 1:msr     actlr_el1, x0      // Aux Control Reg (ACTLR) at EL1. Also available in EL2 and EL3
     79   ret
     80 2:msr     actlr_el2, x0      // Aux Control Reg (ACTLR) at EL1. Also available in EL2 and EL3
     81   ret
     82 
     83 ASM_PFX(ArmReadAuxCr):
     84   EL1_OR_EL2(x1)
     85 1:mrs     x0, actlr_el1      // Aux Control Reg (ACTLR) at EL1. Also available in EL2 and EL3
     86   ret
     87 2:mrs     x0, actlr_el2      // Aux Control Reg (ACTLR) at EL1. Also available in EL2 and EL3
     88   ret
     89 
     90 ASM_PFX(ArmSetTTBR0):
     91   EL1_OR_EL2_OR_EL3(x1)
     92 1:msr     ttbr0_el1, x0      // Translation Table Base Reg 0 (TTBR0)
     93   b       4f
     94 2:msr     ttbr0_el2, x0      // Translation Table Base Reg 0 (TTBR0)
     95   b       4f
     96 3:msr     ttbr0_el3, x0      // Translation Table Base Reg 0 (TTBR0)
     97 4:isb
     98   ret
     99 
    100 ASM_PFX(ArmGetTTBR0BaseAddress):
    101   EL1_OR_EL2(x1)
    102 1:mrs     x0, ttbr0_el1
    103   b       3f
    104 2:mrs     x0, ttbr0_el2
    105 3:LoadConstantToReg(0xFFFFFFFFFFFF, x1) /* Look at bottom 48 bits */
    106   and     x0, x0, x1
    107   isb
    108   ret
    109 
    110 ASM_PFX(ArmGetTCR):
    111   EL1_OR_EL2_OR_EL3(x1)
    112 1:mrs     x0, tcr_el1
    113   b       4f
    114 2:mrs     x0, tcr_el2
    115   b       4f
    116 3:mrs     x0, tcr_el3
    117 4:isb
    118   ret
    119 
    120 ASM_PFX(ArmSetTCR):
    121   EL1_OR_EL2_OR_EL3(x1)
    122 1:msr     tcr_el1, x0
    123   b       4f
    124 2:msr     tcr_el2, x0
    125   b       4f
    126 3:msr     tcr_el3, x0
    127 4:isb
    128   ret
    129 
    130 ASM_PFX(ArmGetMAIR):
    131   EL1_OR_EL2_OR_EL3(x1)
    132 1:mrs     x0, mair_el1
    133   b       4f
    134 2:mrs     x0, mair_el2
    135   b       4f
    136 3:mrs     x0, mair_el3
    137 4:isb
    138   ret
    139 
    140 ASM_PFX(ArmSetMAIR):
    141   EL1_OR_EL2_OR_EL3(x1)
    142 1:msr     mair_el1, x0
    143   b       4f
    144 2:msr     mair_el2, x0
    145   b       4f
    146 3:msr     mair_el3, x0
    147 4:isb
    148   ret
    149 
    150 
    151 //
    152 //VOID
    153 //ArmUpdateTranslationTableEntry (
    154 //  IN VOID  *TranslationTableEntry  // X0
    155 //  IN VOID  *MVA                    // X1
    156 //  );
    157 ASM_PFX(ArmUpdateTranslationTableEntry):
    158    dc      civac, x0             // Clean and invalidate data line
    159    dsb     sy
    160    EL1_OR_EL2_OR_EL3(x0)
    161 1: tlbi    vaae1, x1             // TLB Invalidate VA , EL1
    162    b       4f
    163 2: tlbi    vae2, x1              // TLB Invalidate VA , EL2
    164    b       4f
    165 3: tlbi    vae3, x1              // TLB Invalidate VA , EL3
    166 4: dsb     sy
    167    isb
    168    ret
    169 
    170 ASM_PFX(ArmInvalidateTlb):
    171    EL1_OR_EL2_OR_EL3(x0)
    172 1: tlbi  vmalle1
    173    b     4f
    174 2: tlbi  alle2
    175    b     4f
    176 3: tlbi  alle3
    177 4: dsb   sy
    178    isb
    179    ret
    180 
    181 ASM_PFX(ArmWriteCptr):
    182   msr     cptr_el3, x0           // EL3 Coprocessor Trap Reg (CPTR)
    183   ret
    184 
    185 ASM_PFX(ArmWriteScr):
    186   msr     scr_el3, x0            // Secure configuration register EL3
    187   ret
    188 
    189 ASM_PFX(ArmWriteMVBar):
    190   msr    vbar_el3, x0            // Exception Vector Base address for Monitor on EL3
    191   ret
    192 
    193 ASM_PFX(ArmCallWFE):
    194   wfe
    195   ret
    196 
    197 ASM_PFX(ArmCallSEV):
    198   sev
    199   ret
    200 
    201 ASM_PFX(ArmReadCpuActlr):
    202   mrs   x0, S3_1_c15_c2_0
    203   ret
    204 
    205 ASM_PFX(ArmWriteCpuActlr):
    206   msr   S3_1_c15_c2_0, x0
    207   dsb   sy
    208   isb
    209   ret
    210 
    211 ASM_FUNCTION_REMOVE_IF_UNREFERENCED
    212