From f33d39c832959e1fb890433467f6b9bb29850df5 Mon Sep 17 00:00:00 2001 From: isiora Date: Wed, 7 Mar 2018 11:44:49 +0000 Subject: New tssi interface. git-svn-id: https://svn.code.sf.net/p/chibios/svn2/trunk@11608 110e8d01-0319-4d1e-a829-52ad28d1bb01 --- .../ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/tsclient.h | 157 +++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/tsclient.h (limited to 'demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/tsclient.h') diff --git a/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/tsclient.h b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/tsclient.h new file mode 100644 index 000000000..6389bdb01 --- /dev/null +++ b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/tsclient.h @@ -0,0 +1,157 @@ +/* + ChibiOS - Copyright (C) 2006..2018 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 tsclient.h + * @brief TSSI client module macros and structures. + * + * @addtogroup TSSI + * @{ + */ + +#ifndef TSCLIENT_H +#define TSCLIENT_H + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/* Service registry errors as returned by smc.*/ +#define SMC_SVC_OK MSG_OK /* No error.*/ +#define SMC_SVC_INTR (msg_t)-1 /* Service interrupted ( == MSG_TIMEOUT).*/ +#define SMC_SVC_NOENT (msg_t)-2 /* No existent service.*/ +#define SMC_SVC_INVALID (msg_t)-3 /* Invalid service parameter(s).*/ +#define SMC_SVC_BADH (msg_t)-4 /* Invalid service handle.*/ +#define SMC_SVC_EXIST (msg_t)-5 /* Service already exists.*/ +#define SMC_SVC_NHND (msg_t)-6 /* No more services.*/ +#define SMC_SVC_BUSY (msg_t)-7 /* Service busy.*/ + +/* Special trusted service handles.*/ +#define TS_HND_DISCOVERY ((ts_service_t *)1) /* Discovery service handle.*/ +#define TS_HND_STQRY ((ts_service_t *)2) /* Query status service handle.*/ +#define TS_HND_IDLE ((ts_service_t *)3) /* Idle service handle.*/ + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +#define TS_GRANTED_TIMESLICE 1000 /* Microseconds.*/ + +#define TS_CHECK_EVENT_HOOK(f) { \ + (void)f; \ +} + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +typedef uint8_t * ts_params_area_t; +typedef void * ts_service_t; + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +/** + * @brief Call a service via smc instruction. + * @note see tsInvoke1() + * + * @notapi + */ +static inline int64_t tsInvoke0(ts_service_t handle, ts_params_area_t data, + size_t size, sysinterval_t yieldtime) { + register int64_t result asm("r0"); + + register int32_t r0 asm("r0") = (int32_t) handle; + register int32_t r1 asm("r1") = (int32_t) data; + register int32_t r2 asm("r2") = (int32_t) size; + register int32_t r3 asm("r3") = (int32_t) yieldtime; + + __asm volatile ("smc #0" : "=r" (result) : "r" (r0), "r" (r1), "r" (r2), + "r" (r3) : "memory"); + return result; +} + +/** + * @brief Call a service via smc instruction. + * @details call a given service via smc and evaluate the eventflags mask + * returned by the secure world. The flags mask is checked by a + * macro, TS_CHECK_EVENT_HOOK, supplied by the user. + * + * @param[in] handle The handle of the service to invoke. + * The handle is obtained by an invoke to discovery + * service. + * @param[inout] svc_data Service request data, often a reference to a more + * complex structure. + * @param[in] svc_datalen Size of the svc_data memory area. + * @param[in] yieldtime The time yield to SEC service to run, in microsec. + * + * @return A 64bit value. It is the OR of the 32bit service + * status combined with a 32bit event mask (in the + * hi-word). + * The retval values are returned in the lower word + * as 32bit int. + * @retval SMC_SVC_OK generic success value. + * @retval SMC_SVC_INTR call interrupted. + * @retval SMC_SVC_BUSY the service has a pending request. + * @retval SMC_SVC_INVALID bad parameters. + * @retval SMC_SVC_NOENT no such service. + * @retval SMC_SVC_BADH bad handle. + * + * @api + */ +static inline int64_t tsInvoke1(ts_service_t handle, ts_params_area_t data, + size_t size, sysinterval_t timeslice) { + int64_t result; + eventflags_t f; + + result = tsInvoke0(handle, data, size, timeslice); + f = (eventflags_t)(result >> 32); + TS_CHECK_EVENT_HOOK(f); + return result; +} + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif +msg_t tsInvokeService(ts_service_t handle, ts_params_area_t data, + size_t size, sysinterval_t svc_nsec_time); +#ifdef __cplusplus +} +#endif + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +#endif /* TSCLIENT_H */ + +/** @} */ -- cgit v1.2.3