Page MenuHomeFreeBSD

D40284.diff
No OneTemporary

D40284.diff

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

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)

Event Timeline