Reimplement the arm64 dtrace_gethrtime(), which provides the
high-resolution nanosecond timestamp used for the DTrace 'timestamp' built-in variable. The new implementation uses the EL0 cycle counter and frequency registers in ARMv8-A. This replaces a previous implementation that relied on an instrumentation-safe implementation of getnanotime(), which provided only timer resolution. MFC after: 3 days Reviewed by: andrew, bsdimp (older version) Useful comments appreciated: jrtc27, emaste
This commit is contained in:
parent
50b7c1f530
commit
c3feaeaa32
@ -153,23 +153,26 @@ dtrace_sync(void)
|
||||
}
|
||||
|
||||
/*
|
||||
* DTrace needs a high resolution time function which can
|
||||
* be called from a probe context and guaranteed not to have
|
||||
* instrumented with probes itself.
|
||||
* DTrace needs a high resolution time function which can be called from a
|
||||
* probe context and guaranteed not to have instrumented with probes itself.
|
||||
*
|
||||
* Returns nanoseconds since boot.
|
||||
* Returns nanoseconds since some arbitrary point in time (likely SoC reset?).
|
||||
*/
|
||||
uint64_t
|
||||
dtrace_gethrtime()
|
||||
dtrace_gethrtime(void)
|
||||
{
|
||||
struct timespec curtime;
|
||||
|
||||
dtrace_getnanouptime(&curtime);
|
||||
|
||||
return (curtime.tv_sec * 1000000000UL + curtime.tv_nsec);
|
||||
uint64_t count, freq;
|
||||
|
||||
count = READ_SPECIALREG(cntvct_el0);
|
||||
freq = READ_SPECIALREG(cntfrq_el0);
|
||||
return ((1000000000UL * count) / freq);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return a much lower resolution wallclock time based on the system clock
|
||||
* updated by the timer. If needed, we could add a version interpolated from
|
||||
* the system clock as is the case with dtrace_gethrtime().
|
||||
*/
|
||||
uint64_t
|
||||
dtrace_gethrestime(void)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user