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
This commit is contained in:
Dmitry Chagin
2023-07-28 11:56:59 +03:00
parent 5440e7017a
commit 4281dab8bc
6 changed files with 27 additions and 4 deletions
+1 -1
View File
@@ -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));
}
+1 -1
View File
@@ -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));
}
+1 -1
View File
@@ -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.
*/
+1
View File
@@ -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));
}
+17 -1
View File
@@ -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);
}
}
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);
}
+6
View File
@@ -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_ */