Prevent SR0 owner from being stopped if host process is still using GateMP
authorvwan@ti.com <vwan@ti.com>
Sun, 12 Oct 2014 22:58:54 +0000 (15:58 -0700)
committerRobert Tivy <rtivy@ti.com>
Tue, 14 Oct 2014 20:43:25 +0000 (13:43 -0700)
Signed-off-by: VW <vwan@ti.com>
qnx/src/api/gates/GateMP.c
qnx/src/ipc3x_dev/ti/syslink/build/Qnx/resmgr/dcmd_syslink.h
qnx/src/ipc3x_dev/ti/syslink/build/Qnx/resmgr/syslink_main.c
qnx/src/ipc3x_dev/ti/syslink/inc/GateMPDrvDefs.h
qnx/src/ipc3x_dev/ti/syslink/inc/_GateMP_daemon.h
qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/knl/GateMP_daemon.c
qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/knl/Qnx/gatemp_devctl.c
qnx/src/ipc3x_dev/ti/syslink/ipc/hlos/usr/Qnx/GateMPDrv.c

index b3f3250da959695661f1343f42e1dae2978cd927..9641dfb6c7dac711c2d35f10cfa988356a564f1c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Texas Instruments Incorporated
+ * Copyright (c) 2013-2014, Texas Instruments Incorporated
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -179,6 +179,7 @@ Int GateMP_start(Void)
 Int GateMP_stop(Void)
 {
     Int status = GateMP_S_SUCCESS;
+    GateMPDrv_CmdArgs cmdArgs;
 
     PRINTVERBOSE0("GateMP_stop: entered\n")
 
@@ -194,6 +195,16 @@ Int GateMP_stop(Void)
         GateMP_module->remoteSystemGates = NULL;
     }
 
+    /* Call stop in resource manager if necessary */
+    if (GateMP_module->nameServer != NULL) {
+        GateMP_module->nameServer = NULL;
+        status = GateMPDrv_ioctl(CMD_GATEMP_STOP, &cmdArgs);
+        if (status < 0) {
+            PRINTVERBOSE1("GateMP_stop: API (through IOCTL) failed, \
+                status=%d\n", status)
+        }
+    }
+
     GateMP_module->isStarted = FALSE;
 
     return status;
@@ -271,6 +282,12 @@ Int GateMP_open(String name, GateMP_Handle *handle)
         status = GateMP_E_INVALIDARG;
     }
 
+    if (GateMP_module->nameServer == NULL) {
+        PRINTVERBOSE0("GateMP_open: NameServer handle is null")
+        PRINTVERBOSE0("GateMP_open: Make sure GateMP_start is called")
+        status = GateMP_E_INVALIDSTATE;
+    }
+
     if (status == GateMP_S_SUCCESS) {
         len = sizeof(nsValue);
 
@@ -379,7 +396,7 @@ Int GateMP_open(String name, GateMP_Handle *handle)
 
 GateMP_Handle GateMP_getDefaultRemote()
 {
-    return(GateMP_module->defaultGate);
+    return (GateMP_module->defaultGate);
 }
 
 GateMP_LocalProtect GateMP_getLocalProtect(GateMP_Handle handle)
@@ -387,7 +404,7 @@ GateMP_LocalProtect GateMP_getLocalProtect(GateMP_Handle handle)
     GateMP_Object *obj;
 
     obj = (GateMP_Object *)handle;
-    return(obj->localProtect);
+    return (obj->localProtect);
 }
 
 GateMP_RemoteProtect GateMP_getRemoteProtect(GateMP_Handle handle)
