1
2
3/*******************************************************************************
4*
5* FSmc_Call - initiate SMC call
6*
7* This routine initiates SMC call which traps the processor into Monitor Mode.
8* The ARM SMC Call Convetion defines that up to eight registers can be exchanged
9* during an SMC call. The input parameter contains eight INT32 valeus which are
10* to be passed in the SMC call; similarily the output parameter also contains
11* eight INT32 values which are returned from the SMC call.
12*
13* \NOMANUAL
14*
15* RETURNS: OK
16*
17* void FSmc_Call
18*     (
19*     FSmc_Data_t * input,  /@ r0 - input register values @/
20*     FSmc_Data_t * output  /@ r1 - output register values @/
21*     )
22*/
23
24.arm
25.align 4
26.globl FSmc_Call
27FSmc_Call:
28    STMDB   sp!, {r0-r7}        /* save clobbered registers to stack */
29    ldr     r12, [sp, #(4 * 0)] /* get 1st argument (ptr to input struct) */
30    ldmia   r12, {r0-r7}        /* save input argument to r0-r7 */
31    smc     #0
32    ldr	    r12, [sp, #(4 * 1)] /* get 2th argument (ptr to output result) */
33    stmia   r12, {r0-r7}        /* get output argument from r0-r7 */
34    ldmfd   sp!, {r0-r7}        /* restore clobbered registers from stack */
35    bx	    lr
36.size FSmc_Call, .- FSmc_Call
37