#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);