/* * Copyright (C) 2013 Broadcom Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation version 2. * * This program is distributed "as is" WITHOUT ANY WARRANTY of any * kind, whether express or implied; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include <linux/linkage.h> #include "bcm_kona_smc.h" /* * int bcm_kona_smc_asm(u32 service_id, u32 buffer_addr) */ ENTRY(bcm_kona_smc_asm) stmfd sp!, {r4-r12, lr} mov r4, r0 @ service_id mov r5, #3 @ Keep IRQ and FIQ off in SM /* * Since interrupts are disabled in the open mode, we must keep * interrupts disabled in secure mode by setting R5=0x3. If interrupts * are enabled in open mode, we can set R5=0x0 to allow interrupts in * secure mode. If we did this, the secure monitor would return back * control to the open mode to handle the interrupt prior to completing * the secure service. If this happened, R12 would not be * SEC_EXIT_NORMAL and we would need to call SMC again after resetting * R5 (it gets clobbered by the secure monitor) and setting R4 to * SSAPI_RET_FROM_INT_SERV to indicate that we want the secure monitor * to finish up the previous uncompleted secure service. */ mov r6, r1 @ buffer_addr smc #0 /* Check r12 for SEC_EXIT_NORMAL here if interrupts are enabled */ ldmfd sp!, {r4-r12, pc} ENDPROC(bcm_kona_smc_asm)