aboutsummaryrefslogtreecommitdiffstats
path: root/os/common
diff options
context:
space:
mode:
authorisiora <none@example.com>2018-01-18 09:27:14 +0000
committerisiora <none@example.com>2018-01-18 09:27:14 +0000
commit6dd5434799e5822a1523e74041c0b315f34a556f (patch)
treea9ca1df780b3e7f9fba27fc3fcad13a084cdecc3 /os/common
parent1c10a0845bc1759a5ed2fe6161dc89772d7c0500 (diff)
downloadChibiOS-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.c150
-rw-r--r--os/common/ports/ARMCAx-TZ/chsmc.h86
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 */
+
+/** @} */