diff options
Diffstat (limited to 'demos/ATSAMA5D2')
3 files changed, 467 insertions, 0 deletions
diff --git a/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tscommon.h b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tscommon.h new file mode 100644 index 000000000..29216a92c --- /dev/null +++ b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tscommon.h @@ -0,0 +1,84 @@ +/*
 +    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 <http://www.gnu.org/licenses/>.
 +*/
 +
 +/**
 + * @file    tscommon.h
 + * @brief   Common, shared defines and macros between secure and non secure
 + *          environment.
 + *
 + */
 +
 +#ifndef TSCOMMON_H
 +#define TSCOMMON_H
 +
 +#include "ch.h"
 +#include "ccportab.h"
 +
 +/*===========================================================================*/
 +/* Module constants.                                                         */
 +/*===========================================================================*/
 +#define SKEL_REQ_GETOP    1
 +#define SKEL_REQ_CPYPRMS  2
 +#define SKEL_REQ_PUTRES   3
 +
 +#define STUB_OP_SOCKET    0
 +#define STUB_OP_CLOSE     1
 +#define STUB_OP_CONNECT   2
 +#define STUB_OP_RECV      3
 +#define STUB_OP_SEND      4
 +#define STUB_OP_SELECT    5
 +#define STUB_OP_BIND      6
 +
 +#define EVT_F_SOCK_NEW_OP 1
 +
 +/*===========================================================================*/
 +/* Module pre-compile time settings.                                         */
 +/*===========================================================================*/
 +#define METHOD_MAX_PARAMS   6
 +
 +#define L_FD_SETSIZE  64
 +
 +/*===========================================================================*/
 +/* Derived constants and error checks.                                       */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* Module data structures and types.                                         */
 +/*===========================================================================*/
 +typedef struct skel_req {
 +  uint32_t  req;        /* getop, cpyprms, putres */
 +  uint32_t  stub_op;
 +  uint32_t  stub_op_code;
 +  uint32_t  stub_op_result;
 +  uint32_t  stub_op_p[METHOD_MAX_PARAMS];
 +} skel_req_t;
 +
 +/*===========================================================================*/
 +/* Module macros.                                                            */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* External declarations.                                                    */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* Module inline functions.                                                  */
 +/*===========================================================================*/
 +
 +#endif /* TSCOMMON_H */
 diff --git a/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.c b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.c new file mode 100644 index 000000000..8ca60ad59 --- /dev/null +++ b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.c @@ -0,0 +1,306 @@ +/*
 +    ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
 +
 +    Licensed under the Apache License, Version 2.0 (the "License");
 +    you may not use this file except in compliance with the License.
 +    You may obtain a copy of the License at
 +
 +        http://www.apache.org/licenses/LICENSE-2.0
 +
 +    Unless required by applicable law or agreed to in writing, software
 +    distributed under the License is distributed on an "AS IS" BASIS,
 +    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 +    See the License for the specific language governing permissions and
 +    limitations under the License.
 +*/
 +
 +/**
 + * @file    tssockskel.c
 + * @brief   Sockets skeleton daemon for trusted clients.
 + *
 + */
 +
 +#include "ch.h"
 +#include "tsclient.h"
 +#include "tssockskel.h"
 +#include <string.h>
 +
 +/*===========================================================================*/
 +/* Module local definitions.                                                 */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* Module exported variables.                                                */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* Module local types.                                                       */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* Module local variables.                                                   */
 +/*===========================================================================*/
 +
 +static ts_service_t tsStubsService;
 +
 +/*===========================================================================*/
 +/* Module local functions.                                                   */
 +/*===========================================================================*/
 +
 +/**
 + * @brief Invoke the stubs service in order to copy the 'in'
 + *        parameters in the non secure memory space.
 + */
 +static void paramsInFromRemote(skel_req_t *skreqp) {
 +  msg_t r;
 +
 +  skreqp->req = SKEL_REQ_CPYPRMS;
 +  while (TRUE) {
 +    r = tsInvokeServiceNoYield(tsStubsService,
 +          (ts_params_area_t)skreqp, sizeof *skreqp);
 +    if (r != SMC_SVC_BUSY)
 +      break;
 +    chThdSleepMicroseconds(TS_GRANTED_TIMESLICE);
 +  }
 +}
 +
 +/**
 + * @brief Invoke the stubs service in order to copy the 'out'
 + *        parameters in the secure memory space and set the
 + *        remote call result.
 + */
 +static void returnToRemote(skel_req_t *skreqp, uint32_t res) {
 +  msg_t r;
 +
 +  skreqp->stub_op_result = res;
 +  skreqp->req = SKEL_REQ_PUTRES;
 +
 +  while (TRUE) {
 +    r = tsInvokeServiceNoYield(tsStubsService,
 +          (ts_params_area_t)skreqp, sizeof *skreqp);
 +    if (r != SMC_SVC_BUSY)
 +      break;
 +    chThdSleepMicroseconds(TS_GRANTED_TIMESLICE);
 +  }
 +}
 +
 +/**
 + * @name    Sockets API skeletons.
 + * @{
 + */
 +
 +/**
 + * @brief int socket(int domain, int type, int protocol)
 + */
 +static void l_socket(skel_req_t *skreqp) {
 +  int result;
 +
 +  /* call the api exposed by the TCP/IP stack.*/
 +  result = socket((int)skreqp->stub_op_p[0],
 +                  (int)skreqp->stub_op_p[1],
 +                  (int)skreqp->stub_op_p[2]);
 +
 +  /* report the result and copy the 'out' parameters.*/
 +  returnToRemote(skreqp, result);
 +}
 +
 +/**
 + * @brief int connect(int s, const struct sockaddr *name, socklen_t namelen)
 + */
 +static void l_connect(skel_req_t *skreqp) {
 +  int s, result, socklen;
 +  struct sockaddr sockaddr;
 +
 +  s = (int)skreqp->stub_op_p[0];
 +  skreqp->stub_op_p[1] = (uint32_t)&sockaddr;
 +  socklen = (int)skreqp->stub_op_p[2];
 +
 +  /* Call the stub service in order to copy the 'in' parameter
 +     sockaddr.*/
 +  paramsInFromRemote(skreqp);
 +
 +  /* Call the api exposed by the TCP/IP stack.*/
 +  result = connect(s, &sockaddr, socklen);
 +
 +  /* Report the result.*/
 +  returnToRemote(skreqp, result);
 +}
 +
 +/**
 + * @brief int close(int s)
 + */
 +static void l_close(skel_req_t *skreqp) {
 +  int result;
 +
 +  /* Call the api exposed by the TCP/IP stack.*/
 +  result = close((int)skreqp->stub_op_p[0]);
 +
 +  /* report the result.*/
 +  returnToRemote(skreqp, result);
 +}
 +
 +
 +/**
 + * @brief int recv(int s, void *mem, size_t len, int flags)
 + */
 +static void l_recv(skel_req_t *skreqp) {
 +  int result;
 +  void *mem;
 +  size_t len;
 +
 +  len = skreqp->stub_op_p[2];
 +
 +  /* Allocate the space for the receive buffer.*/
 +  mem = chHeapAlloc(NULL, len);
 +  if (NULL == mem) {
 +    result = ENOMEM;
 +  } else {
 +
 +    /* call the api exposed by the TCP/IP stack.*/
 +    result = recv((int)skreqp->stub_op_p[0], mem, len,
 +        (int)skreqp->stub_op_p[3]);
 +  }
 +
 +  /* report the result and copy 'out' parameter mem.*/
 +  returnToRemote(skreqp, result);
 +  if (NULL != mem)
 +    chHeapFree(mem);
 +}
 +
 +/**
 + * @brief int send(int s, const void *dataptr, size_t size, int flags)
 + */
 +static void l_send(skel_req_t *skreqp) {
 +  int result;
 +  void *dataptr;
 +  size_t size;
 +
 +  size = skreqp->stub_op_p[2];
 +
 +  /* Allocate the space for the send buffer.*/
 +  dataptr = chHeapAlloc(NULL, size);
 +  if (NULL == dataptr) {
 +    result = ENOMEM;
 +  } else {
 +    skreqp->stub_op_p[1] = (uint32_t)dataptr;
 +
 +    /* call the stub service in order to copy the
 +       'in' parameter dataptr.*/
 +    paramsInFromRemote(skreqp);
 +
 +    /* call the api exposed by the TCP/IP stack.*/
 +    result = send((int)skreqp->stub_op_p[0], dataptr, size,
 +        (int)skreqp->stub_op_p[3]);
 +    chHeapFree(dataptr);
 +  }
 +
 +  /* report the result.*/
 +  returnToRemote(skreqp, result);
 +}
 +
 +
 +/**
 + * @brief int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
 + *                    struct timeval *timeout)
 + */
 +static void l_select(skel_req_t *skreqp) {
 +  int result;
 +  int maxfdpl;
 +  fd_set readset, writeset, exceptset;
 +  struct timeval timeout;
 +
 +  maxfdpl = skreqp->stub_op_p[0];
 +
 +  skreqp->stub_op_p[1] = (uint32_t)&readset;
 +  skreqp->stub_op_p[2] = (uint32_t)&writeset;
 +  skreqp->stub_op_p[3] = (uint32_t)&exceptset;
 +  skreqp->stub_op_p[4] = (uint32_t)&timeout;
 +
 +  /* call the stub service in order to copy the
 +     'in' parameter readset, writeset, exceptset and timeout.*/
 +  paramsInFromRemote(skreqp);
 +
 +  /* call the api exposed by the TCP/IP stack.*/
 +  result = select(maxfdpl, &readset, &writeset, &exceptset, &timeout);
 +
 +  /* report the result and the parameters readset, writeset and exceptset.*/
 +  returnToRemote(skreqp, result);
 +}
 +
 +/**
 + * @brief bind(int s, const struct sockaddr *name, socklen_t namelen);
 + */
 +static void l_bind(skel_req_t *skreqp) {
 +  int s, result, socklen;
 +  struct sockaddr sockaddr;
 +
 +  s = (int)skreqp->stub_op_p[0];
 +  skreqp->stub_op_p[1] = (uint32_t)&sockaddr;
 +  socklen = (int)skreqp->stub_op_p[2];
 +
 +  /* Call the stub service in order to copy the 'in' parameter
 +     sockaddr.*/
 +  paramsInFromRemote(skreqp);
 +
 +  /* Call the api exposed by the TCP/IP stack.*/
 +  result = bind(s, &sockaddr, socklen);
 +
 +  /* Report the result.*/
 +  returnToRemote(skreqp, result);
 +}
 +
 +/** @} */
 +
 +/*===========================================================================*/
 +/* Module exported functions.                                                */
 +/*===========================================================================*/
 +THD_WORKING_AREA(waTsSockSkelDaemon, 2048);
 +THD_FUNCTION(TsSockSkelDaemon, arg) {
 +  (void)arg;
 +
 +  event_listener_t  el;
 +  skel_req_t        skel_req;
 +  msg_t             r;
 +
 +  tsStubsService = (ts_service_t)tsInvokeServiceNoYield(TS_HND_DISCOVERY,
 +      (ts_params_area_t)"TsStubsService", sizeof "TsStubsService");
 +  chEvtRegisterMaskWithFlags(&stubsEventSource, &el, ALL_EVENTS, EVT_F_SOCK_NEW_OP);
 +  for (;/* ever */;) {
 +    chEvtWaitAny(ALL_EVENTS);
 +    (void)chEvtGetAndClearFlags(&el);
 +    skel_req.req = SKEL_REQ_GETOP;
 +    while ((r = tsInvokeServiceNoYield(tsStubsService,
 +        (ts_params_area_t)&skel_req, sizeof skel_req)) != SMC_SVC_NHND) {
 +      if (r == SMC_SVC_BUSY) {
 +        chThdSleepMicroseconds(TS_GRANTED_TIMESLICE);
 +        continue;
 +      }
 +      switch (skel_req.stub_op_code) {
 +      case STUB_OP_SOCKET:
 +        l_socket(&skel_req);
 +        break;
 +      case STUB_OP_CONNECT:
 +        l_connect(&skel_req);
 +        break;
 +      case STUB_OP_CLOSE:
 +        l_close(&skel_req);
 +        break;
 +      case STUB_OP_RECV:
 +        l_recv(&skel_req);
 +        break;
 +      case STUB_OP_SEND:
 +        l_send(&skel_req);
 +        break;
 +      case STUB_OP_SELECT:
 +        l_select(&skel_req);
 +        break;
 +      case STUB_OP_BIND:
 +        l_bind(&skel_req);
 +        break;
 +      default:
 +        break;
 +      }
 +      skel_req.req = SKEL_REQ_GETOP;
 +    }
 +  }
 +}
 diff --git a/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.h b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.h new file mode 100644 index 000000000..e7408f908 --- /dev/null +++ b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.h @@ -0,0 +1,77 @@ +/*
 +    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 <http://www.gnu.org/licenses/>.
 +*/
 +
 +/**
 + * @file    tssockskel.h
 + * @brief   Sockets skeleton module macros and structures.
 + *
 + */
 +
 +#ifndef TSSOCKSKEL_H
 +#define TSSOCKSKEL_H
 +
 +#include "ch.h"
 +#include "ccportab.h"
 +#include "lwip/sockets.h"
 +#include "tscommon.h"
 +
 +/*===========================================================================*/
 +/* Module constants.                                                         */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* Module pre-compile time settings.                                         */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* Derived constants and error checks.                                       */
 +/*===========================================================================*/
 +#if (L_FD_SETSIZE) != (FD_SETSIZE)
 +#error "Configuration error of L_FD_SETSIZE, it must be set to FD_SETSIZE "
 +#define VALUE(x) #x
 +#define VAR_NAME_VALUE(var) #var "="  VALUE(var)
 +#pragma message(VAR_NAME_VALUE(FD_SETSIZE))
 +#endif
 +
 +/*===========================================================================*/
 +/* Module data structures and types.                                         */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* Module macros.                                                            */
 +/*===========================================================================*/
 +
 +/*===========================================================================*/
 +/* External declarations.                                                    */
 +/*===========================================================================*/
 +
 +#ifdef __cplusplus
 +extern "C" {
 +#endif
 +  THD_FUNCTION(TsSockSkelDaemon, tsstate);
 +  extern THD_WORKING_AREA(waTsSockSkelDaemon, 2048);
 +#ifdef __cplusplus
 +}
 +#endif
 +
 +/*===========================================================================*/
 +/* Module inline functions.                                                  */
 +/*===========================================================================*/
 +
 +#endif /* TSSOCKSKEL_H */
  | 
