version 1.30, 2011/08/08 17:00:23 |
version 1.31, 2013/06/27 00:37:34 |
Line 51 u_int tsc_get_timecount(struct timecount |
|
Line 51 u_int tsc_get_timecount(struct timecount |
|
uint64_t tsc_freq; /* exported for sysctl */ |
uint64_t tsc_freq; /* exported for sysctl */ |
static int64_t tsc_drift_max = 250; /* max cycles */ |
static int64_t tsc_drift_max = 250; /* max cycles */ |
static int64_t tsc_drift_observed; |
static int64_t tsc_drift_observed; |
|
static bool tsc_good; |
|
|
static volatile int64_t tsc_sync_val; |
static volatile int64_t tsc_sync_val; |
static volatile struct cpu_info *tsc_sync_cpu; |
static volatile struct cpu_info *tsc_sync_cpu; |
Line 76 tsc_tc_init(void) |
|
Line 77 tsc_tc_init(void) |
|
ci = curcpu(); |
ci = curcpu(); |
safe = false; |
safe = false; |
tsc_freq = ci->ci_data.cpu_cc_freq; |
tsc_freq = ci->ci_data.cpu_cc_freq; |
|
tsc_good = (cpu_feature[0] & CPUID_MSR) != 0 && rdmsr(MSR_TSC) != 0; |
|
|
if (cpu_vendor == CPUVENDOR_INTEL) { |
if (cpu_vendor == CPUVENDOR_INTEL) { |
/* |
/* |
Line 258 cpu_hascounter(void) |
|
Line 260 cpu_hascounter(void) |
|
return cpu_feature[0] & CPUID_TSC; |
return cpu_feature[0] & CPUID_TSC; |
} |
} |
|
|
|
extern int cpu_msr_tsc; |
|
|
uint64_t |
uint64_t |
cpu_counter_serializing(void) |
cpu_counter_serializing(void) |
{ |
{ |
if (cpu_feature[0] & CPUID_MSR) |
if (tsc_good) |
return rdmsr(MSR_TSC); |
return rdmsr(MSR_TSC); |
else |
else |
return cpu_counter(); |
return cpu_counter(); |