aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Chagin <dchagin@FreeBSD.org>2023-07-28 08:56:59 +0000
committerDmitry Chagin <dchagin@FreeBSD.org>2023-07-28 08:56:59 +0000
commit4281dab8bc11b3b2f3b58be5e0f67806329bddae (patch)
treefe5ee9c2488e220fd3bd08e409ee969263c7776c
parent5440e7017a985276d4a46d482a76128e5b739f56 (diff)
downloadsrc-4281dab8bc11b3b2f3b58be5e0f67806329bddae.tar.gz
src-4281dab8bc11b3b2f3b58be5e0f67806329bddae.zip
linux(4): Add elf_hwcap2 to x86
On x86 Linux via AT_HWCAP2 the user controlled (by tunables) processor capabilities are exposed. Reviewed by: Differential Revision: https://reviews.freebsd.org/D41165 MFC after: 2 weeks
-rw-r--r--sys/amd64/linux/linux_sysvec.c2
-rw-r--r--sys/amd64/linux32/linux32_sysvec.c2
-rw-r--r--sys/i386/linux/linux.h2
-rw-r--r--sys/i386/linux/linux_sysvec.c1
-rw-r--r--sys/x86/linux/linux_x86.c18
-rw-r--r--sys/x86/linux/linux_x86.h6
6 files changed, 27 insertions, 4 deletions
diff --git a/sys/amd64/linux/linux_sysvec.c b/sys/amd64/linux/linux_sysvec.c
index ba4aff6f0c15..0f67282419b9 100644
--- a/sys/amd64/linux/linux_sysvec.c
+++ b/sys/amd64/linux/linux_sysvec.c
@@ -233,7 +233,7 @@ linux64_arch_copyout_auxargs(struct image_params *imgp, Elf_Auxinfo **pos)
AUXARGS_ENTRY((*pos), LINUX_AT_SYSINFO_EHDR, linux_vdso_base);
AUXARGS_ENTRY((*pos), LINUX_AT_HWCAP, cpu_feature);
- AUXARGS_ENTRY((*pos), LINUX_AT_HWCAP2, 0);
+ AUXARGS_ENTRY((*pos), LINUX_AT_HWCAP2, linux_x86_elf_hwcap2());
AUXARGS_ENTRY((*pos), LINUX_AT_PLATFORM, PTROUT(linux_platform));
}
diff --git a/sys/amd64/linux32/linux32_sysvec.c b/sys/amd64/linux32/linux32_sysvec.c
index e51ae68a229d..42161c029409 100644
--- a/sys/amd64/linux32/linux32_sysvec.c
+++ b/sys/amd64/linux32/linux32_sysvec.c
@@ -146,7 +146,7 @@ linux32_arch_copyout_auxargs(struct image_params *imgp, Elf_Auxinfo **pos)
AUXARGS_ENTRY((*pos), LINUX_AT_SYSINFO, __kernel_vsyscall);
AUXARGS_ENTRY((*pos), LINUX_AT_SYSINFO_EHDR, linux_vdso_base);
AUXARGS_ENTRY((*pos), LINUX_AT_HWCAP, cpu_feature);
- AUXARGS_ENTRY((*pos), LINUX_AT_HWCAP2, 0);
+ AUXARGS_ENTRY((*pos), LINUX_AT_HWCAP2, linux_x86_elf_hwcap2());
AUXARGS_ENTRY((*pos), LINUX_AT_PLATFORM, PTROUT(linux_platform));
}
diff --git a/sys/i386/linux/linux.h b/sys/i386/linux/linux.h
index 94c5e67cf3e7..58c152f4a039 100644
--- a/sys/i386/linux/linux.h
+++ b/sys/i386/linux/linux.h
@@ -94,7 +94,7 @@ typedef struct {
/*
* Miscellaneous
*/
-#define LINUX_AT_COUNT 21 /* Count of used aux entry types.
+#define LINUX_AT_COUNT 22 /* Count of used aux entry types.
* Keep this synchronized with
* linux_copyout_auxargs() code.
*/
diff --git a/sys/i386/linux/linux_sysvec.c b/sys/i386/linux/linux_sysvec.c
index ab6eaa97075d..e226151764f7 100644
--- a/sys/i386/linux/linux_sysvec.c
+++ b/sys/i386/linux/linux_sysvec.c
@@ -145,6 +145,7 @@ linux32_arch_copyout_auxargs(struct image_params *imgp, Elf_Auxinfo **pos)
AUXARGS_ENTRY((*pos), LINUX_AT_SYSINFO_EHDR, linux_vdso_base);
AUXARGS_ENTRY((*pos), LINUX_AT_SYSINFO, __kernel_vsyscall);
AUXARGS_ENTRY((*pos), LINUX_AT_HWCAP, cpu_feature);
+ AUXARGS_ENTRY((*pos), LINUX_AT_HWCAP2, linux_x86_elf_hwcap2());
AUXARGS_ENTRY((*pos), LINUX_AT_PLATFORM, PTROUT(linux_platform));
}
diff --git a/sys/x86/linux/linux_x86.c b/sys/x86/linux/linux_x86.c
index 34ae66ec4954..c72102d9f426 100644
--- a/sys/x86/linux/linux_x86.c
+++ b/sys/x86/linux/linux_x86.c
@@ -31,7 +31,9 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/signal.h>
+#include <x86/specialreg.h>
#include <x86/trap.h>
+#include <x86/x86_var.h>
#include <x86/linux/linux_x86.h>
@@ -96,4 +98,18 @@ bsd_to_linux_trapcode(int code)
return (code < nitems(_bsd_to_linux_trapcode) ?
_bsd_to_linux_trapcode[code] : LINUX_T_UNKNOWN);
-} \ No newline at end of file
+}
+
+u_int
+linux_x86_elf_hwcap2(void)
+{
+ static u_int elf_hwcap2 = 0;
+ static bool elf_hwcap2_valid = false;
+
+ if (!elf_hwcap2_valid) {
+ if ((cpu_stdext_feature & CPUID_STDEXT_FSGSBASE) != 0)
+ elf_hwcap2 |= LINUX_HWCAP2_FSGSBASE;
+ elf_hwcap2_valid = true;
+ }
+ return (elf_hwcap2);
+}
diff --git a/sys/x86/linux/linux_x86.h b/sys/x86/linux/linux_x86.h
index 2763b60f1649..5ce0852d9a18 100644
--- a/sys/x86/linux/linux_x86.h
+++ b/sys/x86/linux/linux_x86.h
@@ -32,10 +32,16 @@
#define LINUX_VDSO_CPU_RDPID 1
#define LINUX_VDSO_CPU_RDTSCP 2
+/* More machine dependent hints about processor capabilities. */
+#define LINUX_HWCAP2_RING3MWAIT 0x00000001
+#define LINUX_HWCAP2_FSGSBASE 0x00000002
+
int linux_vdso_tsc_selector_idx(void);
int linux_vdso_cpu_selector_idx(void);
int linux_translate_traps(int, int);
int bsd_to_linux_trapcode(int);
+u_int linux_x86_elf_hwcap2(void);
+
#endif /* _X86_INCLUDE_LINUX_LINUX_X86_H_ */