42 строки
1.5 KiB
ArmAsm
42 строки
1.5 KiB
ArmAsm
/*
|
|
* 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)
|