aboutsummaryrefslogtreecommitdiffstats
path: root/os/common/ports/ARMCAx-TZ
diff options
context:
space:
mode:
authorisiora <none@example.com>2018-01-19 14:16:49 +0000
committerisiora <none@example.com>2018-01-19 14:16:49 +0000
commit1168c5ddc60e0736fe3190a43abac0de85dfe947 (patch)
tree8b6b8a6389d4f0884ec088322e2e394026ff06a3 /os/common/ports/ARMCAx-TZ
parent9b492024bd2a29f1be65eece6506eb2939b1681c (diff)
downloadChibiOS-1168c5ddc60e0736fe3190a43abac0de85dfe947.tar.gz
ChibiOS-1168c5ddc60e0736fe3190a43abac0de85dfe947.tar.bz2
ChibiOS-1168c5ddc60e0736fe3190a43abac0de85dfe947.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11352 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/common/ports/ARMCAx-TZ')
-rw-r--r--os/common/ports/ARMCAx-TZ/chsmc.c51
-rw-r--r--os/common/ports/ARMCAx-TZ/chsmc.h12
2 files changed, 47 insertions, 16 deletions
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 <string.h>
#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