2 * Dynamic Binary Instrumentation Module based on KProbes
3 * modules/driver/sspt/ip.c
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 * Copyright (C) Samsung Electronics, 2013
21 * 2013 Vyacheslav Cherkashin <v.cherkashin@samsung.com>
25 #include <linux/slab.h>
27 #include "sspt_page.h"
28 #include "sspt_file.h"
29 #include <writer/swap_writer_module.h>
30 #include <us_manager/us_manager.h>
33 static int entry_handler(struct uretprobe_instance *ri, struct pt_regs *regs)
35 struct uretprobe *rp = ri->rp;
37 if (rp && get_quiet() == QT_OFF) {
38 struct us_ip *ip = container_of(rp, struct us_ip, retprobe);
40 entry_event(ip->args, regs, PT_US, PST_NONE);
46 static int ret_handler(struct uretprobe_instance *ri, struct pt_regs *regs)
48 struct uretprobe *rp = ri->rp;
50 if (rp && get_quiet() == QT_OFF) {
51 struct us_ip *ip = container_of(rp, struct us_ip, retprobe);
52 unsigned long addr = (unsigned long)ip->retprobe.up.kp.addr;
53 unsigned long ret_addr = (unsigned long)ri->ret_addr;
55 #if defined(CONFIG_ARM)
56 addr = ip->offset & 0x01 ? addr | 0x01 : addr;
59 exit_event(ip->ret_type, regs, addr, ret_addr);
65 struct us_ip *create_ip(unsigned long offset, const char *args, char ret_type)
67 size_t len = strlen(args) + 1;
68 struct us_ip *ip = kmalloc(sizeof(*ip) + len, GFP_ATOMIC);
71 memset(ip, 0, sizeof(*ip));
73 INIT_LIST_HEAD(&ip->list);
75 ip->args = (char *)ip + sizeof(*ip);
76 ip->ret_type = ret_type;
79 memcpy(ip->args, args, len);
82 ip->retprobe.handler = ret_handler;
83 ip->retprobe.entry_handler = entry_handler;
85 printk("Cannot kmalloc in create_ip function!\n");
91 void free_ip(struct us_ip *ip)