void kdb_show_sampling(void) { int i; int symid; int *hitcount, *symid_list; static int init = 0; static struct kprobe k; if (init == 0) { dbg_printf(DL_KDB, "Init sampling...\n"); sampling_init(); sampling_enable(); init++; k.addr = ktimer_handler; k.pre_handler = sampling_handler; k.post_handler = NULL; kprobe_register(&k); return; } sampling_disable(); sampling_stats(&hitcount, &symid_list); for (i = 0; i < ksym_total(); i++) { symid = symid_list[i]; if (hitcount[symid] == 0) break; dbg_printf(DL_KDB, "%5d [ %24s ]\n", hitcount[symid], ksym_id2name(symid)); } sampling_enable(); }
static int __kretprobe_pre_handler(struct kprobe *kp, uint32_t *stack, uint32_t *kp_regs) { struct kretprobe * rp = (struct kretprobe *) kp; kprobe_unregister(kp); rp->backup_addr = kp->addr; kp->addr = (void *) stack[REG_LR]; kp->pre_handler = rp->handler; kp->post_handler = __kretprobe_post_handler; kprobe_register(kp); return 0; }
int kretprobe_register(struct kretprobe *rp) { rp->kp.pre_handler = __kretprobe_pre_handler; rp->kp.post_handler = NULL; return kprobe_register((struct kprobe *) rp); }