#include <linux/device.h>
#include <linux/sysdev.h>
#include <linux/bcd.h>
+#include <linux/kallsyms.h>
#include <asm/pgtable.h>
#include <asm/vsyscall.h>
#include <asm/timex.h>
}
if (lost) {
- if (report_lost_ticks)
+ if (report_lost_ticks) {
printk(KERN_WARNING "time.c: Lost %ld timer "
- "tick(s)! (rip %016lx)\n",
- (offset - vxtime.last) / hpet_tick - 1,
- regs->rip);
+ "tick(s)! ", lost);
+ print_symbol("rip %s)\n", regs->rip);
+ }
jiffies += lost;
}
return IRQ_HANDLED;
}
-/* RED-PEN: calculation is done in 32bits with multiply for performance
- and could overflow, it may be better (but slower)to use an 64bit division. */
+static unsigned int cyc2ns_scale;
+#define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */
+
+static inline void set_cyc2ns_scale(unsigned long cpu_mhz)
+{
+ cyc2ns_scale = (1000 << CYC2NS_SCALE_FACTOR)/cpu_mhz;
+}
+
+static inline unsigned long long cycles_2_ns(unsigned long long cyc)
+{
+ return (cyc * cyc2ns_scale) >> CYC2NS_SCALE_FACTOR;
+}
+
unsigned long long sched_clock(void)
{
unsigned long a = 0;
purposes. */
rdtscll(a);
- return (a * vxtime.tsc_quot) >> 32;
+ return cycles_2_ns(a);
}
unsigned long get_cmos_time(void)
vxtime.tsc_quot = (1000L << 32) / cpu_khz;
}
+ set_cyc2ns_scale(cpu_khz_ref / 1000);
+
return 0;
}
rdtscll_sync(&vxtime.last_tsc);
setup_irq(0, &irq0);
+ set_cyc2ns_scale(cpu_khz / 1000);
+
#ifdef CONFIG_CPU_FREQ
cpufreq_register_notifier(&time_cpufreq_notifier_block,
CPUFREQ_TRANSITION_NOTIFIER);