diff options
| author | isiora <none@example.com> | 2018-01-18 09:27:14 +0000 | 
|---|---|---|
| committer | isiora <none@example.com> | 2018-01-18 09:27:14 +0000 | 
| commit | 6dd5434799e5822a1523e74041c0b315f34a556f (patch) | |
| tree | a9ca1df780b3e7f9fba27fc3fcad13a084cdecc3 /os/common | |
| parent | 1c10a0845bc1759a5ed2fe6161dc89772d7c0500 (diff) | |
| download | ChibiOS-6dd5434799e5822a1523e74041c0b315f34a556f.tar.gz ChibiOS-6dd5434799e5822a1523e74041c0b315f34a556f.tar.bz2 ChibiOS-6dd5434799e5822a1523e74041c0b315f34a556f.zip  | |
Added SMC related sources.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11311 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/common')
| -rw-r--r-- | os/common/ports/ARMCAx-TZ/chsmc.c | 150 | ||||
| -rw-r--r-- | os/common/ports/ARMCAx-TZ/chsmc.h | 86 | 
2 files changed, 236 insertions, 0 deletions
diff --git a/os/common/ports/ARMCAx-TZ/chsmc.c b/os/common/ports/ARMCAx-TZ/chsmc.c new file mode 100644 index 000000000..2c813f713 --- /dev/null +++ b/os/common/ports/ARMCAx-TZ/chsmc.c @@ -0,0 +1,150 @@ +/*
 +    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 <http://www.gnu.org/licenses/>.
 +*/
 +
 +/**
 + * @file    chsmc.c
 + * @brief   smc call module code.
 + *
 + * @addtogroup SMC
 + * @{
 + */
 +#include <string.h>
 +
 +#include "ch.h"
 +#include "chsmc.h"
 +
 +/*===========================================================================*/
 +/* Module local definitions.                                                 */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* Module exported variables.                                                */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* Module local types.                                                       */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* Module local variables.                                                   */
 +/*===========================================================================*/
 +static memory_pool_t svcs_pool;
 +
 +/*===========================================================================*/
 +/* Module local functions.                                                   */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* Module exported functions.                                                */
 +/*===========================================================================*/
 +
 +/**
 + * @brief   XXX Module initialization.
 + * @note    This function is implicitly invoked on system initialization,
 + *          there is no need to explicitly initialize the module.
 + *
 + * @notapi
 + */
 +void _smc_init(void) {
 +  chPoolObjectInit(&svcs_pool, sizeof (smc_service_t),
 +                   chCoreAllocAlignedI);
 +}
 +
 +/**
 + * @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, if necessary.
 + *
 + * @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
 + *
 + * @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(registered_object_t svc_handle, void *svc_data) {
 +  msg_t r;
 +
 +  asm("bkpt #0\n\t");
 +  chDbgAssert(_ns_thread == NULL, "main thread consistency");
 +
 +  chSysLock();
 +  r = chThdSuspendS(&_ns_thread);
 +  _ns_thread = NULL;
 +  chSysUnlock();
 +  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 new allocated service object.
 + * @retval NULL           if @p svc_name failed to be registered.
 + *
 + * @notapi
 + */
 +smc_service_t *smcRegisterMeAsService(const char *svc_name)
 +{
 +  registered_object_t *rop;
 +
 +  smc_service_t *svcp = chPoolAlloc(&svcs_pool);
 +  svcp->svct = chThdGetSelfX();
 +  memset(svcp->params, 0, sizeof svcp->params);
 +  rop = chFactoryRegisterObject(svc_name, svcp);
 +  if (rop == NULL) {
 +    chPoolFree(&svcs_pool, svcp);
 +    return NULL;
 +  }
 +  return svcp;
 +}
 +
 +/**
 + * @brief   The calling thread is a service and wait the arrival of a request.
 + * @post
 + *
 + * @param[in] svc_name    the name of the service
 + * @param[in] svc_number  the number of the service
 + *
 + * @return                  the
 + * @retval SMC_SVC_OK       a success value.
 + * @retval SMC_SVC_MANAGED  if the service @p scv_name already exists.
 + *
 + * @notapi
 + */
 +msg_t smcServiceWaitRequest(smc_service_t *svcp)
 +{
 +  msg_t r;
 +
 +  chDbgCheck(svcp != NULL);
 +
 +  if (svcp->svct != chThdGetSelfX())
 +    return MSG_TIMEOUT;
 +  chSysLock();
 +  r = chThdSuspendTimeoutS(&svcp->svct, TIME_INFINITE);
 +  chSysUnlock();
 +  return r;
 +}
 +
 +/** @} */
 diff --git a/os/common/ports/ARMCAx-TZ/chsmc.h b/os/common/ports/ARMCAx-TZ/chsmc.h new file mode 100644 index 000000000..8ea42f0f1 --- /dev/null +++ b/os/common/ports/ARMCAx-TZ/chsmc.h @@ -0,0 +1,86 @@ +/*
 +    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 <http://www.gnu.org/licenses/>.
 +*/
 +
 +/**
 + * @file    chsmc.h
 + * @brief   smc Module macros and structures.
 + *
 + * @addtogroup SMC
 + * @{
 + */
 +
 +#ifndef CHSMC_H
 +#define CHSMC_H
 +
 +#include "ch.h"
 +
 +/*===========================================================================*/
 +/* Module constants.                                                         */
 +/*===========================================================================*/
 +/*
 + * Service registry errors
 + */
 +#define SMC_SVC_OK                MSG_RESET  /* No error */
 +#define SMC_SVC_MANAGED           0x01    /* The service is already managed by a thread */
 +#define SMC_SVC_THREAD_EXIST      0x02    /* The thread already manages a service */
 +#define SMC_SVC_THREAD_NOENT      0x03    /* The thread is not in the registry */
 +
 +#define SMC_SVC_PARAMS_MAX_N      3       /* Max number of parameters for a service */
 +
 +/*===========================================================================*/
 +/* Module pre-compile time settings.                                         */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* Derived constants and error checks.                                       */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* Module data structures and types.                                         */
 +/*===========================================================================*/
 +typedef struct ch_smc_service {
 +  thread_reference_t  svct;
 +  msg_t               params[SMC_SVC_PARAMS_MAX_N];
 +} smc_service_t;
 +
 +/*===========================================================================*/
 +/* Module macros.                                                            */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* External declarations.                                                    */
 +/*===========================================================================*/
 +
 +#ifdef __cplusplus
 +extern "C" {
 +#endif
 +thread_reference_t _ns_thread;
 +msg_t smc_entry(msg_t svc_number, void *svc_data);
 +smc_service_t * smcRegisterMeAsService(const char *svc_name);
 +#ifdef __cplusplus
 +}
 +#endif
 +
 +/*===========================================================================*/
 +/* Module inline functions.                                                  */
 +/*===========================================================================*/
 +
 +#endif /* CHSMC_H */
 +
 +/** @} */
  | 
