in TAs/optee_ta/fTPM/fTPM.c [329:389]
static TEE_Result fTPM_Emulate_PPI(uint32_t param_types,
TEE_Param params[4]
)
{
uint8_t *cmdBuf, *respBuf;
uint32_t cmdLen, respLen;
uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
TEE_PARAM_TYPE_MEMREF_INOUT,
TEE_PARAM_TYPE_NONE,
TEE_PARAM_TYPE_NONE);
// Validate parameter types
if (param_types != exp_param_types) {
#ifdef fTPMDebug
IMSG("Bad param type(s)\n");
#endif
return TEE_ERROR_BAD_PARAMETERS;
}
// Sanity check our buffer sizes
if ((params[0].memref.size == 0) ||
(params[1].memref.size == 0) ||
(params[0].memref.size > MAX_COMMAND_SIZE) ||
(params[1].memref.size > MAX_RESPONSE_SIZE)) {
#ifdef fTPMDebug
IMSG("Bad param size(s)\n");
#endif
return TEE_ERROR_BAD_PARAMETERS;
}
// Copy command locally
memcpy(fTPMCommand, params[0].memref.buffer, params[0].memref.size);
cmdBuf = fTPMCommand;
cmdLen = params[0].memref.size;
respBuf = (uint8_t *)(params[1].memref.buffer);
respLen = params[1].memref.size;
// Pass along to platform PPI processing
if (_admin__PPIRequest(cmdLen, cmdBuf, &respLen, &respBuf)) {
#ifdef fTPMDebug
DMSG("Handled PPI command via TA interface\n");
#endif
}
else {
#ifdef fTPMDebug
IMSG("Failed to handle PPI command via TA interface\n");
#endif
}
if (respLen > params[1].memref.size) {
#ifdef fTPMDebug
IMSG("Insufficient buffer length RS: 0x%x > BL: 0x%x\n", respLen, params[1].memref.size);
#endif
return TEE_ERROR_SHORT_BUFFER;
}
params[1].memref.size = respLen;
return TEE_SUCCESS;
}