Port-i386 archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

cpu_counter_serializing() vs. QEMU



This all came about because I discovered that "modload dtrace" while running under QEMU (amd64, but I bet the same thing happens under i386) panics the kernel, because tsc_freq is 0. Hm.

Digging a little deeper, in sys/arch/x86/x86/tsc.c:

uint64_t
cpu_counter_serializing(void)
{
        if (cpu_feature[0] & CPUID_MSR)
                return rdmsr(MSR_TSC);
        else
                return cpu_counter();
}


Under QEMU, rdmsr(MSR_TSC) always returns 0, because that MSR isn't implemented (apparently). If I hardcode cpu_counter_serializing() to always return cpu_counter(), things work just fine.

A couple things:

- is testing (cpu_feature[0] & CPUID_MSR) the right test? Only some MSRs are implemented.

- if that test is correct, what's the right way/best place to check if rdmsr(MSR_TSC) returns 0, and hence use cpu_counter() instead?

I'd be surprised if dtrace is the only thing suffering because of this...

+j



Home | Main Index | Thread Index | Old Index