From 436046213760e551a7168d0ad2ddb03665e0e35d Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Tue, 29 Oct 2013 20:25:59 +0400 Subject: [PATCH] [FIX] get_regs_ret_func() for x86 Change-Id: I46ec7128c82f3a37f09a691966e0a91659d294a6 Signed-off-by: Vyacheslav Cherkashin --- writer/kernel_operations.h | 15 ++++++++++----- 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 a1494ee..2d856b7 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 cde3872..d181d2e 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; -- 2.7.4