return;
}
- if (!sdt_provide_module_arch(arg, mp))
- return;
-
for (idx = 0, sdpd = mp->sdt_probes; idx < mp->sdt_probec;
idx++, sdpd++) {
char *name = sdpd->sdpd_name, *nname;
int _sdt_enable(void *arg, dtrace_id_t id, void *parg)
{
sdt_probe_t *sdp = parg;
+ sdt_probe_t *curr;
/*
* Ensure that we have a reference to the module.
* reference we took above, because we only need one to prevent the
* module from being unloaded.
*/
- PDATA(sdp->sdp_module)->sdt_enabled++;
- if (PDATA(sdp->sdp_module)->sdt_enabled > 1)
+ PDATA(sdp->sdp_module)->enabled_cnt++;
+ if (PDATA(sdp->sdp_module)->enabled_cnt > 1)
module_put(sdp->sdp_module);
- while (sdp != NULL) {
- sdt_enable_arch(sdp, id, arg);
- sdp = sdp->sdp_next;
- }
+ for (curr = sdp; curr != NULL; curr = curr->sdp_next)
+ sdt_enable_arch(curr, id, arg);
return 0;
}
void _sdt_disable(void *arg, dtrace_id_t id, void *parg)
{
sdt_probe_t *sdp = parg;
+ sdt_probe_t *curr;
+
+ for (curr = sdp; curr != NULL; curr = curr->sdp_next)
+ sdt_disable_arch(curr, id, arg);
/*
* If we are disabling a probe, we know it was enabled, and therefore
* being unloaded. If we disable the last probe on the module, we can
* drop the reference.
*/
- PDATA(sdp->sdp_module)->sdt_enabled--;
- if (PDATA(sdp->sdp_module)->sdt_enabled == 0)
+ PDATA(sdp->sdp_module)->enabled_cnt--;
+ if (PDATA(sdp->sdp_module)->enabled_cnt == 0)
module_put(sdp->sdp_module);
-
- while (sdp != NULL) {
- sdt_disable_arch(sdp, id, arg);
- sdp = sdp->sdp_next;
- }
}
void sdt_getargdesc(void *arg, dtrace_id_t id, void *parg,
* mov %i1, %o2
* mov %i2, %o3
* mov %i3, %o4
- * call <diff > 0xfff>
+ * call dtrace_probe
* mov %i4, %o5
* ret
* restore
* mov %i1, %o2
* mov %i2, %o3
* mov %i3, %o4
- * call <diff <= 0xfff>
+ * call dtrace_probe
* mov %i4, %o5
* ret
* restore
* For is-enabled probes, we just drop an "or %g0, 1, %o0"
* directly into the delay slot.
*/
-#if SDT_TRAMP_SIZE < 11
-# error SDT_TRAMP_SIZE is less than the required 11 instructions.
+#ifndef SDT_TRAMP_SIZE
+# error The kernel must define SDT_TRAMP_SIZE!
+#elif SDT_TRAMP_SIZE < 11
+# error SDT_TRAMP_SIZE must be at least 11 instructions!
#endif
#define SA(x) ((long)ALIGN((x), 4))
int sdt_dev_init_arch(void)
{
- /*
- * Sanity check to ensure that the memory allocated by the kernel is
- * sufficient for what PDATA needs.
- */
- ASSERT(sizeof(dtrace_module_t) < DTRACE_PDATA_SIZE);
-
return 0;
}
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/vmalloc.h>
+#include <asm/dtrace_util.h>
#include "dtrace.h"
#include "dtrace_dev.h"
this_cpu_core->cpu_dtrace_regs = NULL;
}
- return ASM_CALL_SIZE;
+ return DTRACE_INVOP_NOPS;
}
}
sdp->sdp_savedval = *sdp->sdp_patchpoint;
}
-int sdt_provide_module_arch(void *arg, struct module *mp)
-{
- return 1;
-}
-
void sdt_enable_arch(sdt_probe_t *sdp, dtrace_id_t id, void *arg)
{
dtrace_invop_enable((uint8_t *)sdp->sdp_patchpoint);
int sdt_dev_init_arch(void)
{
- /*
- * Sanity check to ensure that the memory allocated by the kernel is
- * sufficient for what PDATA needs.
- */
- ASSERT(sizeof(dtrace_module_t) < DTRACE_PDATA_SIZE);
-
return dtrace_invop_add(sdt_invop);
}