Added local gate for NULL service callback and fixed bug where resource node offset...
authorJustin Sobota <jsobota@ti.com>
Mon, 4 Mar 2013 23:06:39 +0000 (18:06 -0500)
committerJustin Sobota <jsobota@ti.com>
Mon, 4 Mar 2013 23:06:39 +0000 (18:06 -0500)
include/rm_loc.h
rm_osal.h
src/rm_policy.c
test/rm_osal.c
test/rm_test.c

index a2776685e63707c36e5b21c1b049f66bf5d0d9dc..d351977c2f6f97a1b645ac0aee6607cb0ad5ab8f 100644 (file)
@@ -149,7 +149,7 @@ typedef struct {
     Rm_Transaction   *transactionQueue; 
     /* Local gate key provided through OSAL when RM needs to block due to
      * a service request that requires a blocking operation to complete */
-    void             *localGateKey;
+    uint32_t          localGateKey;
     /* Instance-type specific constructs */
     union {
         /* Server-specific instance data */
index b9167e537ed521dd5a3ee8829ffe01cb09242ae9..843b5edc0657d1318a3be83161b57841022b8017 100644 (file)
--- a/rm_osal.h
+++ b/rm_osal.h
  ************************* Extern Declarations ************************
  **********************************************************************/
 
-extern void *Osal_rmMalloc (uint32_t num_bytes);
-extern void  Osal_rmFree (void *ptr, uint32_t size);
-extern void *Osal_rmLocalGateEnter (void);
-extern void  Osal_rmLocalGateLeave (void *localGateKey);
-extern void  Osal_rmLog (char *fmt, ... );
+extern void     *Osal_rmMalloc (uint32_t num_bytes);
+extern void      Osal_rmFree (void *ptr, uint32_t size);
+extern uint32_t  Osal_rmLocalGateEnter (void);
+extern void      Osal_rmLocalGateLeave (uint32_t localGateKey);
+extern void      Osal_rmLog (char *fmt, ... );
 
 /**
  * @brief   The macro is used by RM to allocate memory of specified
@@ -120,7 +120,6 @@ extern void  Osal_rmLog (char *fmt, ... );
  */
 #define Rm_osalFree               Osal_rmFree
 
-
 #define Rm_osalLocalGateEnter     Osal_rmLocalGateEnter
 
 #define Rm_osalLocalGateLeave     Osal_rmLocalGateLeave
index 8f39d55c2ab4a9faf775601d85f0fcc6e861f1f5..8e2a7c74e9a9d54dbc5ed15755aac831cf1cf14b 100644 (file)
@@ -767,6 +767,11 @@ int32_t rmPolicyGetResourceOffset(void *policyDtb, char *resourceName)
             break;
         }
     }
+
+    if (depth < RM_DTB_UTIL_STARTING_DEPTH) {
+        /* Resource name not found */
+        nodeOffset = RM_SERVICE_DENIED_RES_DOES_NOT_EXIST;
+    }
     return(nodeOffset);
 }
 
index 4b8c65f3c9dfe0aaf6f52ae51e97bdd7bf115d25..1216bcf9759ebb48852cf2a549d54a4668a8fca7 100644 (file)
  *
  *  \par
 */
+
+/* Standard Includes */
 #include <stdarg.h>
 
+/* XDC Includes */
 #include <xdc/std.h>
 #include <xdc/runtime/Memory.h>
 #include <xdc/runtime/Error.h>
 #include <xdc/runtime/System.h>
 
+/* IPC Includes */
+#include <ti/ipc/GateMP.h>
+
 /**********************************************************************
  ****************************** Defines *******************************
  **********************************************************************/
+#define RM_INTERNAL_GATE_NAME "rmInternalLocalGate"
 
 /**********************************************************************
  ************************** Global Variables **************************
@@ -55,6 +62,8 @@
 uint32_t rmMallocCounter = 0;
 uint32_t rmFreeCounter   = 0;
 
+GateMP_Handle rmInternalGateHandle;
+
 /**********************************************************************
  *************************** OSAL Functions **************************
  **********************************************************************/
@@ -89,18 +98,26 @@ void Osal_rmFree (void *ptr, uint32_t size)
 
 void Osal_rmLocalGateInit (void)
 {
-
+    GateMP_Params gateParams;
+
+    /* Create a GateMP object to be use as a resource lock */
+    GateMP_Params_init(&gateParams);
+    gateParams.name = RM_INTERNAL_GATE_NAME;    
+    /* Local protection for multiple threads, uses a BIOS GateMutexPri */
+    gateParams.localProtect = GateMP_LocalProtect_THREAD;
+    /* No remote protection because we're not going between cores */
+    gateParams.remoteProtect = GateMP_RemoteProtect_NONE;
+    rmInternalGateHandle = GateMP_create(&gateParams);
 }
 
-void *Osal_rmLocalGateEnter (void)
+uint32_t Osal_rmLocalGateEnter (void)
 {
-
-    return (NULL);
+    return ((uint32_t)GateMP_enter(rmInternalGateHandle));
 }
 
-void  Osal_rmLocalGateLeave (void *localGateKey)
+void Osal_rmLocalGateLeave (uint32_t localGateKey)
 {
-
+    GateMP_leave(rmInternalGateHandle, (IArg)localGateKey);
 }
 
 /* FUNCTION PURPOSE: Prints a variable list
index 00cf52acfc4138c166dd60e9e4650c4a2e72c460..173a5f2cf6e41d471ed385c8746598f37efa44b6 100644 (file)
@@ -140,6 +140,9 @@ extern const char rmGlobalPolicy[];
 /* RM test Static Policy provided to RM Client Delegate and Client */
 extern const char rmStaticPolicy[];
 
+/* OSAL RM Local Gate Initialization. */
+extern void Osal_rmLocalGateInit (void);
+
 /**********************************************************************
  ********************** Global Variables ******************************
  **********************************************************************/
@@ -991,7 +994,7 @@ void rmClientTsk(UArg arg0, UArg arg1)
     while (numStaticResponses > 0) {
         /* Loop until all static request validations have been received */
         for (i = 0; i < MAX_STATIC_ALLOCATION_RESPS; i++) {
-            if (staticResponseQueue[i].serviceId != 0) {
+            if (staticResponseQueue[i].serviceId != 0) {            
                 for (j = 0; j < MAX_QUEUED_SERVICE_RESPONSES; j++) {
                     if ((staticResponseQueue[i].serviceId == responseInfoQueue[j].serviceId) &&
                         (staticResponseQueue[i].rmHandle == responseInfoQueue[j].rmHandle)) {
@@ -1264,6 +1267,10 @@ void rmStartupTsk(UArg arg0, UArg arg1)
         System_printf("Core %d: Registered RM Client <=> RM CD transport with RM Client instance\n", coreNum);
     }
 
+    /* Create the gate internal to RM for service requests not specifying a callback function
+     * and needing a blocking operation to complete */
+    Osal_rmLocalGateInit();
+
     /* Create the RM receive task.  Assign higher priority than the test tasks so that
      * when they spin waiting for messages from other RM instances the receive task is
      * executed. */
@@ -1272,7 +1279,6 @@ void rmStartupTsk(UArg arg0, UArg arg1)
     taskParams.priority = 2;
     rmReceiveTskHandle = Task_create (rmReceiveTsk, &taskParams, NULL);
     
-    
     /* Create the RM test tasks. */
     if (coreNum == 0) {
         System_printf("Core %d: Creating RM server task...\n", coreNum);