[FIX] get_regs_ret_func() for x86
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 29 Oct 2013 16:25:59 +0000 (20:25 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 29 Oct 2013 16:27:49 +0000 (20:27 +0400)
Change-Id: I46ec7128c82f3a37f09a691966e0a91659d294a6
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
writer/kernel_operations.h
writer/swap_writer_module.c

index a1494ee..2d856b7 100644 (file)
 
 static inline u32 get_regs_ret_func(struct pt_regs *regs)
 {
-       u32 addr;
-
-       if (get_user(addr, (u32 *)regs->sp)) {
-               printk("failed to dereference a pointer, addr=%p\n", addr);
-               return 0;
+       u32 *sp, addr = 0;
+
+       if (user_mode(regs)) {
+               sp = regs->sp;
+               if (get_user(addr, sp))
+                       printk("failed to dereference a pointer, sp=%p, "
+                              "pc=%p\n", sp, get_regs_ip(regs));
+       } else {
+               sp = (u32 *)kernel_stack_pointer(regs);
+               addr = *sp;
        }
 
        return addr;
index cde3872..d181d2e 100644 (file)
@@ -405,7 +405,6 @@ static char *pack_msg_func_entry(char *payload, const char *fmt, struct pt_regs
        mfe->tid = task->pid;
        mfe->cpu_num = smp_processor_id();
        mfe->pc_addr = get_regs_ip(regs);
-//TODO ret address for x86!
        mfe->caller_pc_addr = get_regs_ret_func(regs);
        mfe->probe_type = pt;
        mfe->probe_sub_type = sub_type;