12559b2c8SAntonio Nino Diaz /* 22559b2c8SAntonio Nino Diaz * Copyright (c) 2019, Arm Limited. All rights reserved. 32559b2c8SAntonio Nino Diaz * 42559b2c8SAntonio Nino Diaz * SPDX-License-Identifier: BSD-3-Clause 52559b2c8SAntonio Nino Diaz */ 62559b2c8SAntonio Nino Diaz 72559b2c8SAntonio Nino Diaz #ifndef ARCH_FEATURES_H 82559b2c8SAntonio Nino Diaz #define ARCH_FEATURES_H 92559b2c8SAntonio Nino Diaz 102559b2c8SAntonio Nino Diaz #include <stdbool.h> 112559b2c8SAntonio Nino Diaz 122559b2c8SAntonio Nino Diaz #include <arch_helpers.h> 132559b2c8SAntonio Nino Diaz 1429a24134SAntonio Nino Diaz static inline bool is_armv7_gentimer_present(void) 1529a24134SAntonio Nino Diaz { 1629a24134SAntonio Nino Diaz /* The Generic Timer is always present in an ARMv8-A implementation */ 1729a24134SAntonio Nino Diaz return true; 1829a24134SAntonio Nino Diaz } 1929a24134SAntonio Nino Diaz 202559b2c8SAntonio Nino Diaz static inline bool is_armv8_2_ttcnp_present(void) 212559b2c8SAntonio Nino Diaz { 222559b2c8SAntonio Nino Diaz return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_CNP_SHIFT) & 232559b2c8SAntonio Nino Diaz ID_AA64MMFR2_EL1_CNP_MASK) != 0U; 242559b2c8SAntonio Nino Diaz } 252559b2c8SAntonio Nino Diaz 26*b86048c4SAntonio Nino Diaz static inline bool is_armv8_3_pauth_present(void) 27*b86048c4SAntonio Nino Diaz { 28*b86048c4SAntonio Nino Diaz uint64_t mask = (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) | 29*b86048c4SAntonio Nino Diaz (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) | 30*b86048c4SAntonio Nino Diaz (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) | 31*b86048c4SAntonio Nino Diaz (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT); 32*b86048c4SAntonio Nino Diaz 33*b86048c4SAntonio Nino Diaz /* If any of the fields is not zero, PAuth is present */ 34*b86048c4SAntonio Nino Diaz return (read_id_aa64isar1_el1() & mask) != 0U; 35*b86048c4SAntonio Nino Diaz } 36*b86048c4SAntonio Nino Diaz 37*b86048c4SAntonio Nino Diaz static inline bool is_armv8_3_pauth_api_present(void) 38*b86048c4SAntonio Nino Diaz { 39*b86048c4SAntonio Nino Diaz return ((read_id_aa64isar1_el1() >> ID_AA64ISAR1_API_SHIFT) & 40*b86048c4SAntonio Nino Diaz ID_AA64ISAR1_API_MASK) != 0U; 41*b86048c4SAntonio Nino Diaz } 42*b86048c4SAntonio Nino Diaz 43cedfa04bSSathees Balya static inline bool is_armv8_4_ttst_present(void) 44cedfa04bSSathees Balya { 45cedfa04bSSathees Balya return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_ST_SHIFT) & 46cedfa04bSSathees Balya ID_AA64MMFR2_EL1_ST_MASK) == 1U; 47cedfa04bSSathees Balya } 48cedfa04bSSathees Balya 492559b2c8SAntonio Nino Diaz #endif /* ARCH_FEATURES_H */ 50