#include #include #include #include #include #include "ply.h" struct kprobe { }; static inline int is_arg(const char *name) { return (strstr(name, "arg") == name) && (strlen(name) == 4) && (name[3] >= '0' && name[3] <= '9'); } int kprobe_resolve(prog_t *prog, node_t *n) { type_t *t; if (is_arg(n->ident)) t = &t_ul; else if (!strcmp(n->ident, "ctx")) t = &t_pt_regsp; else return -ENOENT; n->type = t; return sym_add(prog->locals, n->ident, t, &n->sym); } int kprobe_probe(prog_t *prog) { struct kprobe *kp; kp = calloc(1, sizeof(*kp)); assert(kp); prog->provider_data = kp; return 0; } provider_t kprobe = { .name = "kprobe", .resolve = kprobe_resolve, .probe = kprobe_probe, }; __attribute__((constructor)) static void kprobe_init(void) { provider_register(&kprobe); }