| // Copyright 2020 The Fuchsia Authors |
| // |
| // Use of this source code is governed by a MIT-style |
| // license that can be found in the LICENSE file or at |
| // https://opensource.org/licenses/MIT |
| |
| #ifndef ZIRCON_KERNEL_INCLUDE_ARCH_QUIRKS_H_ |
| #define ZIRCON_KERNEL_INCLUDE_ARCH_QUIRKS_H_ |
| |
| #include <ktl/type_traits.h> |
| |
| // A small collection of functions used to deal with architecture specific |
| // quirks in sections of code which are generally architecture independent. |
| |
| // If we have any A73 cores in the system, we need to work around |
| // Cortex-A73 erratum 858921, described in: |
| // |
| // https://static.docs.arm.com/epm086451/120/Cortex-A73_MPCore_Software_Developers_Errata_Notice.pdf |
| // |
| // Right now, this means that we need a special version of current_ticks() in |
| // the kernel, and to inject a special version of zx_ticks_get in the VDSO if |
| // our clients are not going to make a syscall in order to read the tick |
| // counter. |
| // |
| // Do not call this function until all of the cores have been started and had a |
| // chance to identify themselves. Use mp_wait_for_all_cpus_started |
| // (kernel/mp.h) to establish this if needed. |
| #if __aarch64__ |
| bool arch_quirks_needs_arm_erratum_858921_mitigation(); |
| #else |
| template <typename T = void> |
| static inline bool arch_quirks_needs_arm_erratum_858921_mitigation() { |
| static_assert(!ktl::is_same_v<T, T>, |
| "Do not call arch_quirks_needs_arm_erratum_858921_mitigation when building " |
| "for non-ARM architectures"); |
| return false; |
| } |
| #endif |
| |
| #endif // ZIRCON_KERNEL_INCLUDE_ARCH_QUIRKS_H_ |