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