From patchwork Mon Dec 12 08:50:52 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tiejun Chen X-Patchwork-Id: 130673 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from ozlabs.org (localhost [IPv6:::1]) by ozlabs.org (Postfix) with ESMTP id AD81CB745D for ; Mon, 12 Dec 2011 19:51:59 +1100 (EST) Received: by ozlabs.org (Postfix) id 5A4D4B70C3; Mon, 12 Dec 2011 19:51:43 +1100 (EST) Delivered-To: linuxppc-dev@ozlabs.org Received: from mail.windriver.com (mail.windriver.com [147.11.1.11]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "mail.windriver.com", Issuer "Intel External Basic Issuing CA 3A" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 072FFB70BB for ; Mon, 12 Dec 2011 19:51:41 +1100 (EST) Received: from ALA-HCA.corp.ad.wrs.com (ala-hca [147.11.189.40]) by mail.windriver.com (8.14.3/8.14.3) with ESMTP id pBC8pd6e026367 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=FAIL); Mon, 12 Dec 2011 00:51:39 -0800 (PST) Received: from localhost.localdomain (128.224.162.71) by ALA-HCA.corp.ad.wrs.com (147.11.189.50) with Microsoft SMTP Server id 14.1.255.0; Mon, 12 Dec 2011 00:51:39 -0800 From: Tiejun Chen To: , Subject: [PATCH 3/4] ppc32/kprobe: complete kprobe and migrate exception frame Date: Mon, 12 Dec 2011 16:50:52 +0800 Message-ID: <1323679853-31751-4-git-send-email-tiejun.chen@windriver.com> X-Mailer: git-send-email 1.5.6 In-Reply-To: <1323679853-31751-1-git-send-email-tiejun.chen@windriver.com> References: <1323679853-31751-1-git-send-email-tiejun.chen@windriver.com> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org We can't emulate stwu since that may corrupt current exception stack. So we will have to do real store operation in the exception return code. Firstly we'll allocate a trampoline exception frame below the kprobed function stack and copy the current exception frame to the trampoline. Then we can do this real store operation to implement 'stwu', and reroute the trampoline frame to r1 to complete this exception migration. Signed-off-by: Tiejun Chen --- arch/powerpc/kernel/entry_32.S | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+), 0 deletions(-) diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 56212bc..d56e311 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S @@ -1185,6 +1185,8 @@ recheck: bne- do_resched andi. r0,r9,_TIF_USER_WORK_MASK beq restore_user + andis. r0,r9,_TIF_DELAYED_KPROBE@h + bne- restore_kprobe do_user_signal: /* r10 contains MSR_KERNEL here */ ori r10,r10,MSR_EE SYNC @@ -1202,6 +1204,30 @@ do_user_signal: /* r10 contains MSR_KERNEL here */ REST_NVGPRS(r1) b recheck +restore_kprobe: + lwz r3,GPR1(r1) + subi r3,r3,INT_FRAME_SIZE; /* Allocate a trampoline exception frame */ + mr r4,r1 + bl copy_exc_stack /* Copy from the original to the trampoline */ + + /* Do real stw operation to complete stwu */ + mr r4,r1 + addi r4,r4,INT_FRAME_SIZE /* Get kprobed entry */ + lwz r5,GPR1(r1) /* Backup r1 */ + stw r4,GPR1(r1) /* Now store that safely */ + + /* Reroute the trampoline frame to r1 */ + subi r5,r5,INT_FRAME_SIZE + mr r1,r5 + + /* Clear _TIF_DELAYED_KPROBE flag */ + rlwinm r9,r1,0,0,(31-THREAD_SHIFT) + lwz r0,TI_FLAGS(r9) + rlwinm r0,r0,0,_TIF_DELAYED_KPROBE + stw r0,TI_FLAGS(r9) + + b restore + /* * We come here when we are at the end of handling an exception * that occurred at a place where taking an exception will lose