Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F139283024
D39229.id119321.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D39229.id119321.diff
View Options
diff --git a/sys/cddl/dev/kinst/amd64/kinst_isa.c b/sys/cddl/dev/kinst/amd64/kinst_isa.c
--- a/sys/cddl/dev/kinst/amd64/kinst_isa.c
+++ b/sys/cddl/dev/kinst/amd64/kinst_isa.c
@@ -535,7 +535,10 @@
pd = opaque;
func = symval->name;
- if (strcmp(func, pd->kpd_func) != 0 || strcmp(func, "trap_check") == 0)
+
+ if (kinst_excluded(func))
+ return (0);
+ if (strcmp(func, pd->kpd_func) != 0)
return (0);
instr = (uint8_t *)symval->value;
diff --git a/sys/cddl/dev/kinst/kinst.h b/sys/cddl/dev/kinst/kinst.h
--- a/sys/cddl/dev/kinst/kinst.h
+++ b/sys/cddl/dev/kinst/kinst.h
@@ -46,6 +46,7 @@
struct linker_file;
struct linker_symval;
+int kinst_excluded(const char *);
int kinst_invop(uintptr_t, struct trapframe *, uintptr_t);
int kinst_make_probe(struct linker_file *, int, struct linker_symval *,
void *);
diff --git a/sys/cddl/dev/kinst/kinst.c b/sys/cddl/dev/kinst/kinst.c
--- a/sys/cddl/dev/kinst/kinst.c
+++ b/sys/cddl/dev/kinst/kinst.c
@@ -65,6 +65,64 @@
struct kinst_probe_list *kinst_probetab;
static struct cdev *kinst_cdev;
+int
+kinst_excluded(const char *name)
+{
+ if (strncmp(name, "dtrace_", strlen("dtrace_")) == 0 &&
+ strncmp(name, "dtrace_safe_", strlen("dtrace_safe_")) != 0) {
+ /*
+ * Anything beginning with "dtrace_" may be called
+ * from probe context unless it explicitly indicates
+ * that it won't be called from probe context by
+ * using the prefix "dtrace_safe_".
+ */
+ return (1);
+ }
+
+ /*
+ * Omit instrumentation of functions that are probably in DDB. It
+ * makes it too hard to debug broken kinst.
+ *
+ * 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_", strlen("db_")) == 0 ||
+ strncmp(name, "kdb_", strlen("kdb_")) == 0)
+ return (1);
+
+ /*
+ * Lock owner methods may be called from probe context.
+ */
+ if (strcmp(name, "owner_mtx") == 0 ||
+ strcmp(name, "owner_rm") == 0 ||
+ strcmp(name, "owner_rw") == 0 ||
+ strcmp(name, "owner_sx") == 0)
+ return (1);
+
+ /*
+ * Stack unwinders may be called from probe context on some
+ * platforms.
+ */
+#if defined(__aarch64__) || defined(__riscv)
+ if (strcmp(name, "unwind_frame") == 0)
+ return (1);
+#endif
+
+ /*
+ * When DTrace is built into the kernel we need to exclude the kinst
+ * functions from instrumentation.
+ */
+#ifndef _KLD_MODULE
+ if (strncmp(name, "kinst_", strlen("kinst_")) == 0)
+ return (1);
+#endif
+
+ if (strcmp(name, "trap_check") == 0)
+ return (1);
+
+ return (0);
+}
+
void
kinst_probe_create(struct kinst_probe *kp, linker_file_t lf)
{
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Dec 11, 10:31 AM (2 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26858676
Default Alt Text
D39229.id119321.diff (2 KB)
Attached To
Mode
D39229: kinst: add kinst_excluded()
Attached
Detach File
Event Timeline
Log In to Comment