android.inc 1.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. void __init_cpu_features_resolver(unsigned long hwcap,
  2. const __ifunc_arg_t *arg) {
  3. if (__atomic_load_n(&__aarch64_cpu_features.features, __ATOMIC_RELAXED))
  4. return;
  5. // ifunc resolvers don't have hwcaps in arguments on Android API lower
  6. // than 30. If so, set feature detection done and keep all CPU features
  7. // unsupported (zeros). To detect this case in runtime we check existence
  8. // of memfd_create function from Standard C library which was introduced in
  9. // Android API 30.
  10. int memfd_create(const char *, unsigned int) __attribute__((weak));
  11. if (!memfd_create)
  12. return;
  13. __init_cpu_features_constructor(hwcap, arg);
  14. }
  15. void CONSTRUCTOR_ATTRIBUTE __init_cpu_features(void) {
  16. // CPU features already initialized.
  17. if (__atomic_load_n(&__aarch64_cpu_features.features, __ATOMIC_RELAXED))
  18. return;
  19. // Don't set any CPU features,
  20. // detection could be wrong on Exynos 9810.
  21. if (__isExynos9810())
  22. return;
  23. unsigned long hwcap = getauxval(AT_HWCAP);
  24. unsigned long hwcap2 = getauxval(AT_HWCAP2);
  25. __ifunc_arg_t arg;
  26. arg._size = sizeof(__ifunc_arg_t);
  27. arg._hwcap = hwcap;
  28. arg._hwcap2 = hwcap2;
  29. __init_cpu_features_constructor(hwcap | _IFUNC_ARG_HWCAP, &arg);
  30. }