Date: Fri, 11 Aug 2023 10:09:02 GMT From: Dmitry Chagin <dchagin@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: 97cbac33c6d2 - stable/13 - linux(4): Add elf_hwcap2 to x86 Message-ID: <202308111009.37BA92oG093814@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by dchagin: URL: https://cgit.FreeBSD.org/src/commit/?id=97cbac33c6d223617b0084a64bd55b0e3b8ec549 commit 97cbac33c6d223617b0084a64bd55b0e3b8ec549 Author: Dmitry Chagin <dchagin@FreeBSD.org> AuthorDate: 2023-07-28 08:56:59 +0000 Commit: Dmitry Chagin <dchagin@FreeBSD.org> CommitDate: 2023-08-11 10:08:31 +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 (cherry picked from commit 4281dab8bc11b3b2f3b58be5e0f67806329bddae) --- 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 290e21247b0d..dde7ae571524 100644 --- a/sys/amd64/linux/linux_sysvec.c +++ b/sys/amd64/linux/linux_sysvec.c @@ -232,7 +232,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 2a7860cc3381..da5f585a2696 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 4784be5b0f77..dff4ed449943 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 c486fe1a09a5..09f11340b414 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_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202308111009.37BA92oG093814>