13d8536b4Sopenharmony_ci/* 23d8536b4Sopenharmony_ci * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. 33d8536b4Sopenharmony_ci * Copyright (c) 2020-2023 Huawei Device Co., Ltd. All rights reserved. 43d8536b4Sopenharmony_ci * 53d8536b4Sopenharmony_ci * Redistribution and use in source and binary forms, with or without modification, 63d8536b4Sopenharmony_ci * are permitted provided that the following conditions are met: 73d8536b4Sopenharmony_ci * 83d8536b4Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright notice, this list of 93d8536b4Sopenharmony_ci * conditions and the following disclaimer. 103d8536b4Sopenharmony_ci * 113d8536b4Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright notice, this list 123d8536b4Sopenharmony_ci * of conditions and the following disclaimer in the documentation and/or other materials 133d8536b4Sopenharmony_ci * provided with the distribution. 143d8536b4Sopenharmony_ci * 153d8536b4Sopenharmony_ci * 3. Neither the name of the copyright holder nor the names of its contributors may be used 163d8536b4Sopenharmony_ci * to endorse or promote products derived from this software without specific prior written 173d8536b4Sopenharmony_ci * permission. 183d8536b4Sopenharmony_ci * 193d8536b4Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 203d8536b4Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 213d8536b4Sopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 223d8536b4Sopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 233d8536b4Sopenharmony_ci * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 243d8536b4Sopenharmony_ci * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 253d8536b4Sopenharmony_ci * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 263d8536b4Sopenharmony_ci * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 273d8536b4Sopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 283d8536b4Sopenharmony_ci * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 293d8536b4Sopenharmony_ci * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 303d8536b4Sopenharmony_ci */ 313d8536b4Sopenharmony_ci 323d8536b4Sopenharmony_ci#ifndef _LOS_COMPILER_H 333d8536b4Sopenharmony_ci#define _LOS_COMPILER_H 343d8536b4Sopenharmony_ci 353d8536b4Sopenharmony_ci/* for IAR Compiler */ 363d8536b4Sopenharmony_ci#ifdef __ICCARM__ 373d8536b4Sopenharmony_ci#include "iccarm_builtin.h" 383d8536b4Sopenharmony_ci#endif 393d8536b4Sopenharmony_ci 403d8536b4Sopenharmony_ci#ifdef __cplusplus 413d8536b4Sopenharmony_ci#if __cplusplus 423d8536b4Sopenharmony_ciextern "C" { 433d8536b4Sopenharmony_ci#endif /* __cplusplus */ 443d8536b4Sopenharmony_ci#endif /* __cplusplus */ 453d8536b4Sopenharmony_ci 463d8536b4Sopenharmony_ci/* for IAR Compiler */ 473d8536b4Sopenharmony_ci#ifdef __ICCARM__ 483d8536b4Sopenharmony_ci 493d8536b4Sopenharmony_ci#ifndef ASM 503d8536b4Sopenharmony_ci#define ASM __asm 513d8536b4Sopenharmony_ci#endif 523d8536b4Sopenharmony_ci 533d8536b4Sopenharmony_ci#ifndef INLINE 543d8536b4Sopenharmony_ci#define INLINE inline 553d8536b4Sopenharmony_ci#endif 563d8536b4Sopenharmony_ci 573d8536b4Sopenharmony_ci#ifndef STATIC_INLINE 583d8536b4Sopenharmony_ci#define STATIC_INLINE static inline 593d8536b4Sopenharmony_ci#endif 603d8536b4Sopenharmony_ci 613d8536b4Sopenharmony_ci#ifndef USED 623d8536b4Sopenharmony_ci#define USED __root 633d8536b4Sopenharmony_ci#endif 643d8536b4Sopenharmony_ci 653d8536b4Sopenharmony_ci#ifndef WEAK 663d8536b4Sopenharmony_ci#define WEAK __weak 673d8536b4Sopenharmony_ci#endif 683d8536b4Sopenharmony_ci 693d8536b4Sopenharmony_ci#ifndef CLZ 703d8536b4Sopenharmony_ci#define CLZ __iar_builtin_CLZ 713d8536b4Sopenharmony_ci#endif 723d8536b4Sopenharmony_ci 733d8536b4Sopenharmony_ci#ifndef NORETURN 743d8536b4Sopenharmony_ci#define NORETURN __attribute__ ((__noreturn__)) 753d8536b4Sopenharmony_ci#endif 763d8536b4Sopenharmony_ci 773d8536b4Sopenharmony_ci#ifndef UNREACHABLE 783d8536b4Sopenharmony_ci#define UNREACHABLE while (1) 793d8536b4Sopenharmony_ci#endif 803d8536b4Sopenharmony_ci 813d8536b4Sopenharmony_ci/* for ARM Compiler */ 823d8536b4Sopenharmony_ci#elif defined(__CC_ARM) 833d8536b4Sopenharmony_ci 843d8536b4Sopenharmony_ci#ifndef ASM 853d8536b4Sopenharmony_ci#define ASM __asm 863d8536b4Sopenharmony_ci#endif 873d8536b4Sopenharmony_ci 883d8536b4Sopenharmony_ci#ifndef INLINE 893d8536b4Sopenharmony_ci#define INLINE __inline 903d8536b4Sopenharmony_ci#endif 913d8536b4Sopenharmony_ci 923d8536b4Sopenharmony_ci#ifndef STATIC_INLINE 933d8536b4Sopenharmony_ci#define STATIC_INLINE static __inline 943d8536b4Sopenharmony_ci#endif 953d8536b4Sopenharmony_ci 963d8536b4Sopenharmony_ci#ifndef USED 973d8536b4Sopenharmony_ci#define USED __attribute__((used)) 983d8536b4Sopenharmony_ci#endif 993d8536b4Sopenharmony_ci 1003d8536b4Sopenharmony_ci#ifndef WEAK 1013d8536b4Sopenharmony_ci#define WEAK __attribute__((weak)) 1023d8536b4Sopenharmony_ci#endif 1033d8536b4Sopenharmony_ci 1043d8536b4Sopenharmony_ci#ifndef CLZ 1053d8536b4Sopenharmony_ci#define CLZ __clz 1063d8536b4Sopenharmony_ci#endif 1073d8536b4Sopenharmony_ci 1083d8536b4Sopenharmony_ci#ifndef NORETURN 1093d8536b4Sopenharmony_ci#define NORETURN __declspec(noreturn) 1103d8536b4Sopenharmony_ci#endif 1113d8536b4Sopenharmony_ci 1123d8536b4Sopenharmony_ci#ifndef UNREACHABLE 1133d8536b4Sopenharmony_ci#define UNREACHABLE while (1) 1143d8536b4Sopenharmony_ci#endif 1153d8536b4Sopenharmony_ci 1163d8536b4Sopenharmony_ci#pragma anon_unions 1173d8536b4Sopenharmony_ci 1183d8536b4Sopenharmony_ci/* for GNU Compiler */ 1193d8536b4Sopenharmony_ci#elif defined(__GNUC__) 1203d8536b4Sopenharmony_ci 1213d8536b4Sopenharmony_ci#ifndef ASM 1223d8536b4Sopenharmony_ci#define ASM __asm 1233d8536b4Sopenharmony_ci#endif 1243d8536b4Sopenharmony_ci 1253d8536b4Sopenharmony_ci#ifndef INLINE 1263d8536b4Sopenharmony_ci#define INLINE inline 1273d8536b4Sopenharmony_ci#endif 1283d8536b4Sopenharmony_ci 1293d8536b4Sopenharmony_ci#ifndef STATIC_INLINE 1303d8536b4Sopenharmony_ci#define STATIC_INLINE static inline 1313d8536b4Sopenharmony_ci#endif 1323d8536b4Sopenharmony_ci 1333d8536b4Sopenharmony_ci#ifndef USED 1343d8536b4Sopenharmony_ci#define USED __attribute__((used)) 1353d8536b4Sopenharmony_ci#endif 1363d8536b4Sopenharmony_ci 1373d8536b4Sopenharmony_ci#ifndef WEAK 1383d8536b4Sopenharmony_ci#define WEAK __attribute__((weak)) 1393d8536b4Sopenharmony_ci#endif 1403d8536b4Sopenharmony_ci 1413d8536b4Sopenharmony_ci#ifndef CLZ 1423d8536b4Sopenharmony_ci#define CLZ __builtin_clz 1433d8536b4Sopenharmony_ci#endif 1443d8536b4Sopenharmony_ci 1453d8536b4Sopenharmony_ci#ifndef NORETURN 1463d8536b4Sopenharmony_ci#define NORETURN __attribute__ ((__noreturn__)) 1473d8536b4Sopenharmony_ci#endif 1483d8536b4Sopenharmony_ci 1493d8536b4Sopenharmony_ci#ifndef UNREACHABLE 1503d8536b4Sopenharmony_ci#define UNREACHABLE __builtin_unreachable() 1513d8536b4Sopenharmony_ci#endif 1523d8536b4Sopenharmony_ci 1533d8536b4Sopenharmony_ci#else 1543d8536b4Sopenharmony_ci#error Unknown compiler. 1553d8536b4Sopenharmony_ci#endif 1563d8536b4Sopenharmony_ci 1573d8536b4Sopenharmony_ci#ifndef STATIC 1583d8536b4Sopenharmony_ci#define STATIC static 1593d8536b4Sopenharmony_ci#endif 1603d8536b4Sopenharmony_ci 1613d8536b4Sopenharmony_ci/** 1623d8536b4Sopenharmony_ci * @ingroup los_builddef 1633d8536b4Sopenharmony_ci * Define inline keyword 1643d8536b4Sopenharmony_ci */ 1653d8536b4Sopenharmony_ci#ifndef INLINE 1663d8536b4Sopenharmony_ci#define INLINE static inline 1673d8536b4Sopenharmony_ci#endif 1683d8536b4Sopenharmony_ci 1693d8536b4Sopenharmony_ci/** 1703d8536b4Sopenharmony_ci * @ingroup los_builddef 1713d8536b4Sopenharmony_ci * Little endian 1723d8536b4Sopenharmony_ci */ 1733d8536b4Sopenharmony_ci#define OS_LITTLE_ENDIAN 0x1234 1743d8536b4Sopenharmony_ci 1753d8536b4Sopenharmony_ci/** 1763d8536b4Sopenharmony_ci * @ingroup los_builddef 1773d8536b4Sopenharmony_ci * Big endian 1783d8536b4Sopenharmony_ci */ 1793d8536b4Sopenharmony_ci#define OS_BIG_ENDIAN 0x4321 1803d8536b4Sopenharmony_ci 1813d8536b4Sopenharmony_ci/** 1823d8536b4Sopenharmony_ci * @ingroup los_builddef 1833d8536b4Sopenharmony_ci * Byte order 1843d8536b4Sopenharmony_ci */ 1853d8536b4Sopenharmony_ci#ifndef OS_BYTE_ORDER 1863d8536b4Sopenharmony_ci#define OS_BYTE_ORDER OS_LITTLE_ENDIAN 1873d8536b4Sopenharmony_ci#endif 1883d8536b4Sopenharmony_ci 1893d8536b4Sopenharmony_ci/* Define OS code data sections */ 1903d8536b4Sopenharmony_ci/* The indicator function is inline */ 1913d8536b4Sopenharmony_ci 1923d8536b4Sopenharmony_ci/** 1933d8536b4Sopenharmony_ci * @ingroup los_builddef 1943d8536b4Sopenharmony_ci * Allow inline sections 1953d8536b4Sopenharmony_ci */ 1963d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_ALW_INLINE 1973d8536b4Sopenharmony_ci#define LITE_OS_SEC_ALW_INLINE // __attribute__((always_inline)) 1983d8536b4Sopenharmony_ci#endif 1993d8536b4Sopenharmony_ci 2003d8536b4Sopenharmony_ci/** 2013d8536b4Sopenharmony_ci * @ingroup los_builddef 2023d8536b4Sopenharmony_ci * Vector table section 2033d8536b4Sopenharmony_ci */ 2043d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_VEC 2053d8536b4Sopenharmony_ci#define LITE_OS_SEC_VEC __attribute__ ((section(".vector"))) 2063d8536b4Sopenharmony_ci#endif 2073d8536b4Sopenharmony_ci 2083d8536b4Sopenharmony_ci/** 2093d8536b4Sopenharmony_ci * @ingroup los_builddef 2103d8536b4Sopenharmony_ci * .Text section (Code section) 2113d8536b4Sopenharmony_ci */ 2123d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_TEXT 2133d8536b4Sopenharmony_ci#define LITE_OS_SEC_TEXT // __attribute__((section(".sram.text"))) 2143d8536b4Sopenharmony_ci#endif 2153d8536b4Sopenharmony_ci 2163d8536b4Sopenharmony_ci/** 2173d8536b4Sopenharmony_ci * @ingroup los_builddef 2183d8536b4Sopenharmony_ci * .Text.ddr section 2193d8536b4Sopenharmony_ci */ 2203d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_TEXT_MINOR 2213d8536b4Sopenharmony_ci#define LITE_OS_SEC_TEXT_MINOR // __attribute__((section(".dyn.text"))) 2223d8536b4Sopenharmony_ci#endif 2233d8536b4Sopenharmony_ci 2243d8536b4Sopenharmony_ci/** 2253d8536b4Sopenharmony_ci * @ingroup los_builddef 2263d8536b4Sopenharmony_ci * .Text.init section 2273d8536b4Sopenharmony_ci */ 2283d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_TEXT_INIT 2293d8536b4Sopenharmony_ci#define LITE_OS_SEC_TEXT_INIT // __attribute__((section(".dyn.text"))) 2303d8536b4Sopenharmony_ci#endif 2313d8536b4Sopenharmony_ci 2323d8536b4Sopenharmony_ci/** 2333d8536b4Sopenharmony_ci * @ingroup los_builddef 2343d8536b4Sopenharmony_ci * .Data section 2353d8536b4Sopenharmony_ci */ 2363d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_DATA 2373d8536b4Sopenharmony_ci#define LITE_OS_SEC_DATA // __attribute__((section(".dyn.data"))) 2383d8536b4Sopenharmony_ci#endif 2393d8536b4Sopenharmony_ci 2403d8536b4Sopenharmony_ci/** 2413d8536b4Sopenharmony_ci * @ingroup los_builddef 2423d8536b4Sopenharmony_ci * .Data.init section 2433d8536b4Sopenharmony_ci */ 2443d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_DATA_INIT 2453d8536b4Sopenharmony_ci#define LITE_OS_SEC_DATA_INIT // __attribute__((section(".dyn.data"))) 2463d8536b4Sopenharmony_ci#endif 2473d8536b4Sopenharmony_ci 2483d8536b4Sopenharmony_ci/** 2493d8536b4Sopenharmony_ci * @ingroup los_builddef 2503d8536b4Sopenharmony_ci * Not initialized variable section 2513d8536b4Sopenharmony_ci */ 2523d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_BSS 2533d8536b4Sopenharmony_ci#define LITE_OS_SEC_BSS // __attribute__((section(".sym.bss"))) 2543d8536b4Sopenharmony_ci#endif 2553d8536b4Sopenharmony_ci 2563d8536b4Sopenharmony_ci/** 2573d8536b4Sopenharmony_ci * @ingroup los_builddef 2583d8536b4Sopenharmony_ci * .bss.ddr section 2593d8536b4Sopenharmony_ci */ 2603d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_BSS_MINOR 2613d8536b4Sopenharmony_ci#define LITE_OS_SEC_BSS_MINOR 2623d8536b4Sopenharmony_ci#endif 2633d8536b4Sopenharmony_ci 2643d8536b4Sopenharmony_ci/** 2653d8536b4Sopenharmony_ci * @ingroup los_builddef 2663d8536b4Sopenharmony_ci * .bss.init sections 2673d8536b4Sopenharmony_ci */ 2683d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_BSS_INIT 2693d8536b4Sopenharmony_ci#define LITE_OS_SEC_BSS_INIT 2703d8536b4Sopenharmony_ci#endif 2713d8536b4Sopenharmony_ci 2723d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_TEXT_DATA 2733d8536b4Sopenharmony_ci#define LITE_OS_SEC_TEXT_DATA // __attribute__((section(".dyn.data"))) 2743d8536b4Sopenharmony_ci#define LITE_OS_SEC_TEXT_BSS // __attribute__((section(".dyn.bss"))) 2753d8536b4Sopenharmony_ci#define LITE_OS_SEC_TEXT_RODATA // __attribute__((section(".dyn.rodata"))) 2763d8536b4Sopenharmony_ci#endif 2773d8536b4Sopenharmony_ci 2783d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_SYMDATA 2793d8536b4Sopenharmony_ci#define LITE_OS_SEC_SYMDATA // __attribute__((section(".sym.data"))) 2803d8536b4Sopenharmony_ci#endif 2813d8536b4Sopenharmony_ci 2823d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_SYMBSS 2833d8536b4Sopenharmony_ci#define LITE_OS_SEC_SYMBSS // __attribute__((section(".sym.bss"))) 2843d8536b4Sopenharmony_ci#endif 2853d8536b4Sopenharmony_ci 2863d8536b4Sopenharmony_ci 2873d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_KEEP_DATA_DDR 2883d8536b4Sopenharmony_ci#define LITE_OS_SEC_KEEP_DATA_DDR // __attribute__((section(".keep.data.ddr"))) 2893d8536b4Sopenharmony_ci#endif 2903d8536b4Sopenharmony_ci 2913d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_KEEP_TEXT_DDR 2923d8536b4Sopenharmony_ci#define LITE_OS_SEC_KEEP_TEXT_DDR // __attribute__((section(".keep.text.ddr"))) 2933d8536b4Sopenharmony_ci#endif 2943d8536b4Sopenharmony_ci 2953d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_KEEP_DATA_SRAM 2963d8536b4Sopenharmony_ci#define LITE_OS_SEC_KEEP_DATA_SRAM // __attribute__((section(".keep.data.sram"))) 2973d8536b4Sopenharmony_ci#endif 2983d8536b4Sopenharmony_ci 2993d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_KEEP_TEXT_SRAM 3003d8536b4Sopenharmony_ci#define LITE_OS_SEC_KEEP_TEXT_SRAM // __attribute__((section(".keep.text.sram"))) 3013d8536b4Sopenharmony_ci#endif 3023d8536b4Sopenharmony_ci 3033d8536b4Sopenharmony_ci#ifndef LITE_OS_SEC_BSS_MINOR 3043d8536b4Sopenharmony_ci#define LITE_OS_SEC_BSS_MINOR 3053d8536b4Sopenharmony_ci#endif 3063d8536b4Sopenharmony_ci 3073d8536b4Sopenharmony_ci/* type definitions */ 3083d8536b4Sopenharmony_citypedef unsigned char UINT8; 3093d8536b4Sopenharmony_citypedef unsigned short UINT16; 3103d8536b4Sopenharmony_citypedef unsigned int UINT32; 3113d8536b4Sopenharmony_citypedef signed char INT8; 3123d8536b4Sopenharmony_citypedef signed short INT16; 3133d8536b4Sopenharmony_citypedef signed int INT32; 3143d8536b4Sopenharmony_citypedef float FLOAT; 3153d8536b4Sopenharmony_citypedef double DOUBLE; 3163d8536b4Sopenharmony_citypedef char CHAR; 3173d8536b4Sopenharmony_ci 3183d8536b4Sopenharmony_citypedef unsigned long long UINT64; 3193d8536b4Sopenharmony_citypedef signed long long INT64; 3203d8536b4Sopenharmony_citypedef unsigned int UINTPTR; 3213d8536b4Sopenharmony_citypedef signed int INTPTR; 3223d8536b4Sopenharmony_ci 3233d8536b4Sopenharmony_citypedef volatile INT32 Atomic; 3243d8536b4Sopenharmony_citypedef volatile INT64 Atomic64; 3253d8536b4Sopenharmony_ci 3263d8536b4Sopenharmony_ci#ifndef DEFINED_BOOL 3273d8536b4Sopenharmony_citypedef unsigned int BOOL; 3283d8536b4Sopenharmony_ci#define DEFINED_BOOL 3293d8536b4Sopenharmony_ci#endif 3303d8536b4Sopenharmony_ci 3313d8536b4Sopenharmony_ci#ifndef VOID 3323d8536b4Sopenharmony_ci#define VOID void 3333d8536b4Sopenharmony_ci#endif 3343d8536b4Sopenharmony_ci 3353d8536b4Sopenharmony_ci#ifndef FALSE 3363d8536b4Sopenharmony_ci#define FALSE ((BOOL)0) 3373d8536b4Sopenharmony_ci#endif 3383d8536b4Sopenharmony_ci 3393d8536b4Sopenharmony_ci#ifndef TRUE 3403d8536b4Sopenharmony_ci#define TRUE ((BOOL)1) 3413d8536b4Sopenharmony_ci#endif 3423d8536b4Sopenharmony_ci 3433d8536b4Sopenharmony_ci#ifndef NULL 3443d8536b4Sopenharmony_ci#ifdef __cplusplus 3453d8536b4Sopenharmony_ci#define NULL 0L 3463d8536b4Sopenharmony_ci#else 3473d8536b4Sopenharmony_ci#define NULL ((void*)0) 3483d8536b4Sopenharmony_ci#endif 3493d8536b4Sopenharmony_ci#endif 3503d8536b4Sopenharmony_ci 3513d8536b4Sopenharmony_ci#define OS_NULL_BYTE ((UINT8)0xFF) 3523d8536b4Sopenharmony_ci#define OS_NULL_SHORT ((UINT16)0xFFFF) 3533d8536b4Sopenharmony_ci#define OS_NULL_INT ((UINT32)0xFFFFFFFF) 3543d8536b4Sopenharmony_ci 3553d8536b4Sopenharmony_ci#ifndef LOS_OK 3563d8536b4Sopenharmony_ci#define LOS_OK 0U 3573d8536b4Sopenharmony_ci#endif 3583d8536b4Sopenharmony_ci 3593d8536b4Sopenharmony_ci#ifndef LOS_NOK 3603d8536b4Sopenharmony_ci#define LOS_NOK (UINT32)(-1) 3613d8536b4Sopenharmony_ci#endif 3623d8536b4Sopenharmony_ci 3633d8536b4Sopenharmony_ci#define OS_FAIL 1 3643d8536b4Sopenharmony_ci#define OS_ERROR (UINT32)(-1) 3653d8536b4Sopenharmony_ci#define OS_INVALID (UINT32)(-1) 3663d8536b4Sopenharmony_ci#define OS_64BIT_MAX (0xFFFFFFFFFFFFFFFFULL) 3673d8536b4Sopenharmony_ci 3683d8536b4Sopenharmony_ci#define asm __asm 3693d8536b4Sopenharmony_ci#ifdef typeof 3703d8536b4Sopenharmony_ci#undef typeof 3713d8536b4Sopenharmony_ci#endif 3723d8536b4Sopenharmony_ci#define typeof __typeof__ 3733d8536b4Sopenharmony_ci 3743d8536b4Sopenharmony_ci#define SIZE(a) (a) 3753d8536b4Sopenharmony_ci 3763d8536b4Sopenharmony_ci#define LOS_ASSERT_COND(expression) 3773d8536b4Sopenharmony_ci 3783d8536b4Sopenharmony_ci/** 3793d8536b4Sopenharmony_ci * @ingroup los_base 3803d8536b4Sopenharmony_ci * Align the beginning of the object with the base address addr, 3813d8536b4Sopenharmony_ci * with boundary bytes being the smallest unit of alignment. 3823d8536b4Sopenharmony_ci */ 3833d8536b4Sopenharmony_ci#ifndef ALIGN 3843d8536b4Sopenharmony_ci#define ALIGN(addr, boundary) LOS_Align(addr, boundary) 3853d8536b4Sopenharmony_ci#endif 3863d8536b4Sopenharmony_ci/** 3873d8536b4Sopenharmony_ci * @ingroup los_base 3883d8536b4Sopenharmony_ci * Align the tail of the object with the base address addr, with size bytes being the smallest unit of alignment. 3893d8536b4Sopenharmony_ci */ 3903d8536b4Sopenharmony_ci#define TRUNCATE(addr, size) ((addr) & ~((size) - 1)) 3913d8536b4Sopenharmony_ci 3923d8536b4Sopenharmony_ci 3933d8536b4Sopenharmony_ci/** 3943d8536b4Sopenharmony_ci * @ingroup los_base 3953d8536b4Sopenharmony_ci * @brief Align the value (addr) by some bytes (boundary) you specify. 3963d8536b4Sopenharmony_ci * 3973d8536b4Sopenharmony_ci * @par Description: 3983d8536b4Sopenharmony_ci * This API is used to align the value (addr) by some bytes (boundary) you specify. 3993d8536b4Sopenharmony_ci * 4003d8536b4Sopenharmony_ci * @attention 4013d8536b4Sopenharmony_ci * <ul> 4023d8536b4Sopenharmony_ci * <li>the value of boundary usually is 4,8,16,32.</li> 4033d8536b4Sopenharmony_ci * </ul> 4043d8536b4Sopenharmony_ci * 4053d8536b4Sopenharmony_ci * @param addr [IN] The variable what you want to align. 4063d8536b4Sopenharmony_ci * @param boundary [IN] The align size what you want to align. 4073d8536b4Sopenharmony_ci * 4083d8536b4Sopenharmony_ci * @retval #UINT32 The variable what have been aligned. 4093d8536b4Sopenharmony_ci * @par Dependency: 4103d8536b4Sopenharmony_ci * <ul><li>los_base.h: the header file that contains the API declaration.</li></ul> 4113d8536b4Sopenharmony_ci * @see 4123d8536b4Sopenharmony_ci */ 4133d8536b4Sopenharmony_cistatic inline UINT32 LOS_Align(UINT32 addr, UINT32 boundary) 4143d8536b4Sopenharmony_ci{ 4153d8536b4Sopenharmony_ci return (addr + (((addr + (boundary - 1)) > addr) ? (boundary - 1) : 0)) & ~(boundary - 1); 4163d8536b4Sopenharmony_ci} 4173d8536b4Sopenharmony_ci 4183d8536b4Sopenharmony_ci#define OS_GOTO_ERREND() \ 4193d8536b4Sopenharmony_ci do { \ 4203d8536b4Sopenharmony_ci goto LOS_ERREND; \ 4213d8536b4Sopenharmony_ci } while (0) 4223d8536b4Sopenharmony_ci 4233d8536b4Sopenharmony_ci#ifndef UNUSED 4243d8536b4Sopenharmony_ci#define UNUSED(X) (void)X 4253d8536b4Sopenharmony_ci#endif 4263d8536b4Sopenharmony_ci 4273d8536b4Sopenharmony_ci#if defined(__GNUC__) 4283d8536b4Sopenharmony_ci#ifndef __XTENSA_LX6__ 4293d8536b4Sopenharmony_cistatic inline void maybe_release_fence(int model) 4303d8536b4Sopenharmony_ci{ 4313d8536b4Sopenharmony_ci switch (model) { 4323d8536b4Sopenharmony_ci case __ATOMIC_RELEASE: 4333d8536b4Sopenharmony_ci __atomic_thread_fence (__ATOMIC_RELEASE); 4343d8536b4Sopenharmony_ci break; 4353d8536b4Sopenharmony_ci case __ATOMIC_ACQ_REL: 4363d8536b4Sopenharmony_ci __atomic_thread_fence (__ATOMIC_ACQ_REL); 4373d8536b4Sopenharmony_ci break; 4383d8536b4Sopenharmony_ci case __ATOMIC_SEQ_CST: 4393d8536b4Sopenharmony_ci __atomic_thread_fence (__ATOMIC_SEQ_CST); 4403d8536b4Sopenharmony_ci break; 4413d8536b4Sopenharmony_ci default: 4423d8536b4Sopenharmony_ci break; 4433d8536b4Sopenharmony_ci } 4443d8536b4Sopenharmony_ci} 4453d8536b4Sopenharmony_ci 4463d8536b4Sopenharmony_cistatic inline void maybe_acquire_fence(int model) 4473d8536b4Sopenharmony_ci{ 4483d8536b4Sopenharmony_ci switch (model) { 4493d8536b4Sopenharmony_ci case __ATOMIC_ACQUIRE: 4503d8536b4Sopenharmony_ci __atomic_thread_fence (__ATOMIC_ACQUIRE); 4513d8536b4Sopenharmony_ci break; 4523d8536b4Sopenharmony_ci case __ATOMIC_ACQ_REL: 4533d8536b4Sopenharmony_ci __atomic_thread_fence (__ATOMIC_ACQ_REL); 4543d8536b4Sopenharmony_ci break; 4553d8536b4Sopenharmony_ci case __ATOMIC_SEQ_CST: 4563d8536b4Sopenharmony_ci __atomic_thread_fence (__ATOMIC_SEQ_CST); 4573d8536b4Sopenharmony_ci break; 4583d8536b4Sopenharmony_ci default: 4593d8536b4Sopenharmony_ci break; 4603d8536b4Sopenharmony_ci } 4613d8536b4Sopenharmony_ci} 4623d8536b4Sopenharmony_ci 4633d8536b4Sopenharmony_ci#define __LIBATOMIC_N_LOCKS (1 << 4) /* 4, 1<<4 locks num */ 4643d8536b4Sopenharmony_cistatic inline BOOL *__libatomic_flag_for_address(void *addr) 4653d8536b4Sopenharmony_ci{ 4663d8536b4Sopenharmony_ci static BOOL flag_table[__LIBATOMIC_N_LOCKS] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 4673d8536b4Sopenharmony_ci UINTPTR p = (UINTPTR)(UINTPTR *)addr; 4683d8536b4Sopenharmony_ci p += (p >> 2) + (p << 4); /* 2, 4, hash data */ 4693d8536b4Sopenharmony_ci p += (p >> 7) + (p << 5); /* 7, 5, hash data */ 4703d8536b4Sopenharmony_ci p += (p >> 17) + (p << 13); /* 17, 13, hash data */ 4713d8536b4Sopenharmony_ci 4723d8536b4Sopenharmony_ci if (sizeof(void *) > 4) { /* 4, sizeof int in 32bit system */ 4733d8536b4Sopenharmony_ci p += (p >> 31); /* 31, for hash high bits data */ 4743d8536b4Sopenharmony_ci } 4753d8536b4Sopenharmony_ci 4763d8536b4Sopenharmony_ci p &= (__LIBATOMIC_N_LOCKS - 1); 4773d8536b4Sopenharmony_ci return flag_table + p; 4783d8536b4Sopenharmony_ci} 4793d8536b4Sopenharmony_ci 4803d8536b4Sopenharmony_cistatic inline void get_lock(void *addr, int model) 4813d8536b4Sopenharmony_ci{ 4823d8536b4Sopenharmony_ci BOOL *lock_ptr = __libatomic_flag_for_address (addr); 4833d8536b4Sopenharmony_ci 4843d8536b4Sopenharmony_ci maybe_release_fence (model); 4853d8536b4Sopenharmony_ci while (__atomic_test_and_set (lock_ptr, __ATOMIC_ACQUIRE) == 1) { 4863d8536b4Sopenharmony_ci ; 4873d8536b4Sopenharmony_ci } 4883d8536b4Sopenharmony_ci} 4893d8536b4Sopenharmony_ci 4903d8536b4Sopenharmony_cistatic inline void free_lock(void *addr, int model) 4913d8536b4Sopenharmony_ci{ 4923d8536b4Sopenharmony_ci BOOL *lock_ptr = __libatomic_flag_for_address (addr); 4933d8536b4Sopenharmony_ci 4943d8536b4Sopenharmony_ci __atomic_clear (lock_ptr, __ATOMIC_RELEASE); 4953d8536b4Sopenharmony_ci maybe_acquire_fence (model); 4963d8536b4Sopenharmony_ci} 4973d8536b4Sopenharmony_ci 4983d8536b4Sopenharmony_cistatic inline UINT64 __atomic_load_8(const volatile void *mem, int model) 4993d8536b4Sopenharmony_ci{ 5003d8536b4Sopenharmony_ci UINT64 ret; 5013d8536b4Sopenharmony_ci 5023d8536b4Sopenharmony_ci void *memP = (void *)mem; 5033d8536b4Sopenharmony_ci get_lock (memP, model); 5043d8536b4Sopenharmony_ci ret = *(UINT64 *)mem; 5053d8536b4Sopenharmony_ci free_lock (memP, model); 5063d8536b4Sopenharmony_ci return ret; 5073d8536b4Sopenharmony_ci} 5083d8536b4Sopenharmony_ci 5093d8536b4Sopenharmony_cistatic inline void __atomic_store_8(volatile void *mem, UINT64 val, int model) 5103d8536b4Sopenharmony_ci{ 5113d8536b4Sopenharmony_ci void *memP = (void *)mem; 5123d8536b4Sopenharmony_ci get_lock (memP, model); 5133d8536b4Sopenharmony_ci *(UINT64 *)mem = val; 5143d8536b4Sopenharmony_ci free_lock (memP, model); 5153d8536b4Sopenharmony_ci} 5163d8536b4Sopenharmony_ci 5173d8536b4Sopenharmony_cistatic inline UINT64 __atomic_exchange_8(volatile void *mem, UINT64 val, int model) 5183d8536b4Sopenharmony_ci{ 5193d8536b4Sopenharmony_ci UINT64 ret; 5203d8536b4Sopenharmony_ci 5213d8536b4Sopenharmony_ci void *memP = (void *)mem; 5223d8536b4Sopenharmony_ci get_lock (memP, model); 5233d8536b4Sopenharmony_ci ret = *(UINT64 *)mem; 5243d8536b4Sopenharmony_ci *(UINT64 *)mem = val; 5253d8536b4Sopenharmony_ci free_lock (memP, model); 5263d8536b4Sopenharmony_ci return ret; 5273d8536b4Sopenharmony_ci} 5283d8536b4Sopenharmony_ci#endif /* __XTENSA_LX6__ */ 5293d8536b4Sopenharmony_ci 5303d8536b4Sopenharmony_ci#define ALIAS_OF(of) __attribute__((alias(#of))) 5313d8536b4Sopenharmony_ci#define FUNC_ALIAS(real_func, new_alias, args_list, return_type) \ 5323d8536b4Sopenharmony_ci return_type new_alias args_list ALIAS_OF(real_func) 5333d8536b4Sopenharmony_ci 5343d8536b4Sopenharmony_ci#else 5353d8536b4Sopenharmony_ci 5363d8536b4Sopenharmony_ci#define FUNC_ALIAS(real_func, new_alias, args_list, return_type) 5373d8536b4Sopenharmony_ci 5383d8536b4Sopenharmony_ci#endif /* __GNUC__ */ 5393d8536b4Sopenharmony_ci 5403d8536b4Sopenharmony_ci#ifdef __cplusplus 5413d8536b4Sopenharmony_ci#if __cplusplus 5423d8536b4Sopenharmony_ci} 5433d8536b4Sopenharmony_ci#endif /* __cplusplus */ 5443d8536b4Sopenharmony_ci#endif /* __cplusplus */ 5453d8536b4Sopenharmony_ci 5463d8536b4Sopenharmony_ci#endif /* _LOS_COMPILER_H */ 547