http://bugs.winehq.org/show_bug.cgi?id=19982
--- Comment #42 from ray@pobox.co.uk 2009-09-30 17:17:07 --- (In reply to comment #39)
Okay, that helps, thanks. Ray, how is that time calculated? Are the incorrect values related to bug 19960?
This problem is nothing to do with CPU times. SIV 4.01 and later work around that bug anyway. The problem is that the threads are not being run on the CPU they set affinity to:
What the [Test APIC] page is doing is checking that the APIC of the CPU it had set affinity to is as expected. The actual code is a loop that does:
if( cib->dkc ) // CPU Switching Mode ? { if( ( cpo += 1 ) == smb->cpu + smb->log_cpus ) { cpo = smb->cpu; // cycle round all CPUs }
cpu_ssa_set( cth, cpo->ssa ); // switch to another cpu_ssa_set( cth, cpu->ssa ); // and back to my CPU } else // no, so wait a while { ULONG volatile dly;
for( dly = 0; dly < 3000; dly++ ) {} // so rate is similar }
if( cpu->apic == cpu_get_apic( smb ) ) // APIC correct ? { InterlockedIncrement( &cib->gar ); // Good APIC Rate } else { InterlockedIncrement( &cib->bac ); // Bad APIC Count }
cpu_ssa_set() is a wrapper for SetThreadAffinityMask() cpu_get_apic() reads the APIC of the curent CPU
As soon as the returned APIC is not as expected then FAIL is reported.