diff options
Diffstat (limited to 'sys/cddl/dev/dtrace/amd64/dtrace_subr.c')
-rw-r--r-- | sys/cddl/dev/dtrace/amd64/dtrace_subr.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/sys/cddl/dev/dtrace/amd64/dtrace_subr.c b/sys/cddl/dev/dtrace/amd64/dtrace_subr.c index f6577d5..2a26b65 100644 --- a/sys/cddl/dev/dtrace/amd64/dtrace_subr.c +++ b/sys/cddl/dev/dtrace/amd64/dtrace_subr.c @@ -246,24 +246,14 @@ static uint64_t nsec_scale; /* See below for the explanation of this macro. */ #define SCALE_SHIFT 28 +/* + * Get the frequency and scale factor as early as possible so that they can be + * used for boot-time tracing. + */ static void -dtrace_gethrtime_init_cpu(void *arg) -{ - uintptr_t cpu = (uintptr_t) arg; - - if (cpu == curcpu) - tgt_cpu_tsc = rdtsc(); - else - hst_cpu_tsc = rdtsc(); -} - -static void -dtrace_gethrtime_init(void *arg) +dtrace_gethrtime_init_early(void *arg) { - struct pcpu *pc; uint64_t tsc_f; - cpuset_t map; - int i; /* * Get TSC frequency known at this moment. @@ -279,7 +269,8 @@ dtrace_gethrtime_init(void *arg) * another 32-bit integer without overflowing 64-bit. * Thus minimum supported TSC frequency is 62.5MHz. */ - KASSERT(tsc_f > (NANOSEC >> (32 - SCALE_SHIFT)), ("TSC frequency is too low")); + KASSERT(tsc_f > (NANOSEC >> (32 - SCALE_SHIFT)), + ("TSC frequency is too low")); /* * We scale up NANOSEC/tsc_f ratio to preserve as much precision @@ -291,6 +282,27 @@ dtrace_gethrtime_init(void *arg) * (terahertz) values; */ nsec_scale = ((uint64_t)NANOSEC << SCALE_SHIFT) / tsc_f; +} +SYSINIT(dtrace_gethrtime_init_early, SI_SUB_CPU, SI_ORDER_ANY, + dtrace_gethrtime_init_early, NULL); + +static void +dtrace_gethrtime_init_cpu(void *arg) +{ + uintptr_t cpu = (uintptr_t) arg; + + if (cpu == curcpu) + tgt_cpu_tsc = rdtsc(); + else + hst_cpu_tsc = rdtsc(); +} + +static void +dtrace_gethrtime_init(void *arg) +{ + struct pcpu *pc; + cpuset_t map; + int i; /* The current CPU is the reference one. */ sched_pin(); @@ -311,8 +323,8 @@ dtrace_gethrtime_init(void *arg) } sched_unpin(); } - -SYSINIT(dtrace_gethrtime_init, SI_SUB_SMP, SI_ORDER_ANY, dtrace_gethrtime_init, NULL); +SYSINIT(dtrace_gethrtime_init, SI_SUB_SMP, SI_ORDER_ANY, dtrace_gethrtime_init, + NULL); /* * DTrace needs a high resolution time function which can |