ipc: Remove compiler warnings
[ipc/ipcdev.git] / packages / ti / sdo / ipc / ListMP.c
index 4e89cf8e40cfea6d1010ecc758152815804521ec..d1a9bb44c3e955a6190799ee9511dd0d3817e1fc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2015 Texas Instruments Incorporated - http://www.ti.com
+ * Copyright (c) 2012-2018 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  *                       Common Header Functions
  *************************************************************************
  */
+/*
+ *  ======== ListMP_barrier ========
+ *    Function ensures all the writeback to memory is complete
+ */
+static inline void ListMP_barrier(void)
+{
+#if defined(xdc_target__isaCompatible_64P)
+    /* Use _mfence to make sure memory transactions are complete */
+    _mfence();
+    /* Second mfence needed due to errata: See C6670 Advisory 32 */
+    _mfence();
+#endif
+}
 
 /*
  *  ======== ListMP_Params_init ========
@@ -168,6 +181,10 @@ Int ListMP_open(String name, ListMP_Handle *handlePtr)
     }
 
     sharedAddr = SharedRegion_getPtr(sharedShmBase);
+    if ( sharedAddr == NULL ) {
+        *handlePtr = NULL;
+        return (ListMP_E_NOTFOUND);
+    }
 
     status = ListMP_openByAddr(sharedAddr, handlePtr);
 
@@ -265,7 +282,7 @@ Bool ListMP_empty(ListMP_Handle handle)
     /* prevent another thread or processor from modifying the ListMP */
     key = GateMP_enter((GateMP_Handle)obj->gate);
 
