Port-i386 archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: cpu_counter_serializing() vs. QEMU
In article
<CADbF7ecS=vXJFuhZWeyx+5P2NmCj6wy4AAkJRfVL_yO-S9dLvw%mail.gmail.com@localhost>,
Masao Uebayashi <uebayasi%gmail.com@localhost> wrote:
>Intel(R) 64 and IA-32 Architectures Software Developer?s Manual
>Volume 3 (3A, 3B & 3C): System Programming Guide
>17.13 TIME-STAMP COUNTER
>
> TSC flag - A feature bit that indicates the availability of the
>time-stamp counter.
> The counter is available in an if the function CPUID.1:EDX.TSC[bit 4] = 1.
>
>On Fri, Jun 21, 2013 at 7:10 AM, Jeff Rizzo <riz%tastylime.net@localhost>
>wrote:
>> 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.
>
>I don't think so.
>
>> - 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...
>
>Me too.
I would add something in the cpu identify code to detect QEMU and clear
CPUID_MSR.
christos
Home |
Main Index |
Thread Index |
Old Index