1*344aa361SAndroid Build Coastguard Worker/* 2*344aa361SAndroid Build Coastguard Worker * Copyright (c) 2013, Google Inc. All rights reserved 3*344aa361SAndroid Build Coastguard Worker * 4*344aa361SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining 5*344aa361SAndroid Build Coastguard Worker * a copy of this software and associated documentation files 6*344aa361SAndroid Build Coastguard Worker * (the "Software"), to deal in the Software without restriction, 7*344aa361SAndroid Build Coastguard Worker * including without limitation the rights to use, copy, modify, merge, 8*344aa361SAndroid Build Coastguard Worker * publish, distribute, sublicense, and/or sell copies of the Software, 9*344aa361SAndroid Build Coastguard Worker * and to permit persons to whom the Software is furnished to do so, 10*344aa361SAndroid Build Coastguard Worker * subject to the following conditions: 11*344aa361SAndroid Build Coastguard Worker * 12*344aa361SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be 13*344aa361SAndroid Build Coastguard Worker * included in all copies or substantial portions of the Software. 14*344aa361SAndroid Build Coastguard Worker * 15*344aa361SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16*344aa361SAndroid Build Coastguard Worker * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17*344aa361SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 18*344aa361SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 19*344aa361SAndroid Build Coastguard Worker * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 20*344aa361SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 21*344aa361SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22*344aa361SAndroid Build Coastguard Worker */ 23*344aa361SAndroid Build Coastguard Worker 24*344aa361SAndroid Build Coastguard Worker#include <asm.h> 25*344aa361SAndroid Build Coastguard Worker#include <lib/sm/monitor.h> 26*344aa361SAndroid Build Coastguard Worker#include <lib/sm/smcall.h> 27*344aa361SAndroid Build Coastguard Worker#include <lib/sm/sm_err.h> 28*344aa361SAndroid Build Coastguard Worker 29*344aa361SAndroid Build Coastguard Worker#include <kernel/vm.h> 30*344aa361SAndroid Build Coastguard Worker 31*344aa361SAndroid Build Coastguard Worker#if !LIB_SM_CUSTOM_SCHED_NONSECURE 32*344aa361SAndroid Build Coastguard Worker/* sm_sched_nonsecure(uint32_t retval, struct smc32_args *args) */ 33*344aa361SAndroid Build Coastguard WorkerFUNCTION(sm_sched_nonsecure) 34*344aa361SAndroid Build Coastguard Worker push {r4-r7} 35*344aa361SAndroid Build Coastguard Worker push {r1, lr} 36*344aa361SAndroid Build Coastguard Worker mov r1, r0 37*344aa361SAndroid Build Coastguard Worker 38*344aa361SAndroid Build Coastguard Worker#if LIB_SM_WITH_PLATFORM_NS_RETURN 39*344aa361SAndroid Build Coastguard Worker bl platform_ns_return 40*344aa361SAndroid Build Coastguard Worker#else 41*344aa361SAndroid Build Coastguard Worker ldr r0, =SMC_SC_NS_RETURN 42*344aa361SAndroid Build Coastguard Worker smc #0 43*344aa361SAndroid Build Coastguard Worker#endif 44*344aa361SAndroid Build Coastguard Worker 45*344aa361SAndroid Build Coastguard Worker pop {r12, lr} 46*344aa361SAndroid Build Coastguard Worker 47*344aa361SAndroid Build Coastguard Worker /* Write struct smc32_args (top bits of client_id are left unchanged */ 48*344aa361SAndroid Build Coastguard Worker stmia r12, {r0-r3, r7} 49*344aa361SAndroid Build Coastguard Worker 50*344aa361SAndroid Build Coastguard Worker pop {r4-r7} 51*344aa361SAndroid Build Coastguard Worker 52*344aa361SAndroid Build Coastguard Worker bx lr 53*344aa361SAndroid Build Coastguard Worker#endif 54*344aa361SAndroid Build Coastguard Worker 55*344aa361SAndroid Build Coastguard Worker#if LIB_SM_WITH_PLATFORM_RESET 56*344aa361SAndroid Build Coastguard WorkerFUNCTION(sm_reset) 57*344aa361SAndroid Build Coastguard Worker#else 58*344aa361SAndroid Build Coastguard WorkerFUNCTION(platform_reset) 59*344aa361SAndroid Build Coastguard Worker#endif 60*344aa361SAndroid Build Coastguard Worker#if WITH_LIB_SM_MONITOR 61*344aa361SAndroid Build Coastguard Worker cps #MODE_MON 62*344aa361SAndroid Build Coastguard Worker bl monitor_reset 63*344aa361SAndroid Build Coastguard Worker cps #MODE_SVC 64*344aa361SAndroid Build Coastguard Worker#endif 65*344aa361SAndroid Build Coastguard Worker#if WITH_SMP 66*344aa361SAndroid Build Coastguard Worker /* figure out our cpu number */ 67*344aa361SAndroid Build Coastguard Worker mrc p15, 0, ip, c0, c0, 5 /* read MPIDR */ 68*344aa361SAndroid Build Coastguard Worker 69*344aa361SAndroid Build Coastguard Worker /* mask off the bottom bits to test cluster number:cpu number */ 70*344aa361SAndroid Build Coastguard Worker ubfx ip, ip, #0, #SMP_CPU_ID_BITS 71*344aa361SAndroid Build Coastguard Worker 72*344aa361SAndroid Build Coastguard Worker /* if we're not cpu 0:0, jump back to arm_reset */ 73*344aa361SAndroid Build Coastguard Worker cmp ip, #0 74*344aa361SAndroid Build Coastguard Worker bne arm_reset 75*344aa361SAndroid Build Coastguard Worker#endif 76*344aa361SAndroid Build Coastguard Worker 77*344aa361SAndroid Build Coastguard Worker.Lphys_offset: 78*344aa361SAndroid Build Coastguard Worker adr sp, .Lphys_offset /* sp = paddr */ 79*344aa361SAndroid Build Coastguard Worker ldr ip, =.Lphys_offset /* ip = vaddr */ 80*344aa361SAndroid Build Coastguard Worker sub ip, sp, ip /* ip = phys_offset */ 81*344aa361SAndroid Build Coastguard Worker 82*344aa361SAndroid Build Coastguard Worker /* patch mmu_initial_mappings table */ 83*344aa361SAndroid Build Coastguard Worker ldr r5, =mmu_initial_mappings 84*344aa361SAndroid Build Coastguard Worker add r5, r5, ip /* r5 = _mmu_initial_mappings paddr */ 85*344aa361SAndroid Build Coastguard Worker 86*344aa361SAndroid Build Coastguard Worker.Lnext_entry: 87*344aa361SAndroid Build Coastguard Worker /* if size == 0, end of list */ 88*344aa361SAndroid Build Coastguard Worker ldr r4, [r5, #__MMU_INITIAL_MAPPING_SIZE_OFFSET] 89*344aa361SAndroid Build Coastguard Worker cmp r4, #0 90*344aa361SAndroid Build Coastguard Worker beq .Lall_done 91*344aa361SAndroid Build Coastguard Worker 92*344aa361SAndroid Build Coastguard Worker ldr r4, [r5, #__MMU_INITIAL_MAPPING_FLAGS_OFFSET] 93*344aa361SAndroid Build Coastguard Worker tst r4, #MMU_INITIAL_MAPPING_FLAG_DYNAMIC 94*344aa361SAndroid Build Coastguard Worker addeq r5, #__MMU_INITIAL_MAPPING_SIZE 95*344aa361SAndroid Build Coastguard Worker beq .Lnext_entry 96*344aa361SAndroid Build Coastguard Worker 97*344aa361SAndroid Build Coastguard Worker /* patching dynamic entry: r5 - points to entry to patch */ 98*344aa361SAndroid Build Coastguard Worker /* r0 is memsize passed in by the bootloader */ 99*344aa361SAndroid Build Coastguard Worker 100*344aa361SAndroid Build Coastguard Worker /* update size field of mmu_initial_mappings struct */ 101*344aa361SAndroid Build Coastguard Worker str r0, [r5, #__MMU_INITIAL_MAPPING_SIZE_OFFSET] 102*344aa361SAndroid Build Coastguard Worker 103*344aa361SAndroid Build Coastguard Worker /* calculate phys mem base */ 104*344aa361SAndroid Build Coastguard Worker ldr r4, =_start /* r4 = _start vaddr */ 105*344aa361SAndroid Build Coastguard Worker add r4, r4, ip /* r4 = _start paddr */ 106*344aa361SAndroid Build Coastguard Worker 107*344aa361SAndroid Build Coastguard Worker /* update phys field of mmu_initial_mappings struct */ 108*344aa361SAndroid Build Coastguard Worker str r4, [r5, #__MMU_INITIAL_MAPPING_PHYS_OFFSET] 109*344aa361SAndroid Build Coastguard Worker 110*344aa361SAndroid Build Coastguard Worker.Lall_done: 111*344aa361SAndroid Build Coastguard Worker b arm_reset 112