From 89181b0136cb6cdfcef3ecae9c3ccc08f496d8c7 Mon Sep 17 00:00:00 2001 From: Robert Clausecker Date: Thu, 19 Sep 2024 17:16:36 +0200 Subject: [PATCH] lib/libexec/rtld-elf/aarch64: pass hwcap, hwcap2 to ifunc resolvers This allows ifunc resolvers to quickly check for the availability of common AArch64 extensions. --- libexec/rtld-elf/aarch64/reloc.c | 6 ++++++ libexec/rtld-elf/aarch64/rtld_machdep.h | 3 ++- sys/arm64/include/ifunc.h | 5 +++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/libexec/rtld-elf/aarch64/reloc.c b/libexec/rtld-elf/aarch64/reloc.c index 3687c9385326..99f076772e68 100644 --- a/libexec/rtld-elf/aarch64/reloc.c +++ b/libexec/rtld-elf/aarch64/reloc.c @@ -451,10 +451,16 @@ reloc_jmpslot(Elf_Addr *where, Elf_Addr target, return (target); } +unsigned long elf_hwcap, elf_hwcap2; + void ifunc_init(Elf_Auxinfo *aux_info[__min_size(AT_COUNT)] __unused) { + if (aux_info[AT_HWCAP] != NULL) + elf_hwcap = aux_info[AT_HWCAP]->a_un.a_val; + if (aux_info[AT_HWCAP2] != NULL) + elf_hwcap2 = aux_info[AT_HWCAP2]->a_un.a_val; } /* diff --git a/libexec/rtld-elf/aarch64/rtld_machdep.h b/libexec/rtld-elf/aarch64/rtld_machdep.h index 3cc1339fcad4..071c962947a6 100644 --- a/libexec/rtld-elf/aarch64/rtld_machdep.h +++ b/libexec/rtld-elf/aarch64/rtld_machdep.h @@ -72,9 +72,10 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target, * no arguments are passed in, and if this changes later will be able to * compare the argument with 0 to see if it is set. */ +extern unsigned long elf_hwcap, elf_hwcap2; #define call_ifunc_resolver(ptr) \ (((Elf_Addr (*)(uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, \ - uint64_t, uint64_t, uint64_t))ptr)(0, 0, 0, 0, 0, 0, 0, 0)) + uint64_t, uint64_t, uint64_t))ptr)(elf_hwcap, elf_hwcap2, 0, 0, 0, 0, 0, 0)) #define round(size, align) \ (((size) + (align) - 1) & ~((align) - 1)) diff --git a/sys/arm64/include/ifunc.h b/sys/arm64/include/ifunc.h index de452ad34c8f..48a4f45afcc7 100644 --- a/sys/arm64/include/ifunc.h +++ b/sys/arm64/include/ifunc.h @@ -39,10 +39,11 @@ uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, \ uint64_t))args __used; \ qual ret_type name args __attribute__((ifunc(#name "_resolver"))); \ - static ret_type (*name##_resolver(uint64_t _arg1 __unused, \ - uint64_t _arg2 __unused, uint64_t _arg3 __unused, \ + static ret_type (*name##_resolver(uint64_t elf_hwcap __unused, \ + uint64_t elf_hwcap2 __unused, uint64_t _arg3 __unused, \ uint64_t _arg4 __unused, uint64_t _arg5 __unused, \ uint64_t _arg6 __unused, uint64_t _arg7 __unused, \ uint64_t _arg8 __unused))args #endif + -- 2.46.0