/***************************************************************************** * 函 数 名 : BSP_Free * * 功能描述 : BSP 动态内存释放(Debug接口) * * 输入参数 : pMem: 动态内存指针 * pFileName: 使用的源文件 * u32Line: 所在文件的行号 * * 输出参数 : 无 * 返 回 值 : 无 *****************************************************************************/ void bsp_free_dbg(void* pMem, u8* pFileName, u32 u32Line) { #ifdef __BSP_MEM_DEBUG__ /* 检查当前内存是否有效 */ if (bsp_ptr_invalid(pMem)) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM, "invalid mem block, ptr:0x%x, line:%d\n", pMem, __LINE__); return; } if (MEM_FREE == MEM_ITEM_STATUS(pMem) || MEM_NORM_DDR_POOL != MEM_ITEM_FLAGS(pMem)) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM, "warning! ptr:0x%x, may free twice, or wrong mem flags line:%d\n", pMem, __LINE__); return; } #endif bsp_free(pMem); #ifdef __BSP_MEM_DEBUG__ /* 更新MGR Debug信息 */ MEM_ITEM_LINE(pMem) = u32Line; MEM_ITEM_FILE_NAME(pMem) = (u32)pFileName; #endif return; }
/***************************************************************************** * 函 数 名 : 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 动态内存释放(Debug接口) * * 输入参数 : pMem: 动态内存指针 * pFileName: 使用的源文件 * u32Line: 所在文件的行号 * * 输出参数 : 无 * 返 回 值 : 无 *****************************************************************************/ void bsp_free_dbg(void* pMem, u8* pFileName, u32 u32Line) { /* coverity[USE_AFTER_FREE] */ #ifdef __BSP_MEM_DEBUG__ /* 检查当前内存是否有效 */ if (bsp_ptr_invalid(pMem)) { printk("invalid mem block, ptr:0x%x, line:%d\n", (unsigned int)pMem, __LINE__); return; } if (MEM_FREE == MEM_ITEM_STATUS(pMem) || MEM_NORM_DDR_POOL != MEM_ITEM_FLAGS(pMem)) { printk("warning! ptr:0x%x, may free twice, or wrong mem flags line:%d\n", (unsigned int)pMem, __LINE__); return; } #endif /* coverity[freed_arg] */ bsp_free(pMem); #ifdef __BSP_MEM_DEBUG__ /* 更新MGR Debug信息 */ /* coverity[use_after_free] */ MEM_ITEM_LINE(pMem) = u32Line; MEM_ITEM_FILE_NAME(pMem) = (u32)pFileName; #endif return; }
u8* bsp_memory_alloc(u32 u32PoolType, u32 u32Size) { u32 cnt; void *pItem; MEM_ALLOC_INFO* pAllocInfo = MEM_GET_ALLOC_INFO(u32PoolType); u32 u32MostUsedItem = pAllocInfo->mostUsedItem; /* 先查找AllocList中是否有可用的内存节点 */ MEM_FIND_RIGHT_ITEM(cnt, u32Size, u32MostUsedItem); /* 如果没有找到则直接返回失败 */ if (cnt >= MEM_ALLOC_LIST_NUM) { printk( "Invalid malloc size:%d, line:%d\n", u32Size, __LINE__); return NULL; } /* 更新size为列表中的size */ u32Size = MEM_GET_ALLOC_SIZE(cnt); /*lint -save -e718 -e746*/ MEM_LOCK_BY_TYPE(u32PoolType); /*lint -restore*/ pItem = bsp_get_item(pAllocInfo, cnt, u32PoolType, u32Size); if (NULL != pItem) { #ifdef __BSP_MEM_DEBUG__ pAllocInfo->allocUsedInfoList[cnt].u32CurNum++; pAllocInfo->allocUsedInfoList[cnt].u32TotalMallocNum++; if (pAllocInfo->allocUsedInfoList[cnt].u32CurNum > pAllocInfo->allocUsedInfoList[cnt].u32MaxNum) { pAllocInfo->allocUsedInfoList[cnt].u32MaxNum = pAllocInfo->allocUsedInfoList[cnt].u32CurNum; } MEM_ITEM_STATUS(pItem) = MEM_ALLOC; #endif /* 多核要 Flush Cache, 确保管理信息写入 */ MEM_FLUSH_CACHE_BY_TYPE(MEM_GET_ALLOC_ADDR(pItem), MEM_MGR_SIZE_FOR_CACHE, u32PoolType); } MEM_UNLOCK_BY_TYPE(u32PoolType); return pItem; }
void bsp_memory_free(u32 u32PoolType, void* pMem, u32 u32Size) { u32 cnt; u32 u32MostUsedItem; MEM_ALLOC_INFO* pAllocInfo = MEM_GET_ALLOC_INFO(u32PoolType); u32MostUsedItem = pAllocInfo->mostUsedItem; /* 先查找AllocList中是否有可用的内存节点 */ MEM_FIND_RIGHT_ITEM(cnt, u32Size, u32MostUsedItem); #ifdef __BSP_MEM_DEBUG__ /* 判断该节点是否有效 */ if (cnt >= MEM_ALLOC_LIST_NUM) { printk("bsp_pool_alloc Fail, size:%d, line:%d\n", u32Size, __LINE__); return; } #endif MEM_LOCK_BY_TYPE(u32PoolType); /* 将item挂回到链表 */ if (MEM_ICC_AXI_POOL == u32PoolType) { MEM_ITEM_NEXT(pMem) = (u32)(pAllocInfo->allocList[cnt]); pAllocInfo->allocList[cnt] = (void*)(DRV_AXI_VIRT_TO_PHY((u32)pMem)); } else if (MEM_ICC_DDR_POOL == u32PoolType) { MEM_ITEM_NEXT(pMem) = (u32)(pAllocInfo->allocList[cnt]); pAllocInfo->allocList[cnt] = (void *)SHD_DDR_V2P((u32)pMem); } #ifdef __BSP_MEM_DEBUG__ pAllocInfo->allocUsedInfoList[cnt].u32CurNum--; pAllocInfo->allocUsedInfoList[cnt].u32TotalFreeNum++; MEM_ITEM_STATUS(pMem) = MEM_FREE; #endif /* Flush Cache */ MEM_FLUSH_CACHE_BY_TYPE(MEM_GET_ALLOC_ADDR(pMem), MEM_MGR_SIZE_FOR_CACHE, u32PoolType); MEM_UNLOCK_BY_TYPE(u32PoolType); return; }
/***************************************************************************** * 函 数 名 : 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; }
STATIC s32 bsp_mem_dump_block(u32 u32Addr) { BSP_BOOL bBlockInvalid = FALSE; bBlockInvalid = bBlockInvalid; if (NULL == (void *)u32Addr) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"can't dump the block, the input ptr is NULL\n"); return BSP_ERROR; } if (MEM_MAGIC_NUM != MEM_ITEM_MAGIC(u32Addr)) { bBlockInvalid = TRUE; bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"The Block:0x%x may Invalid!\n", u32Addr); } /* 为确保正确,统一刷下Cache */ MEM_INVALID_CACHE(MEM_GET_ALLOC_ADDR(u32Addr), MEM_MGR_SIZE_FOR_CACHE); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"================================\n"); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"dump mem block info:\n"); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"================================\n"); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"usr ptr: 0x%x\n", u32Addr); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"alloc ptr: 0x%x\n", (u32)MEM_GET_ALLOC_ADDR(u32Addr)); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"magic num: 0x%x\n", MEM_ITEM_MAGIC(u32Addr)); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"block size: %d\n", MEM_ITEM_SIZE(u32Addr)); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"mem flags: 0x%x\n", MEM_ITEM_FLAGS(u32Addr)); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"mem item next: 0x%x\n", MEM_ITEM_NEXT(u32Addr)); #ifdef __BSP_MEM_DEBUG__ bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"used file name: %s\n", (bBlockInvalid) ? ("invalid") : (BSP_CHAR*)MEM_ITEM_FILE_NAME(u32Addr)); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"used line: %d\n", MEM_ITEM_LINE(u32Addr)); bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"mem status: %s\n", (MEM_ITEM_STATUS(u32Addr)) ? ("ALLOC") : ("FREE")); #endif bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,"================================\n"); return BSP_OK; }
STATIC void bsp_memory_free(u32 u32PoolType, void* pMem, u32 u32Size) { u32 cnt; u32 u32MostUsedItem; MEM_ALLOC_INFO* pAllocInfo = MEM_GET_ALLOC_INFO(u32PoolType); u32MostUsedItem = pAllocInfo->mostUsedItem; /* 先查找AllocList中是否有可用的内存节点 */ MEM_FIND_RIGHT_ITEM(cnt, u32Size, u32MostUsedItem); #ifdef __BSP_MEM_DEBUG__ /* 判断该节点是否有效 */ if (cnt >= MEM_ALLOC_LIST_NUM) { bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM, "memPoolAlloc Fail, size:%d, line:%d\n", u32Size, __LINE__); return; } #endif MEM_LOCK_BY_TYPE(u32PoolType);/*lint !e713*/ /* 将item挂回到链表 */ MEM_ITEM_NEXT(pMem) = (u32)pAllocInfo->allocList[cnt]; pAllocInfo->allocList[cnt] = pMem; #ifdef __BSP_MEM_DEBUG__ pAllocInfo->allocUsedInfoList[cnt].u32CurNum--; pAllocInfo->allocUsedInfoList[cnt].u32TotalFreeNum++; MEM_ITEM_STATUS(pMem) = MEM_FREE; #endif /* Flush Cache */ MEM_FLUSH_CACHE_BY_TYPE(MEM_GET_ALLOC_ADDR(pMem), MEM_MGR_SIZE_FOR_CACHE, u32PoolType); MEM_UNLOCK_BY_TYPE(u32PoolType); return; }