-#ifdef xdc_target__isaCompatible_v7A
+#if defined(xdc_target__isaCompatible_v7A) || defined(xdc_target__isaCompatible_v8A)
     /* ARM speculative execution might have pulled attrs into cache */
     if (obj->cacheEnabled) {
         Cache_inv(attrs, sizeof(ti_sdo_ipc_ListMP_Attrs), Cache_Type_ALL, TRUE);
@@ -323,7 +340,7 @@ Ptr ListMP_getHead(ListMP_Handle handle)
     /* prevent another thread or processor from modifying the ListMP */
     key = GateMP_enter((GateMP_Handle)obj->gate);
 
-#ifdef xdc_target__isaCompatible_v7A
+#if defined(xdc_target__isaCompatible_v7A) || defined(xdc_target__isaCompatible_v8A)
     /* ARM speculative execution might have pulled attrs into cache */
     if (obj->cacheEnabled) {
         Cache_inv(attrs, sizeof(ti_sdo_ipc_ListMP_Attrs), Cache_Type_ALL, TRUE);
@@ -382,6 +399,8 @@ Ptr ListMP_getHead(ListMP_Handle handle)
     if (obj->cacheEnabled) {
         Cache_wbInv(&(attrs->head), sizeof(ListMP_Elem), Cache_Type_ALL, TRUE);
     }
+    else
+        ListMP_barrier();
 
     GateMP_leave((GateMP_Handle)obj->gate, key);
 
@@ -404,7 +423,7 @@ Ptr ListMP_getTail(ListMP_Handle handle)
     /* prevent another thread or processor from modifying the ListMP */
     key = GateMP_enter((GateMP_Handle)obj->gate);
 
-#ifdef xdc_target__isaCompatible_v7A
+#if defined(xdc_target__isaCompatible_v7A) || defined(xdc_target__isaCompatible_v8A)
     /* ARM speculative execution might have pulled attrs into cache */
     if (obj->cacheEnabled) {
         Cache_inv(attrs, sizeof(ti_sdo_ipc_ListMP_Attrs), Cache_Type_ALL, TRUE);
@@ -463,6 +482,8 @@ Ptr ListMP_getTail(ListMP_Handle handle)
     if (obj->cacheEnabled) {
         Cache_wbInv(&(attrs->head), sizeof(ListMP_Elem), Cache_Type_ALL, TRUE);
     }
+    else
+        ListMP_barrier();
 
     GateMP_leave((GateMP_Handle)obj->gate, key);
 
@@ -536,6 +557,8 @@ Int ListMP_insert(ListMP_Handle handle, ListMP_Elem *newElem,
         /* writeback invalidate new elem structure  */
         Cache_wbInv(newElem, sizeof(ListMP_Elem), Cache_Type_ALL, TRUE);
     }
+    else
+        ListMP_barrier();
 
     GateMP_leave((GateMP_Handle)obj->gate, key);
 
@@ -632,7 +655,7 @@ Int ListMP_putHead(ListMP_Handle handle, ListMP_Elem *elem)
     /* prevent another thread or processor from modifying the ListMP */
     key = GateMP_enter((GateMP_Handle)obj->gate);
 
-#ifdef xdc_target__isaCompatible_v7A
+#if defined(xdc_target__isaCompatible_v7A) || defined(xdc_target__isaCompatible_v8A)
     /* ARM speculative execution might have pulled attrs into cache */
     if (obj->cacheEnabled) {
         Cache_inv(attrs, sizeof(ti_sdo_ipc_ListMP_Attrs), Cache_Type_ALL, TRUE);
@@ -678,6 +701,8 @@ Int ListMP_putHead(ListMP_Handle handle, ListMP_Elem *elem)
         /* Write-back because elem->next & elem->prev changed */
         Cache_wbInv(elem, sizeof(ListMP_Elem), Cache_Type_ALL, TRUE);
     }
+    else
+        ListMP_barrier();
 
     GateMP_leave((GateMP_Handle)obj->gate, key);
 
@@ -701,7 +726,7 @@ Int ListMP_putTail(ListMP_Handle handle, ListMP_Elem *elem)
     /* prevent another thread or processor from modifying the ListMP */
     key = GateMP_enter((GateMP_Handle)obj->gate);
 
-#ifdef xdc_target__isaCompatible_v7A
+#if defined(xdc_target__isaCompatible_v7A) || defined(xdc_target__isaCompatible_v8A)
     /* ARM speculative execution might have pulled attrs into cache */
     if (obj->cacheEnabled) {
         Cache_inv(attrs, sizeof(ti_sdo_ipc_ListMP_Attrs), Cache_Type_ALL, TRUE);
@@ -747,6 +772,8 @@ Int ListMP_putTail(ListMP_Handle handle, ListMP_Elem *elem)
         /* Write-back because elem->next & elem->prev changed */
         Cache_wbInv(elem, sizeof(ListMP_Elem), Cache_Type_ALL, TRUE);
     }
+    else
+        ListMP_barrier();
 
     GateMP_leave((GateMP_Handle)obj->gate, key);
 
@@ -797,6 +824,8 @@ Int ListMP_remove(ListMP_Handle handle, ListMP_Elem *elem)
     if (localNextElemIsCached) {
         Cache_wbInv(localNextElem, sizeof(ListMP_Elem), Cache_Type_ALL, TRUE);
     }
+    else
+        ListMP_barrier();
 
     GateMP_leave((GateMP_Handle)obj->gate, key);
 
@@ -830,16 +859,19 @@ Int ti_sdo_ipc_ListMP_Instance_init(ti_sdo_ipc_ListMP_Object *obj,
         obj->cacheEnabled = SharedRegion_isCacheEnabled(obj->regionId);
         obj->cacheLineSize = SharedRegion_getCacheLineSize(obj->regionId);
 
-#ifdef xdc_target__isaCompatible_v7A
-    /* ARM speculative execution might have pulled attrs into cache */
-    if (obj->cacheEnabled) {
-        Cache_inv(obj->attrs, sizeof(ti_sdo_ipc_ListMP_Attrs), Cache_Type_ALL,
+#if defined(xdc_target__isaCompatible_v7A) || defined(xdc_target__isaCompatible_v8A)
+        /* ARM speculative execution might have pulled attrs into cache */
+        if (obj->cacheEnabled) {
+            Cache_inv(obj->attrs, sizeof(ti_sdo_ipc_ListMP_Attrs), Cache_Type_ALL,
                 TRUE);
-    }
+        }
 #endif
         /* get the local address of the SRPtr */
         localAddr = SharedRegion_getPtr(obj->attrs->gateMPAddr);
 
+        /* Do NULL check on localAddr */
+        Assert_isTrue(localAddr != NULL, ti_sdo_ipc_Ipc_A_internal);
+
         status = GateMP_openByAddr(localAddr, (GateMP_Handle *)&(obj->gate));
         if (status != GateMP_S_SUCCESS) {
             Error_raise(eb, ti_sdo_ipc_Ipc_E_internal, 0, 0);
@@ -895,7 +927,7 @@ Int ti_sdo_ipc_ListMP_Instance_init(ti_sdo_ipc_ListMP_Object *obj,
 
         /* Assert that sharedAddr is cache aligned */
         Assert_isTrue((obj->cacheLineSize == 0) ||
-                      ((UInt32)params->sharedAddr % obj->cacheLineSize == 0),
+                      ((uintptr_t)params->sharedAddr % obj->cacheLineSize == 0),
                       ti_sdo_ipc_Ipc_A_addrNotCacheAligned);
     }