summaryrefslogtreecommitdiff
path: root/writer
diff options
context:
space:
mode:
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>2013-10-29 20:25:59 +0400
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>2013-10-29 20:27:49 +0400
commit436046213760e551a7168d0ad2ddb03665e0e35d (patch)
tree0d55e8bf5ebb568686e8e6f2a29aebd370f56beb /writer
parent9cf0dfd4ee76896474bc04bf2e6fa9a8586721d2 (diff)
downloadswap-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.h15
-rw-r--r--writer/swap_writer_module.c1
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;