diff options
author | Vyacheslav Cherkashin <v.cherkashin@samsung.com> | 2013-10-29 20:25:59 +0400 |
---|---|---|
committer | Vyacheslav Cherkashin <v.cherkashin@samsung.com> | 2013-10-29 20:27:49 +0400 |
commit | 436046213760e551a7168d0ad2ddb03665e0e35d (patch) | |
tree | 0d55e8bf5ebb568686e8e6f2a29aebd370f56beb /writer | |
parent | 9cf0dfd4ee76896474bc04bf2e6fa9a8586721d2 (diff) | |
download | swap-modules-436046213760e551a7168d0ad2ddb03665e0e35d.tar.gz swap-modules-436046213760e551a7168d0ad2ddb03665e0e35d.tar.bz2 swap-modules-436046213760e551a7168d0ad2ddb03665e0e35d.zip |
[FIX] get_regs_ret_func() for x86
Change-Id: I46ec7128c82f3a37f09a691966e0a91659d294a6
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
Diffstat (limited to 'writer')
-rw-r--r-- | writer/kernel_operations.h | 15 | ||||
-rw-r--r-- | writer/swap_writer_module.c | 1 |
2 files changed, 10 insertions, 6 deletions
diff --git a/writer/kernel_operations.h b/writer/kernel_operations.h index a1494ee9..2d856b74 100644 --- a/writer/kernel_operations.h +++ b/writer/kernel_operations.h @@ -60,11 +60,16 @@ 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; diff --git a/writer/swap_writer_module.c b/writer/swap_writer_module.c index cde38721..d181d2ea 100644 --- a/writer/swap_writer_module.c +++ b/writer/swap_writer_module.c @@ -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; |