svn commit: r238537 - in head/sys: cddl/dev/dtrace/amd64
cddl/dev/dtrace/i386 kern
George V. Neville-Neil
gnn at FreeBSD.org
Mon Jul 16 20:17:20 UTC 2012
Author: gnn
Date: Mon Jul 16 20:17:19 2012
New Revision: 238537
URL: http://svn.freebsd.org/changeset/base/238537
Log:
Add support for walltimestamp in DTrace.
Submitted by: Fabian Keil
MFC after: 2 weeks
Modified:
head/sys/cddl/dev/dtrace/amd64/dtrace_subr.c
head/sys/cddl/dev/dtrace/i386/dtrace_subr.c
head/sys/kern/kern_tc.c
Modified: head/sys/cddl/dev/dtrace/amd64/dtrace_subr.c
==============================================================================
--- head/sys/cddl/dev/dtrace/amd64/dtrace_subr.c Mon Jul 16 18:13:43 2012 (r238536)
+++ head/sys/cddl/dev/dtrace/amd64/dtrace_subr.c Mon Jul 16 20:17:19 2012 (r238537)
@@ -47,6 +47,8 @@
extern uintptr_t dtrace_in_probe_addr;
extern int dtrace_in_probe;
+extern void dtrace_getnanotime(struct timespec *tsp);
+
int dtrace_invop(uintptr_t, uintptr_t *, uintptr_t);
typedef struct dtrace_invop_hdlr {
@@ -461,8 +463,11 @@ dtrace_gethrtime()
uint64_t
dtrace_gethrestime(void)
{
- printf("%s(%d): XXX\n",__func__,__LINE__);
- return (0);
+ struct timespec current_time;
+
+ dtrace_getnanotime(¤t_time);
+
+ return (current_time.tv_sec * 1000000000UL + current_time.tv_nsec);
}
/* Function to handle DTrace traps during probes. See amd64/amd64/trap.c */
Modified: head/sys/cddl/dev/dtrace/i386/dtrace_subr.c
==============================================================================
--- head/sys/cddl/dev/dtrace/i386/dtrace_subr.c Mon Jul 16 18:13:43 2012 (r238536)
+++ head/sys/cddl/dev/dtrace/i386/dtrace_subr.c Mon Jul 16 20:17:19 2012 (r238537)
@@ -49,6 +49,8 @@ extern uintptr_t kernelbase;
extern uintptr_t dtrace_in_probe_addr;
extern int dtrace_in_probe;
+extern void dtrace_getnanotime(struct timespec *tsp);
+
int dtrace_invop(uintptr_t, uintptr_t *, uintptr_t);
typedef struct dtrace_invop_hdlr {
@@ -462,8 +464,11 @@ dtrace_gethrtime()
uint64_t
dtrace_gethrestime(void)
{
- printf("%s(%d): XXX\n",__func__,__LINE__);
- return (0);
+ struct timespec current_time;
+
+ dtrace_getnanotime(¤t_time);
+
+ return (current_time.tv_sec * 1000000000UL + current_time.tv_nsec);
}
/* Function to handle DTrace traps during probes. See i386/i386/trap.c */
Modified: head/sys/kern/kern_tc.c
==============================================================================
--- head/sys/kern/kern_tc.c Mon Jul 16 18:13:43 2012 (r238536)
+++ head/sys/kern/kern_tc.c Mon Jul 16 20:17:19 2012 (r238537)
@@ -122,6 +122,8 @@ SYSCTL_INT(_kern_timecounter, OID_AUTO,
static void tc_windup(void);
static void cpu_tick_calibrate(int);
+void dtrace_getnanotime(struct timespec *tsp);
+
static int
sysctl_kern_boottime(SYSCTL_HANDLER_ARGS)
{
@@ -960,6 +962,24 @@ getmicrotime(struct timeval *tvp)
#endif /* FFCLOCK */
/*
+ * This is a clone of getnanotime and used for walltimestamps.
+ * The dtrace_ prefix prevents fbt from creating probes for
+ * it so walltimestamp can be safely used in all fbt probes.
+ */
+void
+dtrace_getnanotime(struct timespec *tsp)
+{
+ struct timehands *th;
+ u_int gen;
+
+ do {
+ th = timehands;
+ gen = th->th_generation;
+ *tsp = th->th_nanotime;
+ } while (gen == 0 || gen != th->th_generation);
+}
+
+/*
* System clock currently providing time to the system. Modifiable via sysctl
* when the FFCLOCK option is defined.
*/
More information about the svn-src-all
mailing list