/* #include <machine/trap.h> */
struct savearea_t; /* Used anonymously */
-typedef kern_return_t (*perfCallback)(int, struct savearea_t *, uintptr_t *, int);
+#if defined(__x86_64__)
+typedef kern_return_t (*perfCallback)(int, struct savearea_t *, uintptr_t *, __unused int);
extern perfCallback tempDTraceTrapHook;
-extern kern_return_t fbt_perfCallback(int, struct savearea_t *, uintptr_t *);
+extern kern_return_t fbt_perfCallback(int, struct savearea_t *, uintptr_t *, __unused int);
+#else
+#error Unknown architecture
+#endif
#define FBT_ADDR2NDX(addr) ((((uintptr_t)(addr)) >> 4) & fbt_probetab_mask)
#define FBT_PROBETAB_SIZE 0x8000 /* 32k entries -- 128K total */
if (fbt->fbtp_currentval != fbt->fbtp_patchval) {
(void)ml_nofault_copy( (vm_offset_t)&fbt->fbtp_patchval, (vm_offset_t)fbt->fbtp_patchpoint,
sizeof(fbt->fbtp_patchval));
+ /*
+ * Make the patched instruction visible via a data + instruction
+ * cache flush for the platforms that need it
+ */
+ flush_dcache((vm_offset_t)fbt->fbtp_patchpoint,(vm_size_t)sizeof(fbt->fbtp_patchval), 0);
+ invalidate_icache((vm_offset_t)fbt->fbtp_patchpoint,(vm_size_t)sizeof(fbt->fbtp_patchval), 0);
fbt->fbtp_currentval = fbt->fbtp_patchval;
+
ctl->mod_nenabled++;
}
if (fbt->fbtp_currentval != fbt->fbtp_savedval) {
(void)ml_nofault_copy( (vm_offset_t)&fbt->fbtp_savedval, (vm_offset_t)fbt->fbtp_patchpoint,
sizeof(fbt->fbtp_savedval));
+ /*
+ * Make the patched instruction visible via a data + instruction
+ * cache flush for the platforms that need it
+ */
+ flush_dcache((vm_offset_t)fbt->fbtp_patchpoint,(vm_size_t)sizeof(fbt->fbtp_patchval), 0);
+ invalidate_icache((vm_offset_t)fbt->fbtp_patchpoint,(vm_size_t)sizeof(fbt->fbtp_patchval), 0);
+
fbt->fbtp_currentval = fbt->fbtp_savedval;
ASSERT(ctl->mod_nenabled > 0);
ctl->mod_nenabled--;
(void)ml_nofault_copy( (vm_offset_t)&fbt->fbtp_savedval, (vm_offset_t)fbt->fbtp_patchpoint,
sizeof(fbt->fbtp_savedval));
- fbt->fbtp_currentval = fbt->fbtp_savedval;
+
+ /*
+ * Make the patched instruction visible via a data + instruction
+ * cache flush for the platforms that need it
+ */
+ flush_dcache((vm_offset_t)fbt->fbtp_patchpoint,(vm_size_t)sizeof(fbt->fbtp_savedval), 0);
+ invalidate_icache((vm_offset_t)fbt->fbtp_patchpoint,(vm_size_t)sizeof(fbt->fbtp_savedval), 0);
+
+ fbt->fbtp_currentval = fbt->fbtp_savedval;
}
dtrace_membar_consumer();
(void)ml_nofault_copy( (vm_offset_t)&fbt->fbtp_patchval, (vm_offset_t)fbt->fbtp_patchpoint,
sizeof(fbt->fbtp_patchval));
+
+
fbt->fbtp_currentval = fbt->fbtp_patchval;
}
dtrace_membar_consumer();
}
+/*
+ * APPLE NOTE: fbt_getargdesc not implemented
+ */
#if !defined(__APPLE__)
/*ARGSUSED*/
static void
fbt_disable,
fbt_suspend,
fbt_resume,
-#if !defined(__APPLE__)
- fbt_getargdesc,
-#else
- NULL, /* FIXME: where to look for xnu? */
-#endif /* __APPLE__ */
+ NULL, /* APPLE NOTE: fbt_getargdesc not implemented */
NULL,
NULL,
fbt_destroy
dtrace_invop_add(fbt_invop);
-#if !defined(__APPLE__)
- if (ddi_create_minor_node(devi, "fbt", S_IFCHR, 0,
- DDI_PSEUDO, NULL) == DDI_FAILURE ||
- dtrace_register("fbt", &fbt_attr, DTRACE_PRIV_KERNEL, NULL,
- &fbt_pops, NULL, &fbt_id) != 0) {
- fbt_cleanup(devi);
- return (DDI_FAILURE);
- }
-#else
if (ddi_create_minor_node(devi, "fbt", S_IFCHR, 0,
DDI_PSEUDO, 0) == DDI_FAILURE ||
dtrace_register("fbt", &fbt_attr, DTRACE_PRIV_KERNEL, NULL,
fbt_cleanup(devi);
return (DDI_FAILURE);
}
-#endif /* __APPLE__ */
ddi_report_dev(devi);
fbt_devi = devi;