blob: b261dc9b893dfa96c313d0bd1c6ef97fb8a05f6e [file] [log] [blame]
/** @addtogroup FCI
* @{
* @file
* Declaration of FastCall helper functions.
*
* @attention Helper functions are mostly RealView (ARM CC) specific.
*
* Holds the functions for SIQ, YIELD and FastCall for switching to the secure world.
* <!-- Copyright Giesecke & Devrient GmbH 2009-2012 -->
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef MCIFCFUNC_H_
#define MCIFCFUNC_H_
#include "mcifc.h"
/**
* Execute a secure monitor call (SMC).
*
* @param mode SMC mode affects the way SMC is handled
*
* @attention This function shall not be used directly. Use N_Siq() or Yield() instead.
*/
__smc(0) void smc(int32_t mode);
/**
* N-SIQ switch from NWd to SWd.
* Execution will continue in the SWd. The notification queue will be drained by the MC4 and MC4 system schedules its services.
*/
inline void N_Siq(void) { smc(MC_SMC_N_SIQ); }
/**
* Yield switch from NWd to SWd.
* Execution will continue in the SWd without scheduling MC4 services.
*/
inline void Yield(void) { smc(MC_SMC_N_YIELD); }
/** Wrapper structure for parameter passing in registers.
* This structure is used as a "wrapper" return value for functions that
* return data in the registers r0 to r3. With the RealView compiler such
* function are declare as: _value_in_regs reg_r0_r1_r2_r3_t foo()
*/
typedef struct {
uint32_t r0;
uint32_t r1;
uint32_t r2;
uint32_t r3;
} reg_r0_r1_r2_r3_t;
/** Parameterized SMC for FastCalls.
* @attention This function shall not be used directly.
*/
__smc(0) __value_in_regs reg_r0_r1_r2_r3_t smcFc(
uint32_t r0,
uint32_t r1,
uint32_t r2,
uint32_t r3
);
/** FastCall helper function.
* @attention This function shall not be used directly.
*/
inline static __value_in_regs reg_r0_r1_r2_r3_t fastCall(
uint32_t r0,
uint32_t r1,
uint32_t r2,
uint32_t r3
) {
return smcFc(r0,r1,r2,r3);
}
/**
* Initialize the MobiCore.
* The FcMc4init FastCall shall be used to set up the MCI. The function passes the message buffers used in the MCI to the MC4 system.
* As long as the buffers are not set up the MC4 message passing mechanisms (notifications, MCP commands) are not available.
* NQ buffer and MCP buffer as well as length calculations are described in the "MobiCore4 Driver Interface Specification".
* <br> The fastCallInit() will not check the parameters for validity. Instead the MC4 will perform a check on first usage of the parameters.
*
* @image html DoxyMciBuffer.png "MCI buffer"
* @image latex DoxyMciBuffer.png "MCI buffer" width=12cm
*
* @param base Physical start address of the MCI buffer. Must be 4kB aligned.
* @param nqOffset Offset in bytes to the beginning of the NQ buffer.
* @param nqLength Length of the NQ buffer in bytes.
* @param mcpOffset Offset in bytes to the beginning of the MCP buffer.
* @param mcpLength Length of the MCP buffer in bytes
*
*/
inline static uint32_t fastCallInit(
uint8_t *base,
uint32_t nqOffset,
uint32_t nqLength,
uint32_t mcpOffset,
uint32_t mcpLength
) {
reg_r0_r1_r2_r3_t ret;
ret = fastCall(
MC_FC_INIT,
(uint32_t)base,
((nqOffset << 16) | (nqLength & 0xFFFF)),
((mcpOffset << 16) | (mcpLength & 0xFFFF)) );
return ret.r1;
}
/** Get status information about MobiCore.
* The FcMcGetInfo FastCall provides information about the current state of the MobiCore.
* In certain states extended information is provided.
*
* @param extInfoId Extended info word to be obtained.
* @param mc4state Current state of the MobiCore.
* @param extInfo Extended information depending on state.
*/
inline static uint32_t fastCallGetInfo(
uint32_t extInfoId,
uint32_t *mc4state,
uint32_t *extInfo
) {
reg_r0_r1_r2_r3_t ret;
ret = fastCall(MC_FC_INFO,extInfoId,0,0);
if (MC_FC_RET_OK == ret.r1)
{
*mc4state = ret.r2;
*extInfo = ret.r3;
}
return ret.r1;
}
/**
* Power management.
* The power management FastCall is platform specific.
*
* @param param0 platform specific parameter.
* @param param1 platform specific parameter.
* @param param2 platform specific parameter.
*/
inline static uint32_t fastCallPower(
uint32_t param0,
uint32_t param1,
uint32_t param2
) {
reg_r0_r1_r2_r3_t ret;
ret = fastCall(
MC_FC_POWER,
param0,
param1,
param2 );
return ret.r1;
}
#endif /* MCIFCFUNC_H_ */
/**
* @}*/