1*4ecca339SDan Handley/* 2*4ecca339SDan Handley * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. 3*4ecca339SDan Handley * 4*4ecca339SDan Handley * Redistribution and use in source and binary forms, with or without 5*4ecca339SDan Handley * modification, are permitted provided that the following conditions are met: 6*4ecca339SDan Handley * 7*4ecca339SDan Handley * Redistributions of source code must retain the above copyright notice, this 8*4ecca339SDan Handley * list of conditions and the following disclaimer. 9*4ecca339SDan Handley * 10*4ecca339SDan Handley * Redistributions in binary form must reproduce the above copyright notice, 11*4ecca339SDan Handley * this list of conditions and the following disclaimer in the documentation 12*4ecca339SDan Handley * and/or other materials provided with the distribution. 13*4ecca339SDan Handley * 14*4ecca339SDan Handley * Neither the name of ARM nor the names of its contributors may be used 15*4ecca339SDan Handley * to endorse or promote products derived from this software without specific 16*4ecca339SDan Handley * prior written permission. 17*4ecca339SDan Handley * 18*4ecca339SDan Handley * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*4ecca339SDan Handley * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*4ecca339SDan Handley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*4ecca339SDan Handley * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*4ecca339SDan Handley * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*4ecca339SDan Handley * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*4ecca339SDan Handley * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*4ecca339SDan Handley * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*4ecca339SDan Handley * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*4ecca339SDan Handley * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*4ecca339SDan Handley * POSSIBILITY OF SUCH DAMAGE. 29*4ecca339SDan Handley */ 30*4ecca339SDan Handley 31*4ecca339SDan Handley#include <arch_helpers.h> 32*4ecca339SDan Handley#include <runtime_svc.h> 33*4ecca339SDan Handley#include <asm_macros.S> 34*4ecca339SDan Handley 35*4ecca339SDan Handley .globl enable_irq 36*4ecca339SDan Handley .globl disable_irq 37*4ecca339SDan Handley 38*4ecca339SDan Handley .globl enable_fiq 39*4ecca339SDan Handley .globl disable_fiq 40*4ecca339SDan Handley 41*4ecca339SDan Handley .globl enable_serror 42*4ecca339SDan Handley .globl disable_serror 43*4ecca339SDan Handley 44*4ecca339SDan Handley .globl enable_debug_exceptions 45*4ecca339SDan Handley .globl disable_debug_exceptions 46*4ecca339SDan Handley 47*4ecca339SDan Handley .globl read_daif 48*4ecca339SDan Handley .globl write_daif 49*4ecca339SDan Handley 50*4ecca339SDan Handley .globl read_spsr 51*4ecca339SDan Handley .globl read_spsr_el1 52*4ecca339SDan Handley .globl read_spsr_el2 53*4ecca339SDan Handley .globl read_spsr_el3 54*4ecca339SDan Handley 55*4ecca339SDan Handley .globl write_spsr 56*4ecca339SDan Handley .globl write_spsr_el1 57*4ecca339SDan Handley .globl write_spsr_el2 58*4ecca339SDan Handley .globl write_spsr_el3 59*4ecca339SDan Handley 60*4ecca339SDan Handley .globl read_elr 61*4ecca339SDan Handley .globl read_elr_el1 62*4ecca339SDan Handley .globl read_elr_el2 63*4ecca339SDan Handley .globl read_elr_el3 64*4ecca339SDan Handley 65*4ecca339SDan Handley .globl write_elr 66*4ecca339SDan Handley .globl write_elr_el1 67*4ecca339SDan Handley .globl write_elr_el2 68*4ecca339SDan Handley .globl write_elr_el3 69*4ecca339SDan Handley 70*4ecca339SDan Handley .globl get_afflvl_shift 71*4ecca339SDan Handley .globl mpidr_mask_lower_afflvls 72*4ecca339SDan Handley .globl dsb 73*4ecca339SDan Handley .globl isb 74*4ecca339SDan Handley .globl sev 75*4ecca339SDan Handley .globl wfe 76*4ecca339SDan Handley .globl wfi 77*4ecca339SDan Handley .globl eret 78*4ecca339SDan Handley .globl smc 79*4ecca339SDan Handley 80*4ecca339SDan Handley .globl zeromem16 81*4ecca339SDan Handley .globl memcpy16 82*4ecca339SDan Handley 83*4ecca339SDan Handley 84*4ecca339SDan Handleyfunc get_afflvl_shift 85*4ecca339SDan Handley cmp x0, #3 86*4ecca339SDan Handley cinc x0, x0, eq 87*4ecca339SDan Handley mov x1, #MPIDR_AFFLVL_SHIFT 88*4ecca339SDan Handley lsl x0, x0, x1 89*4ecca339SDan Handley ret 90*4ecca339SDan Handley 91*4ecca339SDan Handleyfunc mpidr_mask_lower_afflvls 92*4ecca339SDan Handley cmp x1, #3 93*4ecca339SDan Handley cinc x1, x1, eq 94*4ecca339SDan Handley mov x2, #MPIDR_AFFLVL_SHIFT 95*4ecca339SDan Handley lsl x2, x1, x2 96*4ecca339SDan Handley lsr x0, x0, x2 97*4ecca339SDan Handley lsl x0, x0, x2 98*4ecca339SDan Handley ret 99*4ecca339SDan Handley 100*4ecca339SDan Handley /* ----------------------------------------------------- 101*4ecca339SDan Handley * Asynchronous exception manipulation accessors 102*4ecca339SDan Handley * ----------------------------------------------------- 103*4ecca339SDan Handley */ 104*4ecca339SDan Handleyfunc enable_irq 105*4ecca339SDan Handley msr daifclr, #DAIF_IRQ_BIT 106*4ecca339SDan Handley ret 107*4ecca339SDan Handley 108*4ecca339SDan Handley 109*4ecca339SDan Handleyfunc enable_fiq 110*4ecca339SDan Handley msr daifclr, #DAIF_FIQ_BIT 111*4ecca339SDan Handley ret 112*4ecca339SDan Handley 113*4ecca339SDan Handley 114*4ecca339SDan Handleyfunc enable_serror 115*4ecca339SDan Handley msr daifclr, #DAIF_ABT_BIT 116*4ecca339SDan Handley ret 117*4ecca339SDan Handley 118*4ecca339SDan Handley 119*4ecca339SDan Handleyfunc enable_debug_exceptions 120*4ecca339SDan Handley msr daifclr, #DAIF_DBG_BIT 121*4ecca339SDan Handley ret 122*4ecca339SDan Handley 123*4ecca339SDan Handley 124*4ecca339SDan Handleyfunc disable_irq 125*4ecca339SDan Handley msr daifset, #DAIF_IRQ_BIT 126*4ecca339SDan Handley ret 127*4ecca339SDan Handley 128*4ecca339SDan Handley 129*4ecca339SDan Handleyfunc disable_fiq 130*4ecca339SDan Handley msr daifset, #DAIF_FIQ_BIT 131*4ecca339SDan Handley ret 132*4ecca339SDan Handley 133*4ecca339SDan Handley 134*4ecca339SDan Handleyfunc disable_serror 135*4ecca339SDan Handley msr daifset, #DAIF_ABT_BIT 136*4ecca339SDan Handley ret 137*4ecca339SDan Handley 138*4ecca339SDan Handley 139*4ecca339SDan Handleyfunc disable_debug_exceptions 140*4ecca339SDan Handley msr daifset, #DAIF_DBG_BIT 141*4ecca339SDan Handley ret 142*4ecca339SDan Handley 143*4ecca339SDan Handley 144*4ecca339SDan Handleyfunc read_daif 145*4ecca339SDan Handley mrs x0, daif 146*4ecca339SDan Handley ret 147*4ecca339SDan Handley 148*4ecca339SDan Handley 149*4ecca339SDan Handleyfunc write_daif 150*4ecca339SDan Handley msr daif, x0 151*4ecca339SDan Handley ret 152*4ecca339SDan Handley 153*4ecca339SDan Handley 154*4ecca339SDan Handleyfunc read_spsr 155*4ecca339SDan Handley mrs x0, CurrentEl 156*4ecca339SDan Handley cmp x0, #(MODE_EL1 << MODE_EL_SHIFT) 157*4ecca339SDan Handley b.eq read_spsr_el1 158*4ecca339SDan Handley cmp x0, #(MODE_EL2 << MODE_EL_SHIFT) 159*4ecca339SDan Handley b.eq read_spsr_el2 160*4ecca339SDan Handley cmp x0, #(MODE_EL3 << MODE_EL_SHIFT) 161*4ecca339SDan Handley b.eq read_spsr_el3 162*4ecca339SDan Handley 163*4ecca339SDan Handley 164*4ecca339SDan Handleyfunc read_spsr_el1 165*4ecca339SDan Handley mrs x0, spsr_el1 166*4ecca339SDan Handley ret 167*4ecca339SDan Handley 168*4ecca339SDan Handley 169*4ecca339SDan Handleyfunc read_spsr_el2 170*4ecca339SDan Handley mrs x0, spsr_el2 171*4ecca339SDan Handley ret 172*4ecca339SDan Handley 173*4ecca339SDan Handley 174*4ecca339SDan Handleyfunc read_spsr_el3 175*4ecca339SDan Handley mrs x0, spsr_el3 176*4ecca339SDan Handley ret 177*4ecca339SDan Handley 178*4ecca339SDan Handley 179*4ecca339SDan Handleyfunc write_spsr 180*4ecca339SDan Handley mrs x1, CurrentEl 181*4ecca339SDan Handley cmp x1, #(MODE_EL1 << MODE_EL_SHIFT) 182*4ecca339SDan Handley b.eq write_spsr_el1 183*4ecca339SDan Handley cmp x1, #(MODE_EL2 << MODE_EL_SHIFT) 184*4ecca339SDan Handley b.eq write_spsr_el2 185*4ecca339SDan Handley cmp x1, #(MODE_EL3 << MODE_EL_SHIFT) 186*4ecca339SDan Handley b.eq write_spsr_el3 187*4ecca339SDan Handley 188*4ecca339SDan Handley 189*4ecca339SDan Handleyfunc write_spsr_el1 190*4ecca339SDan Handley msr spsr_el1, x0 191*4ecca339SDan Handley isb 192*4ecca339SDan Handley ret 193*4ecca339SDan Handley 194*4ecca339SDan Handley 195*4ecca339SDan Handleyfunc write_spsr_el2 196*4ecca339SDan Handley msr spsr_el2, x0 197*4ecca339SDan Handley isb 198*4ecca339SDan Handley ret 199*4ecca339SDan Handley 200*4ecca339SDan Handley 201*4ecca339SDan Handleyfunc write_spsr_el3 202*4ecca339SDan Handley msr spsr_el3, x0 203*4ecca339SDan Handley isb 204*4ecca339SDan Handley ret 205*4ecca339SDan Handley 206*4ecca339SDan Handley 207*4ecca339SDan Handleyfunc read_elr 208*4ecca339SDan Handley mrs x0, CurrentEl 209*4ecca339SDan Handley cmp x0, #(MODE_EL1 << MODE_EL_SHIFT) 210*4ecca339SDan Handley b.eq read_elr_el1 211*4ecca339SDan Handley cmp x0, #(MODE_EL2 << MODE_EL_SHIFT) 212*4ecca339SDan Handley b.eq read_elr_el2 213*4ecca339SDan Handley cmp x0, #(MODE_EL3 << MODE_EL_SHIFT) 214*4ecca339SDan Handley b.eq read_elr_el3 215*4ecca339SDan Handley 216*4ecca339SDan Handley 217*4ecca339SDan Handleyfunc read_elr_el1 218*4ecca339SDan Handley mrs x0, elr_el1 219*4ecca339SDan Handley ret 220*4ecca339SDan Handley 221*4ecca339SDan Handley 222*4ecca339SDan Handleyfunc read_elr_el2 223*4ecca339SDan Handley mrs x0, elr_el2 224*4ecca339SDan Handley ret 225*4ecca339SDan Handley 226*4ecca339SDan Handley 227*4ecca339SDan Handleyfunc read_elr_el3 228*4ecca339SDan Handley mrs x0, elr_el3 229*4ecca339SDan Handley ret 230*4ecca339SDan Handley 231*4ecca339SDan Handley 232*4ecca339SDan Handleyfunc write_elr 233*4ecca339SDan Handley mrs x1, CurrentEl 234*4ecca339SDan Handley cmp x1, #(MODE_EL1 << MODE_EL_SHIFT) 235*4ecca339SDan Handley b.eq write_elr_el1 236*4ecca339SDan Handley cmp x1, #(MODE_EL2 << MODE_EL_SHIFT) 237*4ecca339SDan Handley b.eq write_elr_el2 238*4ecca339SDan Handley cmp x1, #(MODE_EL3 << MODE_EL_SHIFT) 239*4ecca339SDan Handley b.eq write_elr_el3 240*4ecca339SDan Handley 241*4ecca339SDan Handley 242*4ecca339SDan Handleyfunc write_elr_el1 243*4ecca339SDan Handley msr elr_el1, x0 244*4ecca339SDan Handley isb 245*4ecca339SDan Handley ret 246*4ecca339SDan Handley 247*4ecca339SDan Handley 248*4ecca339SDan Handleyfunc write_elr_el2 249*4ecca339SDan Handley msr elr_el2, x0 250*4ecca339SDan Handley isb 251*4ecca339SDan Handley ret 252*4ecca339SDan Handley 253*4ecca339SDan Handley 254*4ecca339SDan Handleyfunc write_elr_el3 255*4ecca339SDan Handley msr elr_el3, x0 256*4ecca339SDan Handley isb 257*4ecca339SDan Handley ret 258*4ecca339SDan Handley 259*4ecca339SDan Handley 260*4ecca339SDan Handleyfunc dsb 261*4ecca339SDan Handley dsb sy 262*4ecca339SDan Handley ret 263*4ecca339SDan Handley 264*4ecca339SDan Handley 265*4ecca339SDan Handleyfunc isb 266*4ecca339SDan Handley isb 267*4ecca339SDan Handley ret 268*4ecca339SDan Handley 269*4ecca339SDan Handley 270*4ecca339SDan Handleyfunc sev 271*4ecca339SDan Handley sev 272*4ecca339SDan Handley ret 273*4ecca339SDan Handley 274*4ecca339SDan Handley 275*4ecca339SDan Handleyfunc wfe 276*4ecca339SDan Handley wfe 277*4ecca339SDan Handley ret 278*4ecca339SDan Handley 279*4ecca339SDan Handley 280*4ecca339SDan Handleyfunc wfi 281*4ecca339SDan Handley wfi 282*4ecca339SDan Handley ret 283*4ecca339SDan Handley 284*4ecca339SDan Handley 285*4ecca339SDan Handleyfunc eret 286*4ecca339SDan Handley eret 287*4ecca339SDan Handley 288*4ecca339SDan Handley 289*4ecca339SDan Handleyfunc smc 290*4ecca339SDan Handley smc #0 291*4ecca339SDan Handley 292*4ecca339SDan Handley/* ----------------------------------------------------------------------- 293*4ecca339SDan Handley * void zeromem16(void *mem, unsigned int length); 294*4ecca339SDan Handley * 295*4ecca339SDan Handley * Initialise a memory region to 0. 296*4ecca339SDan Handley * The memory address must be 16-byte aligned. 297*4ecca339SDan Handley * ----------------------------------------------------------------------- 298*4ecca339SDan Handley */ 299*4ecca339SDan Handleyfunc zeromem16 300*4ecca339SDan Handley add x2, x0, x1 301*4ecca339SDan Handley/* zero 16 bytes at a time */ 302*4ecca339SDan Handleyz_loop16: 303*4ecca339SDan Handley sub x3, x2, x0 304*4ecca339SDan Handley cmp x3, #16 305*4ecca339SDan Handley b.lt z_loop1 306*4ecca339SDan Handley stp xzr, xzr, [x0], #16 307*4ecca339SDan Handley b z_loop16 308*4ecca339SDan Handley/* zero byte per byte */ 309*4ecca339SDan Handleyz_loop1: 310*4ecca339SDan Handley cmp x0, x2 311*4ecca339SDan Handley b.eq z_end 312*4ecca339SDan Handley strb wzr, [x0], #1 313*4ecca339SDan Handley b z_loop1 314*4ecca339SDan Handleyz_end: ret 315*4ecca339SDan Handley 316*4ecca339SDan Handley 317*4ecca339SDan Handley/* -------------------------------------------------------------------------- 318*4ecca339SDan Handley * void memcpy16(void *dest, const void *src, unsigned int length) 319*4ecca339SDan Handley * 320*4ecca339SDan Handley * Copy length bytes from memory area src to memory area dest. 321*4ecca339SDan Handley * The memory areas should not overlap. 322*4ecca339SDan Handley * Destination and source addresses must be 16-byte aligned. 323*4ecca339SDan Handley * -------------------------------------------------------------------------- 324*4ecca339SDan Handley */ 325*4ecca339SDan Handleyfunc memcpy16 326*4ecca339SDan Handley/* copy 16 bytes at a time */ 327*4ecca339SDan Handleym_loop16: 328*4ecca339SDan Handley cmp x2, #16 329*4ecca339SDan Handley b.lt m_loop1 330*4ecca339SDan Handley ldp x3, x4, [x1], #16 331*4ecca339SDan Handley stp x3, x4, [x0], #16 332*4ecca339SDan Handley sub x2, x2, #16 333*4ecca339SDan Handley b m_loop16 334*4ecca339SDan Handley/* copy byte per byte */ 335*4ecca339SDan Handleym_loop1: 336*4ecca339SDan Handley cbz x2, m_end 337*4ecca339SDan Handley ldrb w3, [x1], #1 338*4ecca339SDan Handley strb w3, [x0], #1 339*4ecca339SDan Handley subs x2, x2, #1 340*4ecca339SDan Handley b.ne m_loop1 341*4ecca339SDan Handleym_end: ret 342