/***************************************************************************** * 函 数 名 : bsp_sfree * * 功能描述 : BSP 动态内存释放(加spin lock保护,多核场景使用) * * 输入参数 : pMem: 动态内存指针 * 输出参数 : 无 * 返 回 值 : 无 *****************************************************************************/ void bsp_sfree(void* pMem) { u32 u32Size; u32 u32Flags; if(0 == *g_mem_init_mark) { return; } /* Invalid Cache */ if (!MEM_IS_AXI_ADDR(pMem)) { MEM_INVALID_CACHE(MEM_GET_ALLOC_ADDR(pMem), MEM_MGR_SIZE_FOR_CACHE); } #ifdef __BSP_MEM_DEBUG__ /* 检查当前内存是否有效 */ if (bsp_ptr_invalid(pMem) || MEM_FREE == MEM_ITEM_STATUS(pMem) || MEM_ITEM_FLAGS(pMem) == MEM_NORM_DDR_POOL) { printk("warning! ptr:0x%x, invalid mem block, or may free twice, or wrong mem flags line:%d\n", (unsigned int)pMem, __LINE__); return; } #endif u32Size = MEM_ITEM_SIZE(pMem); u32Flags = MEM_ITEM_FLAGS(pMem); bsp_memory_free(u32Flags, pMem, u32Size); return; }
/***************************************************************************** * 函 数 名 : bsp_free * * 功能描述 : BSP 动态内存释放 * * 输入参数 : pMem: 动态内存指针 * 输出参数 : 无 * 返 回 值 : 无 *****************************************************************************/ void bsp_free(void* pMem) { #if 1 if(pMem) /* coverity[freed_arg] */ kfree(pMem); #else u32 u32Size; u32 u32Flags; u32 u32MagicNumber; MEM_SPIN_LOCK(); u32Size = MEM_ITEM_SIZE(pMem); u32Flags = MEM_ITEM_FLAGS(pMem); u32MagicNumber= MEM_ITEM_MAGIC(pMem); MEM_SPIN_UNLOCK(); if(MEM_MAGIC_NUM != u32MagicNumber) { kfree(pMem); } else if(MEM_NORM_DDR_POOL < u32Flags) { bsp_memory_free(u32Flags, pMem, u32Size); } else { printk("bsp_free failed: pMem is 0x%x, u32MagicNumber is 0x%x, u32Flags is 0x%x\n",(u32)pMem, u32MagicNumber, u32Flags); } #endif }
/***************************************************************************** * 函 数 名 : bsp_sfree * * 功能描述 : BSP 动态内存释放(加spin lock保护,多核场景使用) * * 输入参数 : pMem: 动态内存指针 * 输出参数 : 无 * 返 回 值 : 无 *****************************************************************************/ void bsp_sfree(void* pMem) { u32 u32Size; u32 u32Flags; if(0 == *g_mem_init_mark) { return; } #ifdef __BSP_MEM_DEBUG__ if (bsp_ptr_invalid(pMem)) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM, "warning! ptr:0x%x, invalid mem block line:%d\n", pMem, __LINE__); return; } #endif /* Invalid Cache */ if (!MEM_IS_AXI_ADDR(pMem)) { MEM_INVALID_CACHE(MEM_GET_ALLOC_ADDR(pMem), MEM_MGR_SIZE_FOR_CACHE); } #ifdef __BSP_MEM_DEBUG__ /* 检查当前内存是否有效 */ if (MEM_FREE == MEM_ITEM_STATUS(pMem)) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM, "warning! ptr:0x%x, may free twice, or wrong mem status line:%d\n", (unsigned int)pMem, __LINE__); return; } #endif u32Size = MEM_ITEM_SIZE(pMem); u32Flags = MEM_ITEM_FLAGS(pMem); bsp_memory_free(u32Flags, pMem, u32Size); return; }