1/* 2 * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved. 3 * 4 * UniProton is licensed under Mulan PSL v2. 5 * You can use this software according to the terms and conditions of the Mulan PSL v2. 6 * You may obtain a copy of Mulan PSL v2 at: 7 * http://license.coscl.org.cn/MulanPSL2 8 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 9 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 10 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 11 * See the Mulan PSL v2 for more details. 12 * Create: 2009-12-22 13 * Description: LIB模块内部头文件 14 */ 15#ifndef PRT_LIB_EXTERNAL_H 16#define PRT_LIB_EXTERNAL_H 17 18#include "securec.h" 19#include "prt_sys.h" 20 21/* 对齐操作API */ 22#define OS_ADDR_OVERTURN_CHK(addr, size) (((size) != 0) && (((addr) + (size) - 1) < (addr))) 23#define OS_ALIGN_CHK(addr, align) (((uintptr_t)(addr) & ((align) - 1)) == 0) 24#define OS_NOT_ALIGN_CHK(addr, align) (!OS_ALIGN_CHK(addr, align)) 25#define OS_ALIGN(addr, align) ((uintptr_t)(addr) & ((align) - 1)) 26 27#define OS_32BIT_MOD(num) ((num) % 32) 28 29#define OS_GET_64BIT_HIGH_32BIT(num) ((U32)((num) >> 32)) 30#define OS_GET_64BIT_LOW_32BIT(num) ((U32)((num) & 0xFFFFFFFFU)) 31 32#define OS_GET_32BIT_HIGH_8BIT(num) (((num) >> 24) & 0xffU) 33#define OS_GET_32BIT_LOW_8BIT(num) ((num) & 0xffU) 34 35#define OS_GET_32BIT_HIGH_16BIT(num) ((num) >> 16) 36#define OS_GET_32BIT_LOW_16BIT(num) ((num) & 0xFFFFU) 37 38#define OS_GET_16BIT_HIGH_8BIT(num) ((num) >> 8) 39 40#define OS_GET_8BIT_HIGH_4BIT(num) ((num) >> 4) 41#define OS_GET_8BIT_LOW_4BIT(num) ((num) & 0xFU) 42 43#define OS_GET_32BIT_ARRAY_INDEX(num) ((num) >> 5) 44#define OS_GET_32BIT_ARRAY_BASE(num) ((num) << 5) 45 46#define OS_32BIT_MASK(bit) (1U << OS_32BIT_MOD(bit)) 47#define OS_32BIT_VERSE_MASK(bit) (~(1U << OS_32BIT_MOD(bit))) 48 49#define OS_GET_BIT_IN_WORD(num) ((num) & 0x1FUL) 50 51#define OS_64BIT_SET(high, low) (((U64)(high) << 32) + (U64)(low)) 52#define OS_LMB32 31 53 54#define OS_MAX_U32 0xFFFFFFFFU 55#define OS_MAX_U16 0xFFFFU 56#define OS_MAX_U12 0xFFFU 57#define OS_MAX_U8 0xFFU 58#define OS_MAX_U4 0xFU 59 60#define OS_MAX_S8 0xFF 61 62#define OS_BYTES_PER_DWORD (sizeof(U64)) 63#define OS_BYTES_PER_WORD (sizeof(U32)) 64#define OS_BITS_PER_BYTE 8 65 66#define OS_BITNUM_2_MASK(bitNum) ((1U << (bitNum)) - 1) 67#define OS_WORD_ALLBIT_MASK 0xFFFFFFFFU 68 69#define OS_IS_VISIBLE_CHAR(word) ((((word) >= 'a') && ((word) <= 'z')) || (((word) >= 'A') && ((word) <= 'Z')) || \ 70 ((word) == '_') || (((word) <= '9') && ((word) >= '0'))) 71 72#define MIN(a, b) ((a) < (b) ? (a) : (b)) 73#define MAX(a, b) ((a) > (b) ? (a) : (b)) 74 75#define OS_DECIMAL 10 76#define OS_OCTAL 8 77#define OS_HEX 16 78 79#define OS_BIT0_MASK (0x1U << 0) 80#define OS_BIT1_MASK (0x1U << 1) 81#define OS_BIT2_MASK (0x1U << 2) 82#define OS_BIT3_MASK (0x1U << 3) 83#define OS_BIT4_MASK (0x1U << 4) 84#define OS_BIT5_MASK (0x1U << 5) 85#define OS_BIT6_MASK (0x1U << 6) 86#define OS_BIT7_MASK (0x1U << 7) 87#define OS_BIT8_MASK (0x1U << 8) 88#define OS_BIT9_MASK (0x1U << 9) 89#define OS_BIT10_MASK (0x1U << 10) 90#define OS_BIT11_MASK (0x1U << 11) 91#define OS_BIT12_MASK (0x1U << 12) 92#define OS_BIT13_MASK (0x1U << 13) 93#define OS_BIT14_MASK (0x1U << 14) 94#define OS_BIT15_MASK (0x1U << 15) 95#define OS_BIT16_MASK (0x1U << 16) 96#define OS_BIT17_MASK (0x1U << 17) 97#define OS_BIT18_MASK (0x1U << 18) 98#define OS_BIT19_MASK (0x1U << 19) 99#define OS_BIT20_MASK (0x1U << 20) 100#define OS_BIT21_MASK (0x1U << 21) 101#define OS_BIT22_MASK (0x1U << 22) 102#define OS_BIT23_MASK (0x1U << 23) 103#define OS_BIT24_MASK (0x1U << 24) 104#define OS_BIT25_MASK (0x1U << 25) 105#define OS_BIT26_MASK (0x1U << 26) 106#define OS_BIT27_MASK (0x1U << 27) 107#define OS_BIT28_MASK (0x1U << 28) 108#define OS_BIT29_MASK (0x1U << 29) 109#define OS_BIT30_MASK (0x1U << 30) 110#define OS_BIT31_MASK (0x1U << 31) 111 112#define OS_BIT_SET_VALUE(bit) (0x1UL << (bit)) 113 114#define BNUM_TO_WNUM(bnum) (((bnum) + 31) >> 5) 115#define OS_WORD_BIT_NUM 32 116#define OS_WORD_BIT_POW 5 117#define OS_DWORD_BIT_NUM 64 118#define OS_DWORD_BIT_POW 6 119#define OS_HALF_WORD_BIT_NUM 16 120#define OS_GET_WORD_NUM_BY_PRIONUM(prio) (((prio) + 0x1f) >> 5) // 通过支持的优先级个数计算需要多少个word表示 121 122#ifndef OS_STATIC_NO_INLINE 123#define OS_STATIC_NO_INLINE static __noinline __attribute__((noinline)) 124#endif 125 126#ifndef ATTR_ALIGN_128 127#define ATTR_ALIGN_128 __attribute__((aligned(128))) /* 表示128 字节对齐 */ 128#endif 129 130#ifndef ATTR_ALIGN_64 131#define ATTR_ALIGN_64 __attribute__((aligned(64))) /* 表示64 字节对齐 */ 132#endif 133 134#ifndef ATTR_ALIGN_32 135#define ATTR_ALIGN_32 __attribute__((aligned(32))) /* 表示32 字节对齐 */ 136#endif 137 138#ifndef ATTR_ALIGN_16 139#define ATTR_ALIGN_16 __attribute__((aligned(16))) /* 表示16 字节对齐 */ 140#endif 141 142#ifndef ATTR_ALIGN_8 143#define ATTR_ALIGN_8 __attribute__((aligned(8))) /* 表示8字节对齐 */ 144#endif 145 146#ifndef ATTR_ALIGN_4 147#define ATTR_ALIGN_4 __attribute__((aligned(4))) /* 表示4字节对齐 */ 148#endif 149 150#define OS_SYS_UINT_IDX(coreId) ((U32)(coreId) >> 5) // 一个U32表示32个核 151#define OS_SYS_UINT_LCOREID_OFFSET(coreId) (((coreId) & 0x1fUL)) // 核号在一个U32里的偏移 152 153/* 154 * 模块间宏定义 155 */ 156extern void OsAdd64(U32 *low, U32 *high, U32 oldLow, U32 oldHigh); 157extern void OsSub64(U32 *low, U32 *high, U32 oldLow, U32 oldHigh); 158extern U32 OsGetLmb1(U32 value); 159 160#endif /* PRT_LIB_EXTERNAL_H */ 161