]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/dev/dtrace/fbt.c
xnu-3789.1.32.tar.gz
[apple/xnu.git] / bsd / dev / dtrace / fbt.c
index 5a6570ed1cd7b5dc886d01d2352b49e49dcc4d06..e05d5a92275868aeb561cf08dde21d94b4f1c526 100644 (file)
 
 /* #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 */
@@ -154,7 +158,14 @@ fbt_enable(void *arg, dtrace_id_t id, void *parg)
        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++;
        }
 
@@ -182,6 +193,13 @@ fbt_disable(void *arg, dtrace_id_t id, void *parg)
            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--;
@@ -207,7 +225,15 @@ fbt_suspend(void *arg, dtrace_id_t id, void *parg)
 
            (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();
@@ -240,12 +266,17 @@ fbt_resume(void *arg, dtrace_id_t id, void *parg)
        
            (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
@@ -358,11 +389,7 @@ static dtrace_pops_t fbt_pops = {
        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
@@ -399,15 +426,6 @@ fbt_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
 
        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,
@@ -415,7 +433,6 @@ fbt_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
                fbt_cleanup(devi);
                return (DDI_FAILURE);
        }
-#endif /* __APPLE__ */
 
        ddi_report_dev(devi);
        fbt_devi = devi;