Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F109937645
D40284.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
D40284.diff
View Options
diff --git a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/amd64/kinst/tst.basic.ksh b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/amd64/kinst/tst.basic.ksh
--- a/cddl/contrib/opensolaris/cmd/dtrace/test/tst/amd64/kinst/tst.basic.ksh
+++ b/cddl/contrib/opensolaris/cmd/dtrace/test/tst/amd64/kinst/tst.basic.ksh
@@ -21,6 +21,7 @@
kinst::amd64_syscall: {}
kinst::exit1: {}
kinst::spinlock_enter: {}
+kinst::memcpy: {}
tick-10s {exit(0);}
__EOF__
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
@@ -107,10 +107,10 @@
ilen = kp->kp_md.tinstlen;
- memcpy(tramp, kp->kp_md.template, ilen);
+ kinst_memcpy(tramp, kp->kp_md.template, ilen);
if ((kp->kp_md.flags & KINST_F_RIPREL) != 0) {
disp = kinst_riprel_disp(kp, tramp);
- memcpy(&tramp[kp->kp_md.dispoff], &disp, sizeof(uint32_t));
+ kinst_memcpy(&tramp[kp->kp_md.dispoff], &disp, sizeof(uint32_t));
}
/*
@@ -126,7 +126,7 @@
tramp[ilen + 4] = 0x00;
tramp[ilen + 5] = 0x00;
instr = kp->kp_patchpoint + kp->kp_md.instlen;
- memcpy(&tramp[ilen + 6], &instr, sizeof(uintptr_t));
+ kinst_memcpy(&tramp[ilen + 6], &instr, sizeof(uintptr_t));
}
int
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;
+volatile void *kinst_memcpy(volatile void *, volatile const void *, size_t);
int kinst_excluded(const char *);
int kinst_md_excluded(const char *);
int kinst_invop(uintptr_t, struct trapframe *, uintptr_t);
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,27 @@
struct kinst_probe_list *kinst_probetab;
static struct cdev *kinst_cdev;
+/*
+ * Tracing memcpy() will crash the kernel when kinst tries to trace an instance
+ * of the memcpy() calls in kinst_invop(). To fix this, we can use
+ * kinst_memcpy() in those cases, with its arguments marked as 'volatile' to
+ * "outsmart" the compiler and avoid having it replaced by a regular memcpy().
+ */
+volatile void *
+kinst_memcpy(volatile void *dst, volatile const void *src, size_t len)
+{
+ volatile const unsigned char *src0;
+ volatile unsigned char *dst0;
+
+ src0 = src;
+ dst0 = dst;
+
+ while (len--)
+ *dst0++ = *src0++;
+
+ return (dst);
+}
+
int
kinst_excluded(const char *name)
{
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Feb 12, 11:50 AM (19 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16610154
Default Alt Text
D40284.diff (2 KB)
Attached To
Mode
D40284: kinst: fix memcpy() tracing crash
Attached
Detach File
Event Timeline
Log In to Comment