| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- #include <assert.h>
- #include <errno.h>
- #include <stdlib.h>
- #include <string.h>
- #include <linux/ptrace.h>
- #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)
- {
- struct kprobe *kp = prog->provider_data;
- type_t *t;
- char *name;
- name = n->atom.ident;
- if (is_arg(name))
- t = &t_ul;
- else if (!strcmp(name, "ctx"))
- t = &t_pt_regs;
- else
- return -ENOENT;
- n->type = t;
- return sym_add(prog->locals, name, t);
- }
- 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);
- }
|