int fbt_probetab_mask;
static void *fbt_provide_probe(struct module *mp, char *func, int type, int
- stype, asm_instr_t *addr, void *pfbt)
+ stype, asm_instr_t *addr, uintptr_t off,
+ void *pfbt)
{
fbt_probe_t *fbp;
fbt_probe_t *prev;
fbp->fbp_module = mp;
fbp->fbp_loadcnt = 1; /* FIXME */
fbp->fbp_primary = 1; /* FIXME */
+ fbp->fbp_roffset = off;
fbp->fbp_patchpoint = addr;
fbt_provide_probe_arch(fbp, type, stype);
fbp->fbp_hashnext = fbt_probetab[FBT_ADDR2NDX(addr)];
fbp->fbp_module = mp;
fbp->fbp_loadcnt = 1; /* FIXME */
fbp->fbp_primary = 1; /* FIXME */
+ fbp->fbp_roffset = off;
fbp->fbp_patchpoint = addr;
fbt_provide_probe_arch(fbp, type, stype);
fbp->fbp_hashnext = fbt_probetab[FBT_ADDR2NDX(addr)];
for (; fbp != NULL; fbp = fbp->fbp_hashnext) {
if ((uintptr_t)fbp->fbp_patchpoint == regs->ip) {
this_cpu_core->cpu_dtrace_regs = regs;
-
- dtrace_probe(fbp->fbp_id, regs->di, regs->si,
- regs->dx, regs->cx, regs->r8);
+ if (fbp->fbp_roffset == 0) {
+ dtrace_probe(fbp->fbp_id, regs->di, regs->si,
+ regs->dx, regs->cx, regs->r8);
+ } else {
+ dtrace_probe(fbp->fbp_id, fbp->fbp_roffset,
+ regs->ax, 0, 0, 0);
+ }
this_cpu_core->cpu_dtrace_regs = NULL;
{
fbp->fbp_patchval = FBT_PATCHVAL;
fbp->fbp_savedval = *fbp->fbp_patchpoint;
- fbp->fbp_rval = type == FBT_ENTRY ? DTRACE_INVOP_MOV_RSP_RBP
+ fbp->fbp_rval = type == FBT_ENTRY ? DTRACE_INVOP_PUSH_BP
: DTRACE_INVOP_RET;
}