/* * The authors hereby grant permission to use, copy, modify, distribute, * and license this software and its documentation for any purpose, provided * that existing copyright notices are retained in all copies and that this * notice is included verbatim in any distributions. No written agreement, * license, or royalty fee is required for any of the authorized uses. * Modifications to this software may be copyrighted by their authors * and need not follow the licensing terms described here, provided that * the new terms are clearly indicated on the first page of each file where * they apply. */ #ifdef _MISRA_RULES #pragma diag(push) #pragma diag(suppress:misra_rule_2_4) #pragma diag(suppress:misra_rule_5_3) #pragma diag(suppress:misra_rule_6_3) #pragma diag(suppress:misra_rule_8_1) #pragma diag(suppress:misra_rule_8_8) #pragma diag(suppress:misra_rule_8_5) #pragma diag(suppress:misra_rule_19_7) #pragma diag(suppress:misra_rule_19_15) #pragma diag(suppress:misra_rule_20_2) #endif #ifdef __cplusplus extern "C" { #endif #if !defined(__NO_BUILTIN) /* VDSP -> GCC glue */ #define __builtin_NOP() __asm__ __volatile__ ("NOP;") #define __builtin_cli() ({ unsigned int __rval; __asm__ __volatile__ ("cli %0;" : "=r"(__rval)); __rval; }) #define __builtin_sti(x) __asm__ __volatile__ ("sti %0;" : : "r"(x)) #define __builtin_idle() __asm__ __volatile__ ("IDLE;") #define __builtin_raise(x) __asm__ __volatile__ ("raise %0;" : : "n"(x)) #define __builtin_excpt(x) __asm__ __volatile__ ("excpt %0;" : : "n"(x)) #define __builtin_prefetch(x) __asm__ __volatile__ ("PREFETCH[%0];" : : "p"(x)) #define __builtin_prefetchmodup(x) ({ void *__p = &(x); __asm__ __volatile__ ("PREFETCH[%0++];" : "+p"(__p)); __p; }) #define __builtin_flushinv(x) __asm__ __volatile__ ("FLUSHINV[%0];" : : "p"(x)) #define __builtin_flushinvmodup(x) ({ void *__p = &(x); __asm__ __volatile__ ("FLUSHINV[%0++];" : "+p"(__p)); __p; }) #define __builtin_flush(x) __asm__ __volatile__ ("FLUSH[%0];" : : "p"(x)) #define __builtin_flushmodup(x) ({ void *__p = &(x); __asm__ __volatile__ ("FLUSH[%0++];" : "+p"(__p)); __p; }) #define __builtin_iflush(x) __asm__ __volatile__ ("IFLUSH[%0];" : : "p"(x)) #define __builtin_iflushmodup(x) ({ void *__p = &(x); __asm__ __volatile__ ("IFLUSH[%0++];" : "+p"(__p)); __p; }) #define __builtin_csync() __builtin_bfin_csync() #define __builtin_ssync() __builtin_bfin_ssync() #endif /* __NO_BUILTIN */ #if !defined(__NO_BUILTIN) && !defined(__NO_SHORTNAMES) #if (!defined(__DEFINED_NOP) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_NOP)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_NOP)))) #define __DEFINED_NOP /* Insert a normal 16 bit NOP, which is treated as volatile. */ #pragma inline #pragma always_inline static void NOP(void) { __builtin_NOP(); } #endif /* __DEFINED_NOP */ #if (!defined(__DEFINED_CLI) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_CLI)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_CLI)))) #define __DEFINED_CLI #pragma inline #pragma always_inline static unsigned int cli(void) { unsigned int __rval = __builtin_cli(); return __rval; } #endif /* __DEFINED_CLI */ #if (!defined(__DEFINED_STI) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_STI)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_STI)))) #define __DEFINED_STI #pragma inline #pragma always_inline static void sti(unsigned int __a) { __builtin_sti(__a); } #endif /* __DEFINED_STI */ #if (!defined(__DEFINED_IDLE) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_IDLE)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_IDLE)))) #define __DEFINED_IDLE #pragma inline #pragma always_inline static void idle(void) { __builtin_idle(); } #endif /* __DEFINED_IDLE */ #if (!defined(__DEFINED_RAISE_INTR) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_RAISE_INTR)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_RAISE_INTR)))) #define __DEFINED_RAISE_INTR #define raise_intr(A) (__builtin_raise((A))) #endif /* __DEFINED_RAISE_INTR */ #if (!defined(__DEFINED_EXCPT) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_EXCPT)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_EXCPT)))) #define __DEFINED_EXCPT #define excpt(A) (__builtin_excpt((A))) #endif /* __DEFINED_EXCPT */ #if (!defined(__DEFINED_PREFETCH) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_PREFETCH)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_PREFETCH)))) #define __DEFINED_PREFETCH #pragma inline #pragma always_inline static void prefetch(void * __a) { __builtin_prefetch(__a); } #endif /* __DEFINED_PREFETCH */ #if (!defined(__DEFINED_PREFETCHMODUP) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_PREFETCHMODUP)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_PREFETCHMODUP)))) #define __DEFINED_PREFETCHMODUP #pragma inline #pragma always_inline static void * prefetchmodup(void * __a) { void * __rval = __builtin_prefetchmodup(__a); return __rval; } #endif /* __DEFINED_PREFETCHMODUP */ #if (!defined(__DEFINED_FLUSHINV) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_FLUSHINV)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_FLUSHINV)))) #define __DEFINED_FLUSHINV #pragma inline #pragma always_inline static void flushinv(void * __a) { __builtin_flushinv(__a); } #endif /* __DEFINED_FLUSHINV */ #if (!defined(__DEFINED_FLUSHINVMODUP) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_FLUSHINVMODUP)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_FLUSHINVMODUP)))) #define __DEFINED_FLUSHINVMODUP #pragma inline #pragma always_inline static void * flushinvmodup(void * __a) { void * __rval = __builtin_flushinvmodup(__a); return __rval; } #endif /* __DEFINED_FLUSHINVMODUP */ #if (!defined(__DEFINED_FLUSH) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_FLUSH)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_FLUSH)))) #define __DEFINED_FLUSH #pragma inline #pragma always_inline static void flush(void * __a) { __builtin_flush(__a); } #endif /* __DEFINED_FLUSH */ #if (!defined(__DEFINED_FLUSHMODUP) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_FLUSHMODUP)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_FLUSHMODUP)))) #define __DEFINED_FLUSHMODUP #pragma inline #pragma always_inline static void * flushmodup(void * __a) { void * __rval = __builtin_flushmodup(__a); return __rval; } #endif /* __DEFINED_FLUSHMODUP */ #if (!defined(__DEFINED_IFLUSH) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_IFLUSH)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_IFLUSH)))) #define __DEFINED_IFLUSH #pragma inline #pragma always_inline static void iflush(void * __a) { __builtin_iflush(__a); } #endif /* __DEFINED_IFLUSH */ #if (!defined(__DEFINED_IFLUSHMODUP) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_IFLUSHMODUP)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_IFLUSHMODUP)))) #define __DEFINED_IFLUSHMODUP #pragma inline #pragma always_inline static void * iflushmodup(void * __a) { void * __rval = __builtin_iflushmodup(__a); return __rval; } #endif /* __DEFINED_IFLUSHMODUP */ #if (!defined(__DEFINED_CSYNC) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_CSYNC)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_CSYNC)))) #define __DEFINED_CSYNC /* generate a csync instruction protected by CLI/STI for anomaly 05-00-0312; ** you can generate an unprotected csync by using csync_int */ #pragma inline #pragma always_inline static void csync(void) { __builtin_csync(); } #endif /* __DEFINED_CSYNC */ #if (!defined(__DEFINED_SSYNC) && \ ((defined(__SPECIFIC_NAMES) && defined(__ENABLE_SSYNC)) || \ (!defined(__SPECIFIC_NAMES) && !defined(__DISABLE_SSYNC)))) #define __DEFINED_SSYNC /* generate a ssync instruction protected by CLI/STI for anomaly 05-00-0312; ** you can generate an unprotected ssync by using ssync_int */ #pragma inline #pragma always_inline static void ssync(void) { __builtin_ssync(); } #endif /* __DEFINED_SSYNC */ #endif /* __NO_BUILTIN */ #ifdef _MISRA_RULES #pragma diag(pop) #endif #ifdef __cplusplus } #endif