{
__get_cpu_var(gpCurIp) = ip;
__get_cpu_var(gpUserRegs) = regs;
+
return 0;
}
EXPORT_SYMBOL_GPL(ujprobe_event_pre_handler);
addr = ip->offset & 0x01 ? addr | 0x01 : addr;
#endif
- pack_event_info(US_PROBE_ID, RECORD_ENTRY, "ppppppp", addr, arg0, arg1,
+ pack_event_info(US_PROBE_ID, RECORD_ENTRY, "pspppppp", addr, ip->jprobe.args, arg0, arg1,
arg2, arg3, arg4, arg5);
swap_ujprobe_return();
}
// handler whichw willb bec called before 'entry'
uprobe_pre_entry_handler_t pre_entry;
void *priv_arg;
+ char *args;
};
struct uretprobe_instance;
return NULL;
}
-int img_file_add_ip(struct img_file *file, unsigned long addr)
+int img_file_add_ip(struct img_file *file, unsigned long addr,
+ const char *args)
{
struct img_ip *ip;
if (ip)
return -EINVAL;
- ip = create_img_ip(addr);
+ ip = create_img_ip(addr, args);
img_add_ip_by_list(file, ip);
return 0;
struct img_file *create_img_file(struct dentry *dentry);
void free_img_file(struct img_file *ip);
-int img_file_add_ip(struct img_file *file, unsigned long addr);
+int img_file_add_ip(struct img_file *file, unsigned long addr,
+ const char *args);
int img_file_del_ip(struct img_file *file, unsigned long addr);
int img_file_empty(struct img_file *file);
#include "img_ip.h"
#include <linux/slab.h>
-struct img_ip *create_img_ip(unsigned long addr)
+struct img_ip *create_img_ip(unsigned long addr, const char *args)
{
struct img_ip *ip;
+ size_t len;
ip = kmalloc(sizeof(*ip), GFP_KERNEL);
INIT_LIST_HEAD(&ip->list);
ip->addr = addr;
+ /* copy args */
+ len = strlen(args) + 1;
+ ip->args = kmalloc(len, GFP_KERNEL);
+ memcpy(ip->args, args, len);
+
return ip;
}
void free_img_ip(struct img_ip *ip)
{
+ kfree(ip->args);
kfree(ip);
}
/* debug */
void img_ip_print(struct img_ip *ip)
{
- printk("### addr=%x\n", ip->addr);
+ printk("### addr=8%x, args=%s\n", ip->addr, ip->args);
}
/* debug */
struct img_ip {
struct list_head list; /* for img_file */
unsigned long addr;
+ char *args;
};
-struct img_ip *create_img_ip(unsigned long addr);
+struct img_ip *create_img_ip(unsigned long addr, const char *args);
void free_img_ip(struct img_ip *ip);
/* debug */
return NULL;
}
-int img_proc_add_ip(struct img_proc *proc, struct dentry *dentry, unsigned long addr)
+int img_proc_add_ip(struct img_proc *proc, struct dentry *dentry,
+ unsigned long addr, const char *args)
{
int ret;
struct img_file *file;
file = find_img_file(proc, dentry);
if (file)
- return img_file_add_ip(file, addr);
+ return img_file_add_ip(file, addr, args);
file = create_img_file(dentry);
- ret = img_file_add_ip(file, addr);
+ ret = img_file_add_ip(file, addr, args);
if (ret)
free_img_file(file);
else
struct img_proc *create_img_proc(void);
void free_img_proc(struct img_proc *proc);
-int img_proc_add_ip(struct img_proc *proc, struct dentry *dentry, unsigned long addr);
+int img_proc_add_ip(struct img_proc *proc, struct dentry *dentry,
+ unsigned long addr, const char *args);
int img_proc_del_ip(struct img_proc *proc, struct dentry *dentry, unsigned long addr);
/* debug */
#include <sspt/sspt_proc.h>
#include <helper.h>
-#include "../../driver/us_def_handler.h"
-
struct pf_group {
struct list_head list;
struct img_proc *i_proc;
void copy_proc_form_img_to_sspt(struct img_proc *i_proc, struct sspt_proc *proc)
{
struct sspt_file *file;
- struct ip_data ip_d;
-
struct img_file *i_file;
struct img_ip *i_ip;
list_for_each_entry(i_file, &i_proc->file_list, list) {
file = sspt_proc_find_file_or_new(proc, i_file->dentry);
- list_for_each_entry(i_ip, &i_file->ip_list, list) {
- ip_d.flag_retprobe = 1;
- ip_d.got_addr = 0;
- ip_d.jp_handler = ujprobe_event_handler;
- ip_d.offset = i_ip->addr;
- ip_d.pre_handler = ujprobe_event_pre_handler;
- ip_d.rp_handler = uretprobe_event_handler;
-
- sspt_file_add_ip(file, &ip_d);
- }
+ list_for_each_entry(i_ip, &i_file->ip_list, list)
+ sspt_file_add_ip(file, i_ip->addr, i_ip->args);
}
}
}
int pf_register_probe(struct pf_group *pfg, struct dentry *dentry,
- unsigned long offset, void *pre_handler,
- void *jp_handler, void *rp_handler)
+ unsigned long offset, const char *args)
{
- return img_proc_add_ip(pfg->i_proc, dentry, offset);
+ return img_proc_add_ip(pfg->i_proc, dentry, offset, args);
}
EXPORT_SYMBOL_GPL(pf_register_probe);
void put_pf_group(struct pf_group *pfg);
int pf_register_probe(struct pf_group *pfg, struct dentry *dentry,
- unsigned long offset, void *pre_handler,
- void *jp_handler, void *rp_handler);
+ unsigned long offset, const char *args);
int pf_unregister_probe(struct pf_group *pfg, struct dentry *dentry,
unsigned long offset);
#include "sspt_page.h"
#include "sspt_file.h"
-struct us_ip *create_ip(unsigned long offset)
+/* FIXME: */
+#include "../../driver/us_def_handler.h"
+
+struct us_ip *create_ip(unsigned long offset, const char *args)
{
struct us_ip *ip = kmalloc(sizeof(*ip), GFP_ATOMIC);
memset(ip, 0, sizeof(*ip));
INIT_LIST_HEAD(&ip->list);
ip->offset = offset;
- return ip;
-}
+ ip->got_addr = 0;
+ ip->flag_got = 1;
-void free_ip(struct us_ip *ip)
-{
- kfree(ip);
-}
+ /* jprobe */
+ ip->jprobe.pre_entry = ujprobe_event_pre_handler;
+ ip->jprobe.entry = ujprobe_event_handler;
-static inline void set_ip_jp_handler(struct us_ip *ip, kprobe_pre_entry_handler_t per_entry, void *entry)
-{
- ip->jprobe.pre_entry = per_entry;
- ip->jprobe.entry = entry;
-}
+ /* TODO: or copy args?! */
+ ip->jprobe.args = args;
-static inline void set_ip_rp_handler(struct us_ip *ip, uretprobe_handler_t handler)
-{
+ /* retprobe */
ip->flag_retprobe = 1;
- ip->retprobe.handler = handler;
-}
+ ip->retprobe.handler = uretprobe_event_handler;
-static inline void set_ip_got_addr(struct us_ip *ip, unsigned long got_addr)
-{
- ip->got_addr = got_addr;
+ return ip;
}
-struct us_ip *create_ip_by_ip_data(struct ip_data *ip_d)
+void free_ip(struct us_ip *ip)
{
- struct us_ip *ip = create_ip(ip_d->offset);
- set_ip_jp_handler(ip, ip_d->pre_handler, (void *)ip_d->jp_handler);
-
- if (ip_d->flag_retprobe) {
- set_ip_rp_handler(ip, ip_d->rp_handler);
- }
-
- set_ip_got_addr(ip, ip_d->got_addr);
-
- return ip;
+ kfree(ip);
}
};
-struct us_ip *create_ip(unsigned long offset);
-struct us_ip *create_ip_by_ip_data(struct ip_data *ip_d);
+struct us_ip *create_ip(unsigned long offset, const char *args);
void free_ip(struct us_ip *ip);
#endif /* __IP__ */
name = name ? name + 1 : path;
for (k = 0; k < p_libs->ips_count; ++k) {
- struct ip_data pd;
us_proc_ip_t *ip = &p_libs->p_ips[k];
unsigned long got_addr = 0;
}
}
- pd.flag_retprobe = 1;
- pd.offset = ip->offset;
- pd.got_addr = got_addr;
- pd.pre_handler = ip->jprobe.pre_entry ? ip->jprobe.pre_entry : ujprobe_event_pre_handler;
- pd.jp_handler = (unsigned long) (ip->jprobe.entry ? ip->jprobe.entry : ujprobe_event_handler);
- pd.rp_handler = ip->retprobe.handler ? ip->retprobe.handler : uretprobe_event_handler;
-
-// ret = usm_register_probe(dentry, pd.offset, pd.pre_handler, pd.jp_handler, pd.rp_handler);
-// if (ret)
-// printk("### ERROR: usm_register_probe ret=%d\n", ret);
-
- ret = pf_register_probe(pfg, dentry, pd.offset, pd.pre_handler, pd.jp_handler, pd.rp_handler);
+ ret = pf_register_probe(pfg, dentry, ip->offset, "dddd");
if (ret)
printk("### ERROR: pf_register_probe ret=%d\n", ret);
}
return sspt_find_page(file, offset);
}
-void sspt_file_add_ip(struct sspt_file *file, struct ip_data *ip_d)
+void sspt_file_add_ip(struct sspt_file *file, unsigned long offset,
+ const char *args)
{
- unsigned long offset = ip_d->offset & PAGE_MASK;
- struct sspt_page *page = sspt_find_page_or_new(file, offset);
+ struct sspt_page *page = sspt_find_page_or_new(file, offset & PAGE_MASK);
// FIXME: delete ip
- struct us_ip *ip = create_ip_by_ip_data(ip_d);
+ struct us_ip *ip = create_ip(offset, args);
sspt_add_ip(page, ip);
}
struct sspt_file *sspt_file_create(struct dentry *dentry, int page_cnt);
void sspt_file_free(struct sspt_file *file);
-struct sspt_page *sspt_find_page_mapped(struct sspt_file *file, unsigned long page);
-void sspt_file_add_ip(struct sspt_file *file, struct ip_data *ip_d);
+struct sspt_page *sspt_find_page_mapped(struct sspt_file *file,
+ unsigned long page);
+void sspt_file_add_ip(struct sspt_file *file, unsigned long offset,
+ const char *args);
struct sspt_page *sspt_get_page(struct sspt_file *file, unsigned long offset_addr);
void sspt_put_page(struct sspt_page *page);