git: 4281dab8bc11 - main - linux(4): Add elf_hwcap2 to x86
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 28 Jul 2023 08:57:20 UTC
The branch main has been updated by dchagin: URL: https://cgit.FreeBSD.org/src/commit/?id=4281dab8bc11b3b2f3b58be5e0f67806329bddae commit 4281dab8bc11b3b2f3b58be5e0f67806329bddae Author: Dmitry Chagin <dchagin@FreeBSD.org> AuthorDate: 2023-07-28 08:56:59 +0000 Commit: Dmitry Chagin <dchagin@FreeBSD.org> CommitDate: 2023-07-28 08:56:59 +0000 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 --- sys/amd64/linux/linux_sysvec.c | 2 +- sys/amd64/linux32/linux32_sysvec.c | 2 +- sys/i386/linux/linux.h | 2 +- sys/i386/linux/linux_sysvec.c | 1 + sys/x86/linux/linux_x86.c | 18 +++++++++++++++++- sys/x86/linux/linux_x86.h | 6 ++++++ 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_ */