@@ -524,9 +541,6 @@ static Int GateMP_Instance_init(GateMP_Object *obj,
 {
     GateMP_RemoteSystemProxy_Params     systemParams;
     UInt32                              nsValue[4];
-    Int                                 status;
-
-    status = 0;
 
     obj->resourceId = (UInt)-1;
 
index 5cfbff3d6ac1f9c97c4206b3e96b130875cb7ba9..b047c20038106a1db848886b6caa34d60bb8abb7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Texas Instruments Incorporated
+ * Copyright (c) 2013-2014, Texas Instruments Incorporated
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -209,11 +209,18 @@ typedef enum {
                                             4,\
                                             GateMPDrv_CmdArgs)
 
+/*!
+ *  @brief  Command for GateMP_stop
+ */
+#define DCMD_GATEMP_STOP                    __DIOTF(_DCMD_SYSLINK_GATEMP,\
+                                            5,\
+                                            GateMPDrv_CmdArgs)
+
 /*!
  *  @brief  Command for GateMP_isSetup
  */
 #define DCMD_GATEMP_ISSETUP                 __DIOTF(_DCMD_SYSLINK_GATEMP,\
-                                            5,\
+                                            6,\
                                             GateMPDrv_CmdArgs)
 
 #if defined (__cplusplus)
index d1ac04a1257e128849a230f4d7af5d597bdf9521..52f536657a676952bb6ee1d73086c853b3628413 100644 (file)
@@ -486,6 +486,19 @@ static int slave_state_write(resmgr_context_t *ctp, io_write_t *msg,
     }
     else if (strcmp("0", buf) == 0) {
         if (syslink_firmware[i].procState == RUNNING_STATE) {
+#if defined(SYSLINK_PLATFORM_VAYU)
+            if ((gatempEnabled) && (procid == sr0OwnerProcId)) {
+                sr0OwnerProcId = -1;
+                status = GateMP_destroy(FALSE);
+                if (status < 0) {
+                    pthread_mutex_unlock(&dev->firmwareLock);
+                    free(buf);
+                    fprintf(stderr, "Core %s cannot be reset. GateMP may still"
+                        " be in use by host\n", MultiProc_getName(procid));
+                    return (EIO);
+                }
+            }
+#endif
             resetSlave(ocb->ocb.attr->dev, procid);
             syslink_firmware[i].procState = RESET_STATE;
             syslink_firmware[i].reload = false;
@@ -497,12 +510,6 @@ static int slave_state_write(resmgr_context_t *ctp, io_write_t *msg,
                     status);
                 return (EIO);
             }
-#if defined(SYSLINK_PLATFORM_VAYU)
-            if ((gatempEnabled) && (procid == sr0OwnerProcId)) {
-                sr0OwnerProcId = -1;
-                GateMP_destroy();
-            }
-#endif
             printf("Core %s has been reset.\n", MultiProc_getName(procid));
         }
     }
@@ -1429,7 +1436,7 @@ int deinit_ipc(syslink_dev_t * dev, syslink_firmware_info * firmware,
 
 #if defined(SYSLINK_PLATFORM_VAYU)
     if (gatempEnabled) {
-        GateMP_destroy();
+        GateMP_destroy(TRUE);
 
         NameServer_destroy();
     }
index f26d108fe43136be1bdf8124aa3f314e68b9974b..da7363198b42cb0c4357a957f9d35e4bb3bb0227 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Texas Instruments Incorporated
+ * Copyright (c) 2013-2014, Texas Instruments Incorporated
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -88,11 +88,17 @@ extern "C" {
 #define CMD_GATEMP_START                _IOWR(UTILSCMDBASE,\
                                             GATEMP_BASE_CMD + 4u,\
                                             GateMPDrv_CmdArgs)
+/*!
+ *  @brief  Command for GateMP_stop
+ */
+#define CMD_GATEMP_STOP                 _IOWR(UTILSCMDBASE,\
+                                            GATEMP_BASE_CMD + 5u,\
+                                            GateMPDrv_CmdArgs)
 /*!
  *  @brief  Command for GateMP_isSetup
  */
 #define CMD_GATEMP_ISSETUP              _IOWR(UTILSCMDBASE,\
-                                            GATEMP_BASE_CMD + 5u,\
+                                            GATEMP_BASE_CMD + 6u,\
                                             GateMPDrv_CmdArgs)
 
 
index bdb103aa8395ac6426e2cf6e769d2191a2f93161..87c4f11a679c3a9c07077dbfa8dceeff0261bf85 100644 (file)
@@ -53,9 +53,11 @@ extern "C" {
 Int GateMP_setup(Int32 * sr0ProcId);
 
 /*!
- * Function to destroy the GateMP module.
+ * Function to destroy the GateMP module. If forced is set
+ * we terminate the module regardless of whether there
+ * are processes that are using GateMP on the host.
  */
-Void GateMP_destroy(Void);
+Int GateMP_destroy(Bool forced);
 
 /*!
  * Find a free resource id for a particular protection type.
index 60df71ee4f7197bc1b825cc804b3393de46b0b58..15e588a02ec51b5f06dc60ff4d7de8abaa0f9967 100644 (file)
@@ -82,15 +82,17 @@ extern "C" {
 
 /* structure for GateMP module state */
 typedef struct {
-    Int               numRemoteSystem;
-    Int               numRemoteCustom1;
-    Int               numRemoteCustom2;
-    UInt8 *           remoteSystemInUse;
-    UInt8 *           remoteCustom1InUse;
-    UInt8 *           remoteCustom2InUse;
-    GateMP_Handle     defaultGate;
-    NameServer_Handle nameServer;
-    Bool              isSetup;
+    Int                numRemoteSystem;
+    Int                numRemoteCustom1;
+    Int                numRemoteCustom2;
+    UInt8 *            remoteSystemInUse;
+    UInt8 *            remoteCustom1InUse;
+    UInt8 *            remoteCustom2InUse;
+    GateMP_Handle      defaultGate;
+    NameServer_Handle  nameServer;
+    Bool               isSetup;
+    UInt32             startCount;   /* number of times GateMP is started */
+    pthread_mutex_t    lock;
 } GateMP_ModuleObject;
 
 /* Internal functions */
@@ -114,7 +116,9 @@ static GateMP_ModuleObject GateMP_state = {
     .remoteCustom2InUse              = NULL,
     .defaultGate                     = NULL,
     .nameServer                      = NULL,
-    .isSetup                         = FALSE
+    .isSetup                         = FALSE,
+    .startCount                      = 0,
+    .lock                            = PTHREAD_RMUTEX_INITIALIZER
 };
 
 static GateMP_ModuleObject * GateMP_module = &GateMP_state;
@@ -141,6 +145,13 @@ Int GateMP_setup(Int32 * sr0ProcId)
     /* Assume info entry has more fields than other entries */
     params.maxValueLen = NUM_INFO_FIELDS * sizeof(UInt32);
 
+    pthread_mutex_lock(&GateMP_module->lock);
+
+    if (GateMP_module->isSetup) {
+        pthread_mutex_unlock(&GateMP_module->lock);
+        return (GateMP_S_ALREADYSETUP);
+    }
+
     GateMP_module->nameServer =
                 NameServer_create(GateMP_NAMESERVER, &params);
 
@@ -228,17 +239,27 @@ Int GateMP_setup(Int32 * sr0ProcId)
 
     /* clean up if error */
     if (status < 0) {
-        GateMP_destroy();
+        GateMP_destroy(TRUE);
     }
     else {
         GateMP_module->isSetup = TRUE;
     }
 
+    pthread_mutex_unlock(&GateMP_module->lock);
+
     return (status);
 }
 
-Void GateMP_destroy(Void)
+Int GateMP_destroy(Bool forced)
 {
+    pthread_mutex_lock(&GateMP_module->lock);
+
+    if ((!forced) && (GateMP_module->startCount != 0)) {
+        /* Some process on the host is still using GateMP */
+        pthread_mutex_unlock(&GateMP_module->lock);
+        return (GateMP_E_FAIL);
+    }
+
     if (GateMP_module->remoteSystemInUse) {
         munmap((unsigned int *)GateMP_module->remoteSystemInUse,
             GateMP_module->numRemoteSystem * sizeof (UInt8));
@@ -268,7 +289,9 @@ Void GateMP_destroy(Void)
 
     GateMP_module->isSetup = FALSE;
 
-    return;
+    pthread_mutex_unlock(&GateMP_module->lock);
+
+    return (GateMP_S_SUCCESS);
 }
 
 /* Open default gate during GateMP_setup. Should only be called once */
@@ -490,6 +513,44 @@ NameServer_Handle GateMP_getNameServer(Void)
     return (GateMP_module->nameServer);
 }
 
+Int GateMP_start(Void)
+{
+    Int status = GateMP_S_SUCCESS;
+
+    pthread_mutex_lock(&GateMP_module->lock);
+
+    if (GateMP_isSetup()) {
+        GateMP_module->startCount++;
+    }
+    else {
+        /* Cannot start GateMP if it is not setup */
+        status = GateMP_E_FAIL;
+    }
+
+    pthread_mutex_unlock(&GateMP_module->lock);
+
+    return (status);
+}
+
+Int GateMP_stop(Void)
+{
+    Int status = GateMP_S_SUCCESS;
+
+    pthread_mutex_lock(&GateMP_module->lock);
+
+    if (GateMP_isSetup()) {
+        GateMP_module->startCount--;
+    }
+    else {
+        /* Cannot stop GateMP if it is not setup */
+        status = GateMP_E_FAIL;
+    }
+
+    pthread_mutex_unlock(&GateMP_module->lock);
+
+    return (status);
+}
+
 Bool GateMP_isSetup(Void)
 {
     return (GateMP_module->isSetup);
index 65592723f3c6744f4fc71fe408ac5fce1275df7a..11f33e226ab35bd1639997cc932d31b1817ebf3e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013 Texas Instruments Incorporated - http://www.ti.com
+ * Copyright (c) 2013-2014 Texas Instruments Incorporated - http://www.ti.com
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -103,6 +103,12 @@ int syslink_gatemp_devctl(resmgr_context_t *ctp, io_devctl_t *msg,
       }
       break;
 
+      case DCMD_GATEMP_STOP:
+      {
+          return syslink_gatemp_stop(ctp, msg, ocb);
+      }
+      break;
+
       case DCMD_GATEMP_ISSETUP:
       {
           return syslink_gatemp_isSetup(ctp, msg, ocb);
@@ -222,7 +228,33 @@ int syslink_gatemp_start(resmgr_context_t *ctp, io_devctl_t *msg,
         (_DEVCTL_DATA (msg->o));
 
     cargs->args.start.nameServerHandle = GateMP_getNameServer();
-    out->apiStatus = GateMP_S_SUCCESS;
+    out->apiStatus = GateMP_start();
+
+    return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
+        sizeof(GateMPDrv_CmdArgs)));
+}
+
+/**
+ * Handler for gatemp stop API.
+ *
+ * \param ctp   Thread's associated context information.
+ * \param msg   The actual devctl() message.
+ * \param ocb   OCB associated with client's session.
+ *
+ * \return POSIX errno value.
+ *
+ * \retval EOK      Success.
+ * \retval ENOTSUP  Unsupported devctl().
+ */
+int syslink_gatemp_stop(resmgr_context_t *ctp, io_devctl_t *msg,
+    syslink_ocb_t *ocb)
+{
+    GateMPDrv_CmdArgs * cargs = (GateMPDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->i));
+    GateMPDrv_CmdArgs * out  = (GateMPDrv_CmdArgs *)
+        (_DEVCTL_DATA (msg->o));
+
+    out->apiStatus = GateMP_stop();
 
     return (_RESMGR_PTR (ctp, &msg->o, sizeof(msg->o) +
         sizeof(GateMPDrv_CmdArgs)));
index d750a7156688f102458d7a40ae79520906f28cda..043bae090da2422e19947f70658903c58f74dcb0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013 Texas Instruments Incorporated - http://www.ti.com
+ * Copyright (c) 2013-2014 Texas Instruments Incorporated - http://www.ti.com
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -146,6 +146,17 @@ Int GateMPDrv_ioctl(UInt32 cmd, Ptr args)
       }
       break;
 
+      case CMD_GATEMP_STOP:
+      {
+          osStatus = devctl(IpcDrv_handle, DCMD_GATEMP_STOP, cargs,
+              sizeof(GateMPDrv_CmdArgs), NULL);
+
+          if (osStatus != 0) {
+              status = GateMP_E_OSFAILURE;
+          }
+      }
+      break;
+
       case CMD_GATEMP_ISSETUP:
       {
           osStatus = devctl(IpcDrv_handle, DCMD_GATEMP_ISSETUP, cargs,