Page MenuHomeFreeBSD

D27766.id82018.diff
No OneTemporary

D27766.id82018.diff

Index: sys/cddl/dev/dtrace/aarch64/dtrace_subr.c
===================================================================
--- sys/cddl/dev/dtrace/aarch64/dtrace_subr.c
+++ sys/cddl/dev/dtrace/aarch64/dtrace_subr.c
@@ -49,6 +49,7 @@
extern dtrace_id_t dtrace_probeid_error;
extern int (*dtrace_invop_jump_addr)(struct trapframe *);
extern void dtrace_getnanotime(struct timespec *tsp);
+extern void dtrace_getnanouptime(struct timespec *tsp);
int dtrace_invop(uintptr_t, struct trapframe *, uintptr_t);
void dtrace_invop_init(void);
@@ -163,7 +164,7 @@
{
struct timespec curtime;
- nanouptime(&curtime);
+ dtrace_getnanouptime(&curtime);
return (curtime.tv_sec * 1000000000UL + curtime.tv_nsec);
Index: sys/cddl/dev/dtrace/arm/dtrace_subr.c
===================================================================
--- sys/cddl/dev/dtrace/arm/dtrace_subr.c
+++ sys/cddl/dev/dtrace/arm/dtrace_subr.c
@@ -54,6 +54,7 @@
extern dtrace_id_t dtrace_probeid_error;
extern int (*dtrace_invop_jump_addr)(struct trapframe *);
extern void dtrace_getnanotime(struct timespec *tsp);
+extern void dtrace_getnanouptime(struct timespec *tsp);
int dtrace_invop(uintptr_t, struct trapframe *, uintptr_t);
void dtrace_invop_init(void);
@@ -174,7 +175,7 @@
{
struct timespec curtime;
- nanouptime(&curtime);
+ dtrace_getnanouptime(&curtime);
return (curtime.tv_sec * 1000000000UL + curtime.tv_nsec);
Index: sys/cddl/dev/dtrace/riscv/dtrace_subr.c
===================================================================
--- sys/cddl/dev/dtrace/riscv/dtrace_subr.c
+++ sys/cddl/dev/dtrace/riscv/dtrace_subr.c
@@ -52,6 +52,7 @@
extern dtrace_id_t dtrace_probeid_error;
extern int (*dtrace_invop_jump_addr)(struct trapframe *);
extern void dtrace_getnanotime(struct timespec *tsp);
+extern void dtrace_getnanouptime(struct timespec *tsp);
int dtrace_invop(uintptr_t, struct trapframe *);
void dtrace_invop_init(void);
@@ -165,7 +166,7 @@
{
struct timespec curtime;
- nanouptime(&curtime);
+ dtrace_getnanouptime(&curtime);
return (curtime.tv_sec * 1000000000UL + curtime.tv_nsec);
Index: sys/cddl/dev/fbt/fbt.c
===================================================================
--- sys/cddl/dev/fbt/fbt.c
+++ sys/cddl/dev/fbt/fbt.c
@@ -127,6 +127,17 @@
return (1);
}
+ /*
+ * Omit instrumentation of functions that are probably in DDB. It
+ * makes it too hard to debug broken FBT.
+ *
+ * NB: kdb_enter() can be excluded, but its call to printf() can't be.
+ * This is generally OK since we're not yet in debugging context.
+ */
+ if (strncmp(name, "db_", 3) == 0 ||
+ strncmp(name, "kdb_", 4) == 0)
+ return (1);
+
/*
* Lock owner methods may be called from probe context.
*/
@@ -136,6 +147,15 @@
strcmp(name, "owner_sx") == 0)
return (1);
+ /*
+ * The compiler will sometimes replace memcpy()-like code with calls
+ * to memcpy() (or similar), which can occur in the DTrace code
+ * itself. For now, rather than prevent that in the build, just don't
+ * instrument at run time.
+ */
+ if (strcmp(name, "memcpy") == 0)
+ return (1);
+
/*
* Stack unwinders may be called from probe context on some
* platforms.
@@ -145,6 +165,24 @@
return (1);
#endif
+#if defined(__aarch64__)
+ /*
+ * Instrumenting certain exception handling functions can lead to FBT
+ * recursion, so exclude from instrumentation.
+ */
+ if (strcmp(name, "handle_el1h_sync") == 0 ||
+ strcmp(name, "do_el1h_sync") == 0)
+ return (1);
+
+ /*
+ * Some assembly language function implementations lack proper
+ * prologues and epilogues, which can confuse the current FBT
+ * implementation (which would ideally detect this directly).
+ */
+ if (strcmp(name, "memcpy") == 0 || strcmp(name, "bcopy") == 0)
+ return (1);
+#endif
+
/*
* When DTrace is built into the kernel we need to exclude
* the FBT functions from instrumentation.
Index: sys/kern/kern_tc.c
===================================================================
--- sys/kern/kern_tc.c
+++ sys/kern/kern_tc.c
@@ -146,6 +146,7 @@
static void cpu_tick_calibrate(int);
void dtrace_getnanotime(struct timespec *tsp);
+void dtrace_getnanouptime(struct timespec *tsp);
static int
sysctl_kern_boottime(SYSCTL_HANDLER_ARGS)
@@ -997,6 +998,20 @@
GETTHMEMBER(tsp, th_nanotime);
}
+/*
+ * This is a clone of getnanouptime used for time since boot.
+ * The dtrace_ prefix prevents fbt from creating probes for
+ * it so an uptime that can be safely used in all fbt probes.
+ */
+void
+dtrace_getnanouptime(struct timespec *tsp)
+{
+ struct bintime bt;
+
+ GETTHMEMBER(&bt, th_offset);
+ bintime2timespec(&bt, tsp);
+}
+
/*
* System clock currently providing time to the system. Modifiable via sysctl
* when the FFCLOCK option is defined.

File Metadata

Mime Type
text/plain
Expires
Sat, Apr 25, 8:55 PM (10 h, 12 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32142182
Default Alt Text
D27766.id82018.diff (4 KB)

Event Timeline