1*5f757f3fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 2*5f757f3fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 3*5f757f3fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 4*5f757f3fSDimitry Andric 5*5f757f3fSDimitry Andric __attribute__((visibility("hidden"), nocommon)) 6*5f757f3fSDimitry Andric _Bool __aarch64_has_sme_and_tpidr2_el0; 7*5f757f3fSDimitry Andric 8*5f757f3fSDimitry Andric // We have multiple ways to check that the function has SME, depending on our 9*5f757f3fSDimitry Andric // target. 10*5f757f3fSDimitry Andric // * For Linux we can use __getauxval(). 11*5f757f3fSDimitry Andric // * For newlib we can use __aarch64_sme_accessible(). 12*5f757f3fSDimitry Andric 13*5f757f3fSDimitry Andric #if defined(__linux__) 14*5f757f3fSDimitry Andric 15*5f757f3fSDimitry Andric #ifndef AT_HWCAP2 16*5f757f3fSDimitry Andric #define AT_HWCAP2 26 17*5f757f3fSDimitry Andric #endif 18*5f757f3fSDimitry Andric 19*5f757f3fSDimitry Andric #ifndef HWCAP2_SME 20*5f757f3fSDimitry Andric #define HWCAP2_SME (1 << 23) 21*5f757f3fSDimitry Andric #endif 22*5f757f3fSDimitry Andric 23*5f757f3fSDimitry Andric extern unsigned long int __getauxval (unsigned long int); 24*5f757f3fSDimitry Andric 25*5f757f3fSDimitry Andric static _Bool has_sme(void) { 26*5f757f3fSDimitry Andric return __getauxval(AT_HWCAP2) & HWCAP2_SME; 27*5f757f3fSDimitry Andric } 28*5f757f3fSDimitry Andric 29*5f757f3fSDimitry Andric #else // defined(__linux__) 30*5f757f3fSDimitry Andric 31*5f757f3fSDimitry Andric #if defined(COMPILER_RT_SHARED_LIB) 32*5f757f3fSDimitry Andric __attribute__((weak)) 33*5f757f3fSDimitry Andric #endif 34*5f757f3fSDimitry Andric extern _Bool __aarch64_sme_accessible(void); 35*5f757f3fSDimitry Andric 36*5f757f3fSDimitry Andric static _Bool has_sme(void) { 37*5f757f3fSDimitry Andric #if defined(COMPILER_RT_SHARED_LIB) 38*5f757f3fSDimitry Andric if (!__aarch64_sme_accessible) 39*5f757f3fSDimitry Andric return 0; 40*5f757f3fSDimitry Andric #endif 41*5f757f3fSDimitry Andric return __aarch64_sme_accessible(); 42*5f757f3fSDimitry Andric } 43*5f757f3fSDimitry Andric 44*5f757f3fSDimitry Andric #endif // defined(__linux__) 45*5f757f3fSDimitry Andric 46*5f757f3fSDimitry Andric #if __GNUC__ >= 9 47*5f757f3fSDimitry Andric #pragma GCC diagnostic ignored "-Wprio-ctor-dtor" 48*5f757f3fSDimitry Andric #endif 49*5f757f3fSDimitry Andric __attribute__((constructor(90))) 50*5f757f3fSDimitry Andric static void init_aarch64_has_sme(void) { 51*5f757f3fSDimitry Andric __aarch64_has_sme_and_tpidr2_el0 = has_sme(); 52*5f757f3fSDimitry Andric } 53