Skip site navigation (1)Skip section navigation (2)
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>