aboutsummaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2016-11-21 14:13:57 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2016-11-21 14:13:57 +0000
commitd27078f990785b7c64acc8a497cf7dffe24c74ab (patch)
tree1712d3993773eee5da7ac1bf188f0ec77c7c7234 /libexec
parent250b1bf3c56d49318cba89f1a3eb2f6892824dde (diff)
Notes
Diffstat (limited to 'libexec')
-rw-r--r--libexec/rtld-elf/aarch64/reloc.c2
-rw-r--r--libexec/rtld-elf/amd64/reloc.c2
-rw-r--r--libexec/rtld-elf/arm/reloc.c2
-rw-r--r--libexec/rtld-elf/i386/reloc.c22
-rw-r--r--libexec/rtld-elf/mips/reloc.c2
-rw-r--r--libexec/rtld-elf/powerpc/reloc.c2
-rw-r--r--libexec/rtld-elf/powerpc64/reloc.c2
-rw-r--r--libexec/rtld-elf/riscv/reloc.c2
-rw-r--r--libexec/rtld-elf/rtld.h2
-rw-r--r--libexec/rtld-elf/sparc64/reloc.c2
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)
{
}