1 /* ---------------------------------------------------------------------------- 2 * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. 3 * Description: LiteOS Memory private struct defines headfile 4 * Author: Huawei LiteOS Team 5 * Create: 2020-06-29 6 * Redistribution and use in source and binary forms, with or without modification, 7 * are permitted provided that the following conditions are met: 8 * 1. Redistributions of source code must retain the above copyright notice, this list of 9 * conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, this list 11 * of conditions and the following disclaimer in the documentation and/or other materials 12 * provided with the distribution. 13 * 3. Neither the name of the copyright holder nor the names of its contributors may be used 14 * to endorse or promote products derived from this software without specific prior written 15 * permission. 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 18 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * --------------------------------------------------------------------------- */ 28 29 #ifndef _LOS_MEMORY_INTERNAL_H 30 #define _LOS_MEMORY_INTERNAL_H 31 32 #include "los_typedef.h" 33 #include "los_memory_pri.h" 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif /* __cplusplus */ 38 39 /* Memory linked list control node structure */ 40 typedef struct { 41 union { 42 LOS_DL_LIST freeNodeInfo; /* Free memory node */ 43 struct { 44 UINTPTR magic; 45 UINTPTR taskId : 16; 46 #ifdef LOSCFG_MEM_MUL_MODULE 47 UINTPTR moduleId : 16; 48 #endif 49 }; 50 }; 51 52 struct tagLosMemDynNode *preNode; /* Pointer to the previous memory node */ 53 54 #ifdef LOSCFG_MEM_HEAD_BACKUP 55 UINT32 gapSize; 56 UINTPTR checksum; /* magic = xor checksum */ 57 #endif 58 59 #ifdef LOSCFG_MEM_LEAKCHECK 60 #define MEM_RECORD_LR_CNT (LOSCFG_MEM_RECORD_LR_CNT - LOSCFG_MEM_OMIT_LR_CNT) 61 UINTPTR linkReg[MEM_RECORD_LR_CNT]; 62 #endif 63 64 #ifdef LOSCFG_AARCH64 65 UINT32 reserve2; /* 64-bit alignment */ 66 #endif 67 /* Size and flag of the current node (the high two bits represent a flag,and the rest bits specify the size) */ 68 UINT32 sizeAndFlag; 69 } LosMemCtlNode; 70 71 /* Memory linked list node structure */ 72 typedef struct tagLosMemDynNode { 73 #ifdef LOSCFG_MEM_HEAD_BACKUP 74 LosMemCtlNode backupNode; 75 #endif 76 LosMemCtlNode selfNode; 77 } LosMemDynNode; 78 79 #define OS_MEM_NODE_HEAD_SIZE sizeof(LosMemDynNode) 80 /* Requires at least 1 byte of allocated space */ 81 #define OS_MEM_MIN_POOL_SIZE (OS_DLNK_HEAD_SIZE + (2 * OS_MEM_NODE_HEAD_SIZE) + \ 82 sizeof(LosMemPoolInfo) + 1) 83 #define IS_POW_TWO(value) ((((UINTPTR)(value)) & ((UINTPTR)(value) - 1)) == 0) 84 #define POOL_ADDR_ALIGNSIZE 64 85 #define OS_MEM_NODE_USED_FLAG 0x80000000U 86 #define OS_MEM_NODE_ALIGNED_FLAG 0x40000000U 87 #define OS_MEM_NODE_ALIGNED_AND_USED_FLAG (OS_MEM_NODE_USED_FLAG | OS_MEM_NODE_ALIGNED_FLAG) 88 89 #define OS_MEM_NODE_GET_ALIGNED_FLAG(sizeAndFlag) \ 90 ((sizeAndFlag) & OS_MEM_NODE_ALIGNED_FLAG) 91 #define OS_MEM_NODE_SET_ALIGNED_FLAG(sizeAndFlag) \ 92 ((sizeAndFlag) = ((sizeAndFlag) | OS_MEM_NODE_ALIGNED_FLAG)) 93 #define OS_MEM_NODE_GET_ALIGNED_GAPSIZE(sizeAndFlag) \ 94 ((sizeAndFlag) & ~OS_MEM_NODE_ALIGNED_FLAG) 95 #define OS_MEM_NODE_GET_USED_FLAG(sizeAndFlag) \ 96 ((sizeAndFlag) & OS_MEM_NODE_USED_FLAG) 97 #define OS_MEM_NODE_SET_USED_FLAG(sizeAndFlag) \ 98 ((sizeAndFlag) = ((sizeAndFlag) | OS_MEM_NODE_USED_FLAG)) 99 #define OS_MEM_NODE_GET_SIZE(sizeAndFlag) \ 100 ((sizeAndFlag) & ~OS_MEM_NODE_ALIGNED_AND_USED_FLAG) 101 #define OS_MEM_HEAD(pool, size) \ 102 OsDLnkMultiHead(OS_MEM_HEAD_ADDR(pool), size) 103 #define OS_MEM_HEAD_ADDR(pool) \ 104 ((VOID *)((UINTPTR)(pool) + sizeof(LosMemPoolInfo))) 105 #define OS_MEM_NEXT_NODE(node) \ 106 ((LosMemDynNode *)(VOID *)((UINT8 *)(node) + OS_MEM_NODE_GET_SIZE((node)->selfNode.sizeAndFlag))) 107 #define OS_MEM_FIRST_NODE(pool) \ 108 ((LosMemDynNode *)(VOID *)((UINT8 *)OS_MEM_HEAD_ADDR(pool) + OS_DLNK_HEAD_SIZE)) 109 #define OS_MEM_END_NODE(pool, size) \ 110 ((LosMemDynNode *)(VOID *)(((UINT8 *)(pool) + (size)) - OS_MEM_NODE_HEAD_SIZE)) 111 #define OS_MEM_MIDDLE_ADDR_OPEN_END(startAddr, middleAddr, endAddr) \ 112 (((UINT8 *)(startAddr) <= (UINT8 *)(middleAddr)) && ((UINT8 *)(middleAddr) < (UINT8 *)(endAddr))) 113 #define OS_MEM_MIDDLE_ADDR(startAddr, middleAddr, endAddr) \ 114 (((UINT8 *)(startAddr) <= (UINT8 *)(middleAddr)) && ((UINT8 *)(middleAddr) <= (UINT8 *)(endAddr))) 115 #define OS_MEM_SET_MAGIC(value) \ 116 ((value) = (UINTPTR)&(value) ^ (UINTPTR)(-1)) 117 #define OS_MEM_MAGIC_VALID(value) \ 118 (((UINTPTR)(value) ^ (UINTPTR)&(value)) == (UINTPTR)(-1)) 119 120 #ifdef __cplusplus 121 } 122 #endif /* __cplusplus */ 123 124 #endif /* _LOS_MEMORY_INTERNAL_H */ 125