Return warning when opening CD instance due to instabilities. Fixed policy verificat...
authorJustin Sobota <jsobota@ti.com>
Thu, 16 May 2013 22:16:59 +0000 (18:16 -0400)
committerJustin Sobota <jsobota@ti.com>
Thu, 16 May 2013 22:16:59 +0000 (18:16 -0400)
rm.h
src/rm.c
src/rm_policy.c
test/src/rm_mem_test.c
test/src/rm_test.c

diff --git a/rm.h b/rm.h
index 91947c78aa9bc74868f6dc3ddef8940075dba594..349508b8ddf111b7ded33421d58416714b290ab0 100644 (file)
--- a/rm.h
+++ b/rm.h
@@ -233,6 +233,11 @@ extern "C" {
 /** Status request resource range partially found (Handling of partial status requests not yet implemented) */
 #define RM_SERVICE_DENIED_PARTIAL_STATUS           RM_SERVICE_DENIED_BASE+18
 
+/** RM Client Delegate instance is not stable.  RM system operation cannot be guarateed
+ *  if a CD instance is used.  At the time please manage resources using Server and Client
+ *  instances - tracked by SDOCM00100797 */
+#define RM_WARNING_CD_INSTANCE_NOT_STABLE          (-1024)
+
 /** Start of libfdt.h error codes */
 #define RM_ERROR_LIBFDT_START                      (-1)
 /** End of libfdt.h error codes */
index f82d62b48e6d6ea6c3d08a5446066da10ad733f2..e99d5190d9a8a5db815b2683bd0a6b783b214636 100644 (file)
--- a/src/rm.c
+++ b/src/rm.c
@@ -1530,6 +1530,9 @@ Rm_Handle Rm_init(const Rm_InitCfg *initCfg, int32_t *result)
         }
 
         rmInst->u.cd.allocators = NULL;
