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