From 1168c5ddc60e0736fe3190a43abac0de85dfe947 Mon Sep 17 00:00:00 2001 From: isiora Date: Fri, 19 Jan 2018 14:16:49 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11352 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/common/ports/ARMCAx-TZ/chsmc.c | 51 +++++++++++++++++++++++++++++---------- os/common/ports/ARMCAx-TZ/chsmc.h | 12 ++++++--- 2 files changed, 47 insertions(+), 16 deletions(-) (limited to 'os/common/ports/ARMCAx-TZ') diff --git a/os/common/ports/ARMCAx-TZ/chsmc.c b/os/common/ports/ARMCAx-TZ/chsmc.c index 9632f8fdc..ef214d757 100644 --- a/os/common/ports/ARMCAx-TZ/chsmc.c +++ b/os/common/ports/ARMCAx-TZ/chsmc.c @@ -24,7 +24,6 @@ * @addtogroup SMC * @{ */ -//#include #include "ch.h" #include "chsmc.h" @@ -51,13 +50,38 @@ static memory_pool_t svcs_pool; /* Module local functions. */ /*===========================================================================*/ -static bool isAddrspaceValid(void *addr, uint32_t len) +static bool isAddrSpaceValid(uint8_t *addr, size_t size) { - (void) addr; - (void) len; - return TRUE; + return (bool)((addr - NSEC_MEMORY_START) < + (NSEC_MEMORY_END - NSEC_MEMORY_START)) && + (bool)((addr + size - NSEC_MEMORY_START) < + (NSEC_MEMORY_END - NSEC_MEMORY_START)); } +static smc_service_t *smcGetService(const char *name, size_t namelen) { + registered_object_t *rop; + + if (!isAddrSpaceValid((uint8_t *)name, namelen)) + return NULL; + if (*(name + namelen) != '\0') + return NULL; + rop = chFactoryFindObject(name); + if (rop == NULL) + return NULL; + return (smc_service_t *)(rop->objp); +} + +#if 0 /* not used yet */ +static void smcReleaseService(smc_service_t *svc_handle) { + registered_object_t *rop; + + rop = chFactoryFindObjectByPointer(svc_handle); + if (rop == NULL) + return; + chFactoryReleaseObject(rop); +} +#endif + /*===========================================================================*/ /* Module exported functions. */ /*===========================================================================*/ @@ -72,12 +96,6 @@ void smcInit(void) { 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. @@ -93,13 +111,20 @@ registered_object_t *smcFindService(const char *name, uint32_t namelen) { * * @notapi */ -msg_t smcEntry(smc_service_t *svc_handle, smc_params_area_t svc_data, uint32_t svc_datalen) { +msg_t smcEntry(smc_service_t *svc_handle, smc_params_area_t svc_data, size_t svc_datalen) { registered_object_t *rop; + smc_service_t *svcp; msg_t r; asm("bkpt #0\n\t"); - if (!isAddrspaceValid(svc_data, svc_datalen)) + if (!isAddrSpaceValid(svc_data, svc_datalen)) return MSG_RESET; + if (svc_handle == SMC_HND_GET) { + svcp = smcGetService((const char *)svc_data, svc_datalen); + if (svcp == NULL) + return MSG_RESET; + return (msg_t)svcp; + } rop = chFactoryFindObjectByPointer(svc_handle); if (rop == NULL) return MSG_RESET; diff --git a/os/common/ports/ARMCAx-TZ/chsmc.h b/os/common/ports/ARMCAx-TZ/chsmc.h index 4acab838b..885a2c83c 100644 --- a/os/common/ports/ARMCAx-TZ/chsmc.h +++ b/os/common/ports/ARMCAx-TZ/chsmc.h @@ -45,8 +45,15 @@ /* * Special service handles */ -#define SMC_HND_TRAMP 0 -#define SMC_HND_FIND 1 +#define SMC_HND_TRAMP ((smc_service_t *)0) +#define SMC_HND_GET ((smc_service_t *)1) + +/* + * Non secure memory address space + * (to be redefined in an other place. Makefile?) + */ +#define NSEC_MEMORY_START ((uint8_t *)0x20000000) +#define NSEC_MEMORY_END ((uint8_t *)0x20100000) /*===========================================================================*/ /* Module pre-compile time settings. */ @@ -81,7 +88,6 @@ extern "C" { extern thread_reference_t _ns_thread; CC_NO_RETURN void _ns_trampoline(uint32_t addr); void smcInit(void); -msg_t smc_entry(msg_t svc_number, void *svc_data); registered_object_t * smcRegisterMeAsService(const char *svc_name); msg_t smcServiceWaitRequest(smc_service_t *svcp); #ifdef __cplusplus -- cgit v1.2.3