[PROTO] Add type/subtype in msg_function_exit
[kernel/swap-modules.git] / us_manager / sspt / ip.c
index 1946137..a54353e 100644 (file)
 #include "ip.h"
 #include "sspt_page.h"
 #include "sspt_file.h"
+#include <writer/swap_writer_module.h>
+#include <us_manager/us_manager.h>
 
-#include "us_def_handler.h"
 
-struct us_ip *create_ip(unsigned long offset, const char *args)
+static int entry_handler(struct uretprobe_instance *ri, struct pt_regs *regs)
 {
-       struct us_ip *ip = kmalloc(sizeof(*ip), GFP_ATOMIC);
-       memset(ip, 0, sizeof(*ip));
+       struct uretprobe *rp = ri->rp;
 
-       INIT_LIST_HEAD(&ip->list);
-       ip->offset = offset;
+       if (rp && get_quiet() == QT_OFF) {
+               struct us_ip *ip = container_of(rp, struct us_ip, retprobe);
+               const char *fmt = ip->args;
+               unsigned long addr = (unsigned long)ip->orig_addr;
 
-       ip->got_addr = 0;
-       ip->flag_got = 1;
+               entry_event(fmt, addr, regs, PT_US, PST_NONE);
+       }
 
-       /* jprobe */
-       ip->jprobe.pre_entry = ujprobe_event_pre_handler;
-       ip->jprobe.entry = ujprobe_event_handler;
+       return 0;
+}
+
+static int ret_handler(struct uretprobe_instance *ri, struct pt_regs *regs)
+{
+       struct uretprobe *rp = ri->rp;
+
+       if (rp && get_quiet() == QT_OFF) {
+               struct us_ip *ip = container_of(rp, struct us_ip, retprobe);
+               unsigned long addr = (unsigned long)ip->orig_addr;
+               unsigned long ret_addr = (unsigned long)ri->ret_addr;
 
-       /* TODO: or copy args?! */
-       ip->jprobe.args = args;
+               exit_event(ip->ret_type, regs, PT_US, PST_NONE, addr, ret_addr);
+       }
 
-       /* retprobe */
-       ip->flag_retprobe = 1;
-       ip->retprobe.handler = uretprobe_event_handler;
+       return 0;
+}
+
+/**
+ * @brief Create us_ip struct
+ *
+ * @param offset Function offset from the beginning of the page
+ * @param args Function arguments
+ * @param ret_type Return type
+ * @return Pointer to the created us_ip struct
+ */
+struct us_ip *create_ip(unsigned long offset, const char *args, char ret_type)
+{
+       size_t len = strlen(args) + 1;
+       struct us_ip *ip = kmalloc(sizeof(*ip) + len, GFP_ATOMIC);
+
+       if (ip != NULL) {
+               memset(ip, 0, sizeof(*ip));
+
+               INIT_LIST_HEAD(&ip->list);
+               ip->offset = offset;
+               ip->args = (char *)ip + sizeof(*ip);
+               ip->ret_type = ret_type;
+
+               /* copy args */
+               memcpy(ip->args, args, len);
+
+               /* retprobe */
+               ip->retprobe.handler = ret_handler;
+               ip->retprobe.entry_handler = entry_handler;
+       } else {
+               printk("Cannot kmalloc in create_ip function!\n");
+       }
 
        return ip;
 }
 
+/**
+ * @brief Remove us_ip struct
+ *
+ * @param ip remove object
+ * @return Void
+ */
 void free_ip(struct us_ip *ip)
 {
        kfree(ip);