#include "sspt_page.h"
#include "sspt_file.h"
#include <writer/swap_writer_module.h>
+#include <us_manager/us_manager.h>
static int entry_handler(struct uretprobe_instance *ri, struct pt_regs *regs)
{
- struct us_ip *ip = container_of(ri->rp, struct us_ip, retprobe);
+ struct uretprobe *rp = ri->rp;
- entry_event(ip->args, regs, PT_US, PST_NONE);
+ 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;
+
+ entry_event(fmt, addr, regs, PT_US, PST_NONE);
+ }
return 0;
}
static int ret_handler(struct uretprobe_instance *ri, struct pt_regs *regs)
{
- struct us_ip *ip = container_of(ri->rp, struct us_ip, retprobe);
- unsigned long addr = (unsigned long)ip->retprobe.up.kp.addr;
+ struct uretprobe *rp = ri->rp;
-#if defined(CONFIG_ARM)
- addr = ip->offset & 0x01 ? addr | 0x01 : addr;
-#endif
+ 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;
- exit_event(regs, addr);
+ exit_event(ip->ret_type, regs, PT_US, PST_NONE, addr, ret_addr);
+ }
return 0;
}
-struct us_ip *create_ip(unsigned long offset, const char *args)
+/**
+ * @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)
{
- struct us_ip *ip = kmalloc(sizeof(*ip), GFP_ATOMIC);
- memset(ip, 0, sizeof(*ip));
+ size_t len = strlen(args) + 1;
+ struct us_ip *ip = kmalloc(sizeof(*ip) + len, GFP_ATOMIC);
- INIT_LIST_HEAD(&ip->list);
- ip->offset = offset;
+ if (ip != NULL) {
+ memset(ip, 0, sizeof(*ip));
- /* TODO: or copy args?! */
- ip->args = args;
+ INIT_LIST_HEAD(&ip->list);
+ ip->offset = offset;
+ ip->args = (char *)ip + sizeof(*ip);
+ ip->ret_type = ret_type;
- /* retprobe */
- ip->retprobe.handler = ret_handler;
- ip->retprobe.entry_handler = entry_handler;
+ /* 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);