diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2016-11-21 14:13:57 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2016-11-21 14:13:57 +0000 |
| commit | d27078f990785b7c64acc8a497cf7dffe24c74ab (patch) | |
| tree | 1712d3993773eee5da7ac1bf188f0ec77c7c7234 /libexec | |
| parent | 250b1bf3c56d49318cba89f1a3eb2f6892824dde (diff) | |
Notes
Diffstat (limited to 'libexec')
| -rw-r--r-- | libexec/rtld-elf/aarch64/reloc.c | 2 | ||||
| -rw-r--r-- | libexec/rtld-elf/amd64/reloc.c | 2 | ||||
| -rw-r--r-- | libexec/rtld-elf/arm/reloc.c | 2 | ||||
| -rw-r--r-- | libexec/rtld-elf/i386/reloc.c | 22 | ||||
| -rw-r--r-- | libexec/rtld-elf/mips/reloc.c | 2 | ||||
| -rw-r--r-- | libexec/rtld-elf/powerpc/reloc.c | 2 | ||||
| -rw-r--r-- | libexec/rtld-elf/powerpc64/reloc.c | 2 | ||||
| -rw-r--r-- | libexec/rtld-elf/riscv/reloc.c | 2 | ||||
| -rw-r--r-- | libexec/rtld-elf/rtld.h | 2 | ||||
| -rw-r--r-- | libexec/rtld-elf/sparc64/reloc.c | 2 |
10 files changed, 26 insertions, 14 deletions
diff --git a/libexec/rtld-elf/aarch64/reloc.c b/libexec/rtld-elf/aarch64/reloc.c index cff813ac80536..3f9de07db29f5 100644 --- a/libexec/rtld-elf/aarch64/reloc.c +++ b/libexec/rtld-elf/aarch64/reloc.c @@ -300,7 +300,7 @@ reloc_jmpslot(Elf_Addr *where, Elf_Addr target, const Obj_Entry *defobj, } void -ifunc_init(Elf_Auxinfo aux_info[static AT_COUNT] __unused) +ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused) { } diff --git a/libexec/rtld-elf/amd64/reloc.c b/libexec/rtld-elf/amd64/reloc.c index 43e3ce969c55a..10b933205c452 100644 --- a/libexec/rtld-elf/amd64/reloc.c +++ b/libexec/rtld-elf/amd64/reloc.c @@ -454,7 +454,7 @@ reloc_gnu_ifunc(Obj_Entry *obj, int flags, RtldLockState *lockstate) uint32_t cpu_feature, cpu_feature2, cpu_stdext_feature, cpu_stdext_feature2; void -ifunc_init(Elf_Auxinfo aux_info[static AT_COUNT] __unused) +ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused) { u_int p[4], cpu_high; diff --git a/libexec/rtld-elf/arm/reloc.c b/libexec/rtld-elf/arm/reloc.c index 94a9bf0e021d2..1b022c5a9d68e 100644 --- a/libexec/rtld-elf/arm/reloc.c +++ b/libexec/rtld-elf/arm/reloc.c @@ -480,7 +480,7 @@ reloc_jmpslot(Elf_Addr *where, Elf_Addr target, const Obj_Entry *defobj, } void -ifunc_init(Elf_Auxinfo aux_info[static AT_COUNT] __unused) +ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused) { } diff --git a/libexec/rtld-elf/i386/reloc.c b/libexec/rtld-elf/i386/reloc.c index 8a405fbccb65b..42efcf7a0306e 100644 --- a/libexec/rtld-elf/i386/reloc.c +++ b/libexec/rtld-elf/i386/reloc.c @@ -33,7 +33,6 @@ #include <sys/param.h> #include <sys/mman.h> -#include <machine/cpufunc.h> #include <machine/segments.h> #include <machine/sysarch.h> @@ -407,8 +406,21 @@ reloc_gnu_ifunc(Obj_Entry *obj, int flags, RtldLockState *lockstate) uint32_t cpu_feature, cpu_feature2, cpu_stdext_feature, cpu_stdext_feature2; +static void +rtld_cpuid_count(int idx, int cnt, u_int *p) +{ + + __asm __volatile( + " pushl %%ebx\n" + " cpuid\n" + " movl %%ebx,%1\n" + " popl %%ebx\n" + : "=a" (p[0]), "=r" (p[1]), "=c" (p[2]), "=d" (p[3]) + : "0" (idx), "2" (cnt)); +} + void -ifunc_init(Elf_Auxinfo aux_info[static AT_COUNT] __unused) +ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused) { u_int p[4], cpu_high; int cpuid_supported; @@ -432,13 +444,13 @@ ifunc_init(Elf_Auxinfo aux_info[static AT_COUNT] __unused) if (!cpuid_supported) return; - do_cpuid(1, p); + rtld_cpuid_count(1, 0, p); cpu_feature = p[3]; cpu_feature2 = p[2]; - do_cpuid(0, p); + rtld_cpuid_count(0, 0, p); cpu_high = p[0]; if (cpu_high >= 7) { - cpuid_count(7, 0, p); + rtld_cpuid_count(7, 0, p); cpu_stdext_feature = p[1]; cpu_stdext_feature2 = p[2]; } diff --git a/libexec/rtld-elf/mips/reloc.c b/libexec/rtld-elf/mips/reloc.c index 4f3d5c450d1d4..fef1d71a18b83 100644 --- a/libexec/rtld-elf/mips/reloc.c +++ b/libexec/rtld-elf/mips/reloc.c @@ -618,7 +618,7 @@ reloc_jmpslot(Elf_Addr *where, Elf_Addr target, const Obj_Entry *defobj, } void -ifunc_init(Elf_Auxinfo aux_info[static AT_COUNT] __unused) +ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused) { } diff --git a/libexec/rtld-elf/powerpc/reloc.c b/libexec/rtld-elf/powerpc/reloc.c index e76da987f21c4..dea564b0dc428 100644 --- a/libexec/rtld-elf/powerpc/reloc.c +++ b/libexec/rtld-elf/powerpc/reloc.c @@ -620,7 +620,7 @@ init_pltgot(Obj_Entry *obj) } void -ifunc_init(Elf_Auxinfo aux_info[static AT_COUNT] __unused) +ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused) { } diff --git a/libexec/rtld-elf/powerpc64/reloc.c b/libexec/rtld-elf/powerpc64/reloc.c index 6a09185b73a8d..e6198f0de8506 100644 --- a/libexec/rtld-elf/powerpc64/reloc.c +++ b/libexec/rtld-elf/powerpc64/reloc.c @@ -524,7 +524,7 @@ init_pltgot(Obj_Entry *obj) } void -ifunc_init(Elf_Auxinfo aux_info[static AT_COUNT] __unused) +ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused) { } diff --git a/libexec/rtld-elf/riscv/reloc.c b/libexec/rtld-elf/riscv/reloc.c index 5da0bd17566ab..71259cd629c64 100644 --- a/libexec/rtld-elf/riscv/reloc.c +++ b/libexec/rtld-elf/riscv/reloc.c @@ -367,7 +367,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags, } void -ifunc_init(Elf_Auxinfo aux_info[static AT_COUNT] __unused) +ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused) { } diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h index 99b56c1295970..afdf83a51fea0 100644 --- a/libexec/rtld-elf/rtld.h +++ b/libexec/rtld-elf/rtld.h @@ -367,7 +367,7 @@ void dump_Elf_Rela(Obj_Entry *, const Elf_Rela *, u_long); unsigned long elf_hash(const char *); const Elf_Sym *find_symdef(unsigned long, const Obj_Entry *, const Obj_Entry **, int, SymCache *, struct Struct_RtldLockState *); -void ifunc_init(Elf_Auxinfo[static AT_COUNT]); +void ifunc_init(Elf_Auxinfo[__min_size(AT_COUNT)]); void init_pltgot(Obj_Entry *); void lockdflt_init(void); void digest_notes(Obj_Entry *, Elf_Addr, Elf_Addr); diff --git a/libexec/rtld-elf/sparc64/reloc.c b/libexec/rtld-elf/sparc64/reloc.c index 981eea502b898..197c66c8627c9 100644 --- a/libexec/rtld-elf/sparc64/reloc.c +++ b/libexec/rtld-elf/sparc64/reloc.c @@ -787,7 +787,7 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *obj, } void -ifunc_init(Elf_Auxinfo aux_info[static AT_COUNT] __unused) +ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused) { } |
