Hello, I disabled the ldtsc and ldtscp instructions for usermode on one of my production servers:
% ./spectre Reading 40 bytes: Bus error (core dumped) All PoC code I have seen today relies on those instructions. Is there any other way to measure the memory/cache access times ? On 10.4-RELEASE I had to rebuild world and some ports, but now everything seems to be working fine. Patches attached. Regards, Klaus
diff -aupr src.orig/sys/amd64/amd64/initcpu.c src/sys/amd64/amd64/initcpu.c --- src.orig/sys/amd64/amd64/initcpu.c 2017-09-29 02:20:05.000000000 +0200 +++ src/sys/amd64/amd64/initcpu.c 2018-01-04 15:19:32.741729000 +0100 @@ -210,6 +210,7 @@ initializecpu(void) } if (cpu_stdext_feature & CPUID_STDEXT_FSGSBASE) cr4 |= CR4_FSGSBASE; + cr4 |= CR4_TSD; /* * Postpone enabling the SMEP on the boot CPU until the page diff -aupr src.orig/sys/x86/x86/tsc.c src/sys/x86/x86/tsc.c --- src.orig/sys/x86/x86/tsc.c 2017-09-29 02:20:06.000000000 +0200 +++ src/sys/x86/x86/tsc.c 2018-01-04 15:19:32.756123000 +0100 @@ -658,6 +658,7 @@ tsc_freq_changed(void *arg, const struct static int sysctl_machdep_tsc_freq(SYSCTL_HANDLER_ARGS) { +#if 0 int error; uint64_t freq; @@ -671,6 +672,9 @@ sysctl_machdep_tsc_freq(SYSCTL_HANDLER_A freq >> (int)(intptr_t)tsc_timecounter.tc_priv); } return (error); +#else + return (EOPNOTSUPP); +#endif } SYSCTL_PROC(_machdep, OID_AUTO, tsc_freq, CTLTYPE_U64 | CTLFLAG_RW,
diff -aupr src.orig/lib/libc/amd64/sys/__vdso_gettc.c src/lib/libc/amd64/sys/__vdso_gettc.c --- src.orig/lib/libc/amd64/sys/__vdso_gettc.c 2017-09-29 02:20:13.000000000 +0200 +++ src/lib/libc/amd64/sys/__vdso_gettc.c 2018-01-04 16:53:31.590961000 +0100 @@ -30,17 +30,22 @@ __FBSDID("$FreeBSD: releng/10.4/lib/libc #include <sys/elf.h> #include <sys/time.h> #include <sys/vdso.h> +#include <errno.h> #include <machine/cpufunc.h> #include "libc_private.h" static u_int __vdso_gettc_low(const struct vdso_timehands *th) { +#if 0 uint32_t rv; __asm __volatile("rdtsc; shrd %%cl, %%edx, %0" : "=a" (rv) : "c" (th->th_x86_shift) : "edx"); return (rv); +#else + return (0); +#endif } #pragma weak __vdso_gettc @@ -48,7 +53,11 @@ u_int __vdso_gettc(const struct vdso_timehands *th) { +#if 0 return (th->th_x86_shift > 0 ? __vdso_gettc_low(th) : rdtsc32()); +#else + return (0); +#endif } #pragma weak __vdso_gettimekeep @@ -56,5 +65,9 @@ int __vdso_gettimekeep(struct vdso_timekeep **tk) { +#if 0 return (_elf_aux_info(AT_TIMEKEEP, tk, sizeof(*tk))); +#else + return (ENOSYS); +#endif } diff -aupr src.orig/lib/libc/i386/sys/__vdso_gettc.c src/lib/libc/i386/sys/__vdso_gettc.c --- src.orig/lib/libc/i386/sys/__vdso_gettc.c 2017-09-29 02:20:14.000000000 +0200 +++ src/lib/libc/i386/sys/__vdso_gettc.c 2018-01-04 17:03:03.096724000 +0100 @@ -30,17 +30,22 @@ __FBSDID("$FreeBSD: releng/10.4/lib/libc #include <sys/elf.h> #include <sys/time.h> #include <sys/vdso.h> +#include <errno.h> #include <machine/cpufunc.h> #include "libc_private.h" static u_int __vdso_gettc_low(const struct vdso_timehands *th) { +#if 0 uint32_t rv; __asm __volatile("rdtsc; shrd %%cl, %%edx, %0" : "=a" (rv) : "c" (th->th_x86_shift) : "edx"); return (rv); +#else + return (0); +#endif } #pragma weak __vdso_gettc @@ -48,7 +53,11 @@ u_int __vdso_gettc(const struct vdso_timehands *th) { +#if 0 return (th->th_x86_shift > 0 ? __vdso_gettc_low(th) : rdtsc32()); +#else + return (0); +#endif } #pragma weak __vdso_gettimekeep @@ -56,5 +65,9 @@ int __vdso_gettimekeep(struct vdso_timekeep **tk) { +#if 0 return (_elf_aux_info(AT_TIMEKEEP, tk, sizeof(*tk))); +#else + return (ENOSYS); +#endif }
_______________________________________________ freebsd-current@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/freebsd-current To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"