On 2011-04-13 01:49, Jung-uk Kim wrote:
Author: jkim
Date: Tue Apr 12 23:49:07 2011
New Revision: 220584
URL: http://svn.freebsd.org/changeset/base/220584

Log:
   Reduce errors in effective frequency calculation.

Modified:
   head/sys/amd64/amd64/machdep.c
   head/sys/i386/i386/machdep.c

Modified: head/sys/amd64/amd64/machdep.c
==============================================================================
--- head/sys/amd64/amd64/machdep.c      Tue Apr 12 23:04:01 2011        
(r220583)
+++ head/sys/amd64/amd64/machdep.c      Tue Apr 12 23:49:07 2011        
(r220584)
@@ -546,7 +546,7 @@ int
  cpu_est_clockrate(int cpu_id, uint64_t *rate)
  {
        uint64_t tsc1, tsc2;
-       uint64_t acnt, mcnt;
+       uint64_t acnt, mcnt, perf;
        register_t reg;

        if (pcpu_find(cpu_id) == NULL || rate == NULL)
@@ -579,7 +579,8 @@ cpu_est_clockrate(int cpu_id, uint64_t *
                acnt = rdmsr(MSR_APERF);
                tsc2 = rdtsc();
                intr_restore(reg);
-               *rate = (tsc2 - tsc1) / 1000 * acnt / mcnt * 1000000;
+               perf = 1000 * acnt / mcnt;
+               *rate = (tsc2 - tsc1) * perf;
        } else {
                tsc1 = rdtsc();
                DELAY(1000);

Hmm...  on my VMs this now leads to:

Fatal trap 18: integer divide fault while in kernel mode
cpuid = 0; apic id = 00
instruction pointer     = 0x20:0xffffffff809c908d
stack pointer           = 0x28:0xffffff80f6a14850
frame pointer           = 0x28:0xffffff80f6a14880
code segment            = base 0x0, limit 0xfffff, type 0x1b
                        = DPL 0, pres 1, long 1, def32 0, gran 1
processor eflags        = interrupt enabled, resume, IOPL = 0
current process         = 54 (sysctl)
[ thread pid 54 tid 100060 ]
Stopped at      cpu_est_clockrate+0x11d:        divq    %rdi,%eax
db> bt
Tracing pid 54 tid 100060 td 0xfffffe0002dbe8c0
cpu_est_clockrate() at cpu_est_clockrate+0x11d
cf_get_method() at cf_get_method+0x2d4
cpufreq_curr_sysctl() at cpufreq_curr_sysctl+0x6c
sysctl_root() at sysctl_root+0x19d
userland_sysctl() at userland_sysctl+0x1a4
__sysctl() at __sysctl+0x75
syscallenter() at syscallenter+0x201
syscall() at syscall+0x38
Xfast_syscall() at Xfast_syscall+0xe1
--- syscall (202, FreeBSD ELF64, __sysctl), rip = 0x8009472ac, rsp = 
0x7fffffffca38, rbp = 0x7fffffffd310 ---

But I don't really see why, yet. :)  With r220532, it worked fine.
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to