public inbox for linux-ia64@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] save parameter registers and restore them for jprobe handling
@ 2005-12-01  2:28 Zhang, Yanmin
  2005-12-01  2:37 ` Keith Owens
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Zhang, Yanmin @ 2005-12-01  2:28 UTC (permalink / raw)
  To: linux-ia64

[-- Attachment #1: Type: text/plain, Size: 330 bytes --]

When jprobe is hit, the function parameters of the original function
should be saved before jprobe handler is executed, and restored it after
jprobe handler is executed, because jprobe handler might change the
register values.

Here is a patch against 2.6.14-mm1.

Signed-off-by: Zhang Yanmin <yanmin.zhang@intel.com>



[-- Attachment #2: jprobe_protect_out_reg_ia64_v2.patch --]
[-- Type: application/octet-stream, Size: 3109 bytes --]

diff -Nraup linux-2.6.14_mm1/arch/ia64/kernel/kprobes.c linux-2.6.14_mm1_jprobe/arch/ia64/kernel/kprobes.c
--- linux-2.6.14_mm1/arch/ia64/kernel/kprobes.c	2005-11-09 19:08:51.000000000 +0800
+++ linux-2.6.14_mm1_jprobe/arch/ia64/kernel/kprobes.c	2005-11-30 17:58:03.000000000 +0800
@@ -759,13 +759,49 @@ int __kprobes kprobe_exceptions_notify(s
 	return ret;
 }
 
+struct param_bsp_cfm {
+	unsigned long ip;
+	unsigned long *bsp;
+	unsigned long cfm;
+};
+
+static void ia64_get_bsp_cfm(struct unw_frame_info *info, void *arg)
+{
+	unsigned long ip;
+	struct param_bsp_cfm *lp = arg;
+
+	do {
+		unw_get_ip(info, &ip);
+		if (ip == 0)
+			break;
+		if (ip == lp->ip) {
+			unw_get_bsp(info, (unsigned long*)&lp->bsp);
+			unw_get_cfm(info, (unsigned long*)&lp->cfm);
+			return;
+		}
+	} while (unw_unwind(info) >= 0);
+	lp->bsp = 0;
+	lp->cfm = 0;
+	return;
+}
+
 int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
 {
 	struct jprobe *jp = container_of(p, struct jprobe, kp);
 	unsigned long addr = ((struct fnptr *)(jp->entry))->ip;
 	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
+	struct param_bsp_cfm pa;
+	int bytes;
 
 	/* save architectural state */
+	pa.ip = regs->cr_iip;
+	unw_init_running(ia64_get_bsp_cfm, &pa);
+	bytes = (char *)ia64_rse_skip_regs(pa.bsp, pa.cfm & 0x3f)
+				- (char *)pa.bsp;
+	memcpy( kcb->jprobes_saved_stacked_regs,
+		pa.bsp,
+		bytes );
+
 	kcb->jprobe_saved_regs = *regs;
 
 	/* after rfi, execute the jprobe instrumented function */
@@ -785,8 +821,19 @@ int __kprobes setjmp_pre_handler(struct 
 int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
 {
 	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
+	struct param_bsp_cfm pa;
+	int bytes;
 
 	*regs = kcb->jprobe_saved_regs;
+	pa.ip = regs->cr_iip;
+	unw_init_running(ia64_get_bsp_cfm, &pa);
+	bytes = (char *)ia64_rse_skip_regs(pa.bsp, pa.cfm & 0x3f)
+				- (char *)pa.bsp;
+	memcpy( pa.bsp,
+		kcb->jprobes_saved_stacked_regs,
+		bytes );
+	invalidate_stacked_regs();
+
 	preempt_enable_no_resched();
 	return 1;
 }
diff -Nraup linux-2.6.14_mm1/include/asm-ia64/kprobes.h linux-2.6.14_mm1_jprobe/include/asm-ia64/kprobes.h
--- linux-2.6.14_mm1/include/asm-ia64/kprobes.h	2005-11-09 19:08:43.000000000 +0800
+++ linux-2.6.14_mm1_jprobe/include/asm-ia64/kprobes.h	2005-11-30 18:01:34.000000000 +0800
@@ -68,13 +68,25 @@ struct prev_kprobe {
 	unsigned long status;
 };
 
+#define	MAX_PARAM_RSE_SIZE	(0x80+0x80/0x3f)
 /* per-cpu kprobe control block */
 struct kprobe_ctlblk {
 	unsigned long kprobe_status;
 	struct pt_regs jprobe_saved_regs;
+	unsigned long jprobes_saved_stacked_regs[MAX_PARAM_RSE_SIZE];
 	struct prev_kprobe prev_kprobe;
 };
 
+/*Invalidate stacked registers outside the current frame*/
+#define invalidate_stacked_regs() { 				\
+	unsigned long rsc_save = 0;				\
+	asm volatile("mov %0=ar.rsc;;\n\t"			\
+		"mov ar.rsc=0;;\n\t"				\
+		"{\n\tloadrs;;\n\t\n\t\n\t}\n\t"		\
+		"mov ar.rsc=%1\n\t"				\
+		:"=r" (rsc_save):"r" (rsc_save):"memory");	\
+	}
+
 #define JPROBE_ENTRY(pentry)	(kprobe_opcode_t *)pentry
 
 #define ARCH_SUPPORTS_KRETPROBES

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2005-12-02  2:29 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-12-01  2:28 [PATCH] save parameter registers and restore them for jprobe handling Zhang, Yanmin
2005-12-01  2:37 ` Keith Owens
2005-12-01  5:19 ` Zhang, Yanmin
2005-12-01 19:25 ` Chen, Kenneth W
2005-12-01 20:06 ` Keshavamurthy Anil S
2005-12-02  2:29 ` Zhang, Yanmin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox