unsigned long pf_addr;
unsigned long cp_addr;
unsigned long mr_addr;
-unsigned long exit_addr;
unsigned long unmap_addr;
kernel_probe_t *pf_probe = NULL;
-kernel_probe_t *exit_probe = NULL;
unsigned int probes_flags = 0;
int
return -EINVAL;
}
- exit_addr = swap_ksyms("do_exit");
- if (exit_addr == 0) {
- EPRINTF("Cannot find address for do_exit function!");
- return -EINVAL;
- }
-
unmap_addr = swap_ksyms("do_munmap");
if (unmap_addr == 0) {
EPRINTF("Cannot find address for do_munmap function!");
register_kernel_jprobe (kernel_probe_t * probe)
{
int result;
- if( ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) ||
- ((probe == exit_probe) && (us_proc_probes & US_PROC_EXIT_INSTLD)))
- {
+ if ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) {
return 0; // probe is already registered
}
result = dbi_register_jprobe (&probe->jprobe);
static int
unregister_kernel_jprobe (kernel_probe_t * probe)
{
- if( ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) ||
- ((probe == exit_probe) && (us_proc_probes & US_PROC_EXIT_INSTLD)) ) {
+ if ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) {
return 0; // probe is necessary for user space instrumentation
}
dbi_unregister_jprobe (&probe->jprobe);
register_kernel_retprobe (kernel_probe_t * probe)
{
int result;
- if( ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) ||
- ((probe == exit_probe) && (us_proc_probes & US_PROC_EXIT_INSTLD)) ) {
+ if ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) {
return 0; // probe is already registered
}
static int
unregister_kernel_retprobe (kernel_probe_t * probe)
{
- if( ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) ||
- ((probe == exit_probe) && (us_proc_probes & US_PROC_EXIT_INSTLD)) ) {
+ if ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) {
return 0; // probe is necessary for user space instrumentation
}
dbi_unregister_kretprobe (&probe->retprobe);
}
pprobe = &pf_probe;
}
- else if (addr == exit_addr) {
- probes_flags |= PROBE_FLAG_EXIT_INSTLD;
- if (us_proc_probes & US_PROC_EXIT_INSTLD)
- {
- return 0;
- }
- pprobe = &exit_probe;
- }
result = add_probe_to_list (addr, pprobe);
if (result) {
if (addr == pf_addr)
probes_flags &= ~PROBE_FLAG_PF_INSTLD;
- else if (addr == exit_addr)
- probes_flags &= ~PROBE_FLAG_EXIT_INSTLD;
}
return result;
}
if (p->addr == pf_addr) {
probes_flags &= ~PROBE_FLAG_PF_INSTLD;
pf_probe = NULL;
- } else if (p->addr == exit_addr) {
- probes_flags &= ~PROBE_FLAG_EXIT_INSTLD;
- exit_probe = NULL;
}
hlist_del(node);
kfree(p);
if (p->addr == pf_addr) {
probes_flags &= ~PROBE_FLAG_PF_INSTLD;
pf_probe = NULL;
- } else if (p->addr == exit_addr) {
- probes_flags &= ~PROBE_FLAG_EXIT_INSTLD;
- exit_probe = NULL;
}
hlist_del(node);
kfree(p);
}
pf_probe = NULL;
}
- else if (addr == exit_addr) {
- probes_flags &= ~PROBE_FLAG_EXIT_INSTLD;
- if (us_proc_probes & US_PROC_EXIT_INSTLD)
- {
- return 0;
- }
- exit_probe = NULL;
- }
result = remove_probe_from_list (addr);
skip = 1;
#endif /* CONFIG_X86 */
}
- else if (exit_probe == probe)
- {
- if (us_proc_probes & US_PROC_EXIT_INSTLD)
- do_exit_probe_pre_code();
- if (!(probes_flags & PROBE_FLAG_EXIT_INSTLD))
- skip = 1;
- }
if (!skip)
pack_event_info (KS_PROBE_ID, RECORD_ENTRY, "pxxxxxx", probe->addr, arg1, arg2, arg3, arg4, arg5, arg6);
if (!(probes_flags & PROBE_FLAG_PF_INSTLD))
skip = 1;
}
- else if (exit_probe == probe)
- {
- if (!(probes_flags & PROBE_FLAG_EXIT_INSTLD))
- skip = 1;
- }
if (!skip) {
ret_val = regs_return_value(regs);
extern unsigned long pf_addr;
extern unsigned long cp_addr;
extern unsigned long mr_addr;
-extern unsigned long exit_addr;
extern unsigned long unmap_addr;
extern kernel_probe_t *pf_probe;
-extern kernel_probe_t *exit_probe;
extern unsigned int probes_flags;
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38)
extern spinlock_t ec_probe_spinlock;
#endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
enum {
- PROBE_FLAG_PF_INSTLD = (1 << 0),
- PROBE_FLAG_EXIT_INSTLD = (1 << 3)
+ PROBE_FLAG_PF_INSTLD = (1 << 0)
};
#endif // !defined(__PROBES_MANAGER_H__)
/* uninstall jprobe with 'mm_release' */
dbi_unregister_jprobe(&mr_jprobe);
- iRet = uninstall_kernel_probe (exit_addr, US_PROC_EXIT_INSTLD,
- 0, &exit_probe);
- if (iRet)
- EPRINTF ("uninstall_kernel_probe(do_exit) result=%d!", iRet);
-
/* uninstall jprobe with 'do_munmap' */
dbi_unregister_jprobe(&unmap_jprobe);
EPRINTF ("install_kernel_probe(do_page_fault) result=%d!", ret);
return ret;
}
- // enable 'do_exit' probe to detect for remove task_struct
- ret = install_kernel_probe (exit_addr, US_PROC_EXIT_INSTLD, 0, &exit_probe);
- if (ret != 0)
- {
- EPRINTF ("install_kernel_probe(do_exit) result=%d!", ret);
- return ret;
- }
+
/* install kretprobe on 'copy_process' */
cp_kretprobe.kp.addr = cp_addr;
ret = dbi_register_kretprobe(&cp_kretprobe);
EXPORT_SYMBOL_GPL(do_page_fault_ret_pre_code);
-
-void do_exit_probe_pre_code (void)
-{
- // TODO: remove task
-}
-EXPORT_SYMBOL_GPL(do_exit_probe_pre_code);
-
void print_vma(struct mm_struct *mm)
{
struct vm_area_struct *vma;