#include "u.h"
#include "../port/lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "probe.h"
void
probeinstall(Probe *p)
{
u32int *fp;
p->enabled = 1;
fp = (u32int*)p->func;
fp[0] = p->probe[0];
fp[1] = p->probe[1];
}
void
probeuninstall(Probe *p)
{
u32int *fp;
p->enabled = 0;
fp = (u32int*)p->func;
fp[0] = p->orig[0];
fp[1] = p->orig[1];
}
Probe *
mkprobe(void *func, void (*pentry)(Probe *), void (*pexit)(Probe *))
{
Probe *p;
u32int *fp;
u32int rjmp;
fp = (u32int*)func;
p = mallocz(sizeof p[0], 1);
p->entry = pentry;
p->exit = pexit;
p->func = func;
p->orig[0] = fp[0];
p->orig[1] = fp[1];
/* 5 is the call instruction size */
rjmp = (ulong)p->entrycode - (ulong)func - 5;
p->probe[0] = 0xe8 | (rjmp << 8);
p->probe[1] = (rjmp >> 24);
memmove(p->entrycode, pentrytmpl, sizeof p->entrycode);
memmove(p->exitcode, pexittmpl, sizeof p->exitcode);
return p;
}
void
freeprobe(Probe *p)
{
free(p);
}
|