Index: sys/amd64/amd64/initcpu.c =================================================================== --- sys/amd64/amd64/initcpu.c +++ sys/amd64/amd64/initcpu.c @@ -42,6 +42,7 @@ #include #include +#include #include #include @@ -218,11 +219,24 @@ } /* - * The value for the TSC_AUX MSR and rdtscp/rdpid. + * The value for the TSC_AUX MSR and rdtscp/rdpid on the invoking CPU. + * + * Caller should prevent CPU migration from before the call until after + * consuming the call's return value. */ u_int cpu_auxmsr(void) { + /* + * Although disabling interrupts is, of course, not the only way to + * prevent CPU migration, since all existing callers happen to do + * this, make this the precedent for future callers until there is + * a reason to do otherwise. + */ + KASSERT((read_rflags() & PSL_I) == 0, + ("cpu_auxmsr() returns a CPU-specific value; caller " + "should prevent migration until after consuming it.")); + return (PCPU_GET(cpuid)); } Index: sys/i386/i386/initcpu.c =================================================================== --- sys/i386/i386/initcpu.c +++ sys/i386/i386/initcpu.c @@ -41,6 +41,7 @@ #include #include +#include #include #include @@ -628,11 +629,24 @@ #endif /* - * The value for the TSC_AUX MSR and rdtscp/rdpid. + * The value for the TSC_AUX MSR and rdtscp/rdpid on the invoking CPU. + * + * Caller should prevent CPU migration from before the call until after + * consuming the call's return value. */ u_int cpu_auxmsr(void) { + /* + * Although disabling interrupts is, of course, not the only way to + * prevent CPU migration, since all existing callers happen to do + * this, make this the precedent for future callers until there is + * a reason to do otherwise. + */ + KASSERT((read_eflags() & PSL_I) == 0, + ("cpu_auxmsr() returns a CPU-specific value; caller " + "should prevent migration until after consuming it.")); + return (PCPU_GET(cpuid)); }