/*
ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio.
This file is part of ChibiOS.
ChibiOS 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; either version 3 of the License, or
(at your option) any later version.
ChibiOS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
/**
* @file chsmc.c
* @brief smc call module code.
*
* @addtogroup SMC
* @{
*/
//#include
#include "ch.h"
#include "chsmc.h"
/*===========================================================================*/
/* Module local definitions. */
/*===========================================================================*/
/*===========================================================================*/
/* Module exported variables. */
/*===========================================================================*/
thread_reference_t _ns_thread;
/*===========================================================================*/
/* Module local types. */
/*===========================================================================*/
/*===========================================================================*/
/* Module local variables. */
/*===========================================================================*/
static memory_pool_t svcs_pool;
/*===========================================================================*/
/* Module local functions. */
/*===========================================================================*/
static bool isAddrspaceValid(void *addr, uint32_t len)
{
(void) addr;
(void) len;
return TRUE;
}
/*===========================================================================*/
/* Module exported functions. */
/*===========================================================================*/
/**
* @brief XXX Module initialization.
*
* @notapi
*/
void smcInit(void) {
chPoolObjectInit(&svcs_pool, sizeof (smc_service_t),
chCoreAllocAlignedI);
}
registered_object_t *smcFindService(const char *name, uint32_t namelen) {
(void) name;
(void) namelen;
return 0;
}
/**
* @brief The trusted service call entry point.
* @post A request is passed to the thread registered for the service.
* @post The service thread is resumed.
*
* @param[in] svc_handle the handle of the service to be invoked
* @param[in] svc_data service request data, often a reference to a more complex structure
* @param[in] svc_datalen size of the svc_data memory area
*
* @return a value defined by the service.
* @retval MSG_OK a success value.
* @retval MSG_RESET if the service is unavailable.
*
* @notapi
*/
msg_t smcEntry(smc_service_t *svc_handle, smc_params_area_t svc_data, uint32_t svc_datalen) {
registered_object_t *rop;
msg_t r;
asm("bkpt #0\n\t");
if (!isAddrspaceValid(svc_data, svc_datalen))
return MSG_RESET;
rop = chFactoryFindObjectByPointer(svc_handle);
if (rop == NULL)
return MSG_RESET;
svc_handle->svc_data = svc_data;
svc_handle->svc_datalen = svc_datalen;
chSysLock();
chThdResumeS(&svc_handle->svct, MSG_OK);
r = chThdSuspendS(&_ns_thread);
chSysUnlock();
chFactoryReleaseObject(rop);
return r;
}
/**
* @brief Register the calling thread as a manager of the given service @p svc_name.
* @post The current thread is registered as manager for @p svc_name service.
* Only a thread will be the manager of the service @p svc_name.
*
* @param[in] svc_name the name of the service.
*
* @return a registered smc service object.
* @retval NULL if @p svc_name failed to be registered.
*
* @notapi
*/
registered_object_t *smcRegisterMeAsService(const char *svc_name)
{
registered_object_t *rop;
smc_service_t *svcp = chPoolAlloc(&svcs_pool);
rop = chFactoryRegisterObject(svc_name, svcp);
if (rop == NULL) {
chPoolFree(&svcs_pool, svcp);
return NULL;
}
return rop;
}
/**
* @brief The calling thread is a service and wait the arrival of a request.
* @post the service object is filled with the parameters of the requestor.
*
* @param[in] svcp the service object reference.
*
* @return the reason of the awakening
* @retval MSG_OK a success value.
* @retval MSG_TIMEOUT a success value.
*
* @notapi
*/
msg_t smcServiceWaitRequest(smc_service_t *svcp)
{
msg_t r;
chDbgCheck(svcp != NULL);
chSysLock();
r = chThdSuspendTimeoutS(&svcp->svct, TIME_INFINITE);
chSysUnlock();
return r;
}
/** @} */