+
+        /* Remove once CD instance is stable - tracked by SDOCM00100797 */
+        *result = RM_WARNING_CD_INSTANCE_NOT_STABLE;
     }
     else if (rmInst->instType == Rm_instType_CLIENT) {
         if (initCfg->instCfg.clientCfg.staticPolicy) { 
index 418a19737df32c4326b3f1c8be887360066a2ece..d83b4bc7273c9fb26248a80f52a8fd99b7dd3895 100644 (file)
@@ -806,12 +806,12 @@ int32_t rmPolicyGetResourceOffset(void *policyDtb, char *resourceName)
         nodeOffset = RM_DTB_UTIL_STARTING_NODE_OFFSET;       
 
         /* Find node offset for provided resource name */
-        while ((nodeOffset >= RM_DTB_UTIL_STARTING_NODE_OFFSET) && 
-               (depth >= RM_DTB_UTIL_STARTING_DEPTH)) {
+        while (nodeOffset >= RM_DTB_UTIL_STARTING_NODE_OFFSET) {
             nodeOffset = fdt_next_node(policyDtb, nodeOffset, &depth);
             if (depth < RM_DTB_UTIL_STARTING_DEPTH) {
                 /* Resource name not found */
                 nodeOffset = RM_SERVICE_DENIED_RES_DOES_NOT_EXIST;
+                break;
             } 
             else {
                 nodeName = fdt_get_name(policyDtb, nodeOffset, NULL);
@@ -847,9 +847,11 @@ int32_t rmPolicyValidatePolicyResourceNames(Rm_Handle rmHandle)
     /* Parse DTB, verifying each resource's assignment permissions.
      * Permissions must have correct syntax and contain valid instance names
      * according validInstList */
-    while ((nodeOffset >= RM_DTB_UTIL_STARTING_NODE_OFFSET) && 
-           (depth >= RM_DTB_UTIL_STARTING_DEPTH)) {
+    while (nodeOffset >= RM_DTB_UTIL_STARTING_NODE_OFFSET) {
         nodeOffset = fdt_next_node(policyDtb, nodeOffset, &depth);
+        if (depth < RM_DTB_UTIL_STARTING_DEPTH) {
+            break;
+        }
         nodeName = fdt_get_name(policyDtb, nodeOffset, NULL);
         if (fdt_first_property_offset(policyDtb, nodeOffset) > RM_DTB_UTIL_STARTING_NODE_OFFSET) {
             if (rmAllocatorFind(rmHandle, nodeName) == NULL) {
@@ -890,9 +892,11 @@ int32_t rmPolicyValidatePolicy(Rm_Handle rmHandle)
     /* Parse DTB, verifying each resource's assignment permissions.
      * Permissions must have correct syntax and contain valid instance names
      * according validInstList */
-    while ((nodeOffset >= RM_DTB_UTIL_STARTING_NODE_OFFSET) && 
-           (depth >= RM_DTB_UTIL_STARTING_DEPTH)) {
+    while (nodeOffset >= RM_DTB_UTIL_STARTING_NODE_OFFSET) {
         nodeOffset = fdt_next_node(policyDtb, nodeOffset, &depth);
+        if (depth < RM_DTB_UTIL_STARTING_DEPTH) {
+            break;
+        }
         propertyOffset = fdt_first_property_offset(policyDtb, nodeOffset);                
         while (propertyOffset > RM_DTB_UTIL_STARTING_NODE_OFFSET) {
             propertyData = fdt_getprop_by_offset(policyDtb, propertyOffset, &propertyName, &propertyLen);
index c1ff7900ce765ccce1f2eba3af52964a4de18c81..da276310227ed3896487a5b82471b1445846c03f 100644 (file)
@@ -817,7 +817,7 @@ void testCd(void)
     rmInitCfg.instType = Rm_instType_CLIENT_DELEGATE;
     rmInitCfg.instCfg.cdCfg.cdPolicy = (void *)rmGlobalPolicy;    
     rmHandle = Rm_init(&rmInitCfg, &rmResult);
-    ERROR_CHECK(RM_OK, rmResult, rmInstName, "Initialization failed");
+    ERROR_CHECK(RM_WARNING_CD_INSTANCE_NOT_STABLE, rmResult, rmInstName, "Initialization failed");
     MEM_TEST_MID_STORE();
     rmResult = Rm_delete(rmHandle, RM_TEST_TRUE);
     ERROR_CHECK(RM_OK, rmResult, rmInstName, "Delete failed");
@@ -828,7 +828,7 @@ void testCd(void)
     MEM_TEST_START_STORE();
     rmInitCfg.instCfg.cdCfg.cdPolicy = (void *)rmStaticPolicy;
     rmHandle = Rm_init(&rmInitCfg, &rmResult);
-    ERROR_CHECK(RM_OK, rmResult, rmInstName, "Initialization failed");
+    ERROR_CHECK(RM_WARNING_CD_INSTANCE_NOT_STABLE, rmResult, rmInstName, "Initialization failed");
     MEM_TEST_MID_STORE();
     rmResult = Rm_delete(rmHandle, RM_TEST_TRUE);
     ERROR_CHECK(RM_OK, rmResult, rmInstName, "Delete failed");
@@ -838,7 +838,7 @@ void testCd(void)
 
     MEM_TEST_START_STORE();
     rmHandle = Rm_init(&rmInitCfg, &rmResult);
-    ERROR_CHECK(RM_OK, rmResult, rmInstName, "Initialization failed");
+    ERROR_CHECK(RM_WARNING_CD_INSTANCE_NOT_STABLE, rmResult, rmInstName, "Initialization failed");
     /* Open service handle */
     serviceHandle = Rm_serviceOpenHandle(rmHandle, &rmResult);
     ERROR_CHECK(RM_OK, rmResult, rmInstName, "Service handle open failed");
@@ -953,7 +953,7 @@ void testServerCdClient(void)
     rmInitCfg.instType = Rm_instType_CLIENT_DELEGATE;
     rmInitCfg.instCfg.cdCfg.cdPolicy = (void *)rmGlobalPolicy;
     cdHandle = Rm_init(&rmInitCfg, &rmResult);
-    ERROR_CHECK(RM_OK, rmResult, cdName, "Initialization failed"); 
+    ERROR_CHECK(RM_WARNING_CD_INSTANCE_NOT_STABLE, rmResult, cdName, "Initialization failed"); 
     /* Init Client */
     memset((void *)&rmInitCfg, 0, sizeof(rmInitCfg));
     System_sprintf (clientName, "RM_Client");
index 4e7b7a9539c04d2e7efc09eaa052aebcb95e8fe3..e1b87868ce842f88fe250e2565a876cd942aa06a 100644 (file)
@@ -1616,7 +1616,7 @@ int main(Int argc, Char* argv[])
         rmInitCfg.instType = Rm_instType_CLIENT_DELEGATE;
         rmInitCfg.instCfg.cdCfg.cdPolicy = (void *)rmGlobalPolicy;
         rmCdHandle = Rm_init(&rmInitCfg, &result);
-        ERROR_CHECK(RM_OK, result, rmCdName, "Initialization failed");
+        ERROR_CHECK(RM_WARNING_CD_INSTANCE_NOT_STABLE, result, rmCdName, "Initialization failed");
 
         /* Open CD service handle */
         rmCdServiceHandle = Rm_serviceOpenHandle(rmCdHandle, &result);