From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CA95DC433F5 for ; Thu, 3 Feb 2022 08:27:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=FFGlYvzJevHrELqrOZlMx+NJQXnWb9ZQOGeTIqoA5+U=; b=rQiilYbeqwQenE g63JB+aThoiYfhwogPBC78FpMH/g/C2i8wwf4gmdXHqNAwEh1Vg+4GNZmlbVCB6iPE7lcd3nttBwd Z7rOXMNS+1hNm6SjZZPc5AWWX3T+Tt5wFuxXvwSIMo3pEx2dpc8LYE7WOrz4y/4gO1PBw7j6U53s7 lH7dHUAfVitF49dPIAH3mgjcs3B6e86l2RvtwFE+J6jFW0YPB0xyIP+VD0TUL+D18DJwuDw1JRoNj 0RPsrI/5lQlDyKqL8b1nUfsRykkMn+iVDAkk9rmH6w1CYpaJ62GltlB/mJry/TLxM1IiFQEt/dT4s bVTvHhqdpk9sOdfNQOGA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nFXRC-000Kk5-FL; Thu, 03 Feb 2022 08:25:55 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nFXO3-000JML-AJ for linux-arm-kernel@lists.infradead.org; Thu, 03 Feb 2022 08:22:40 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id DC67761844; Thu, 3 Feb 2022 08:22:38 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 06923C340ED; Thu, 3 Feb 2022 08:22:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1643876558; bh=Ky+lRXD7Jdvtas0Du2i9IG80eC0i7j+egA+GMf7wjKA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uZwQyb3dtY6TV97An6v8/M28Wq1OelIav/xhxynkiTXf/pAnaA/B4qoJNV08f1UFG ulS/AdebVlHpzJcW8S1V6TZsbGGDowyRHKRFh88LCIFygvdIUUvz5yCqK4F6pYLOvS 4kHxNs+Z343E8a6vJc7y8YMd1BVirCNrp9NzgFz7lczTizGctMG9KCandjKIa7GQ3K c+X+b0cBwOCPkd3302LH5k2A25fBVvwqCF8xfj8RT2XEH9maUsQpOWOzwOMS6ojzyb ubHRPN/5lx6D+2SUbYRTPfcBMe2jbQxTUOsOHJWOVLceRvWoU+GQg48KrgbBA7c1Kb S9HUkVbc/4vbA== From: Ard Biesheuvel To: linux@armlinux.org.uk Cc: linux-arm-kernel@lists.infradead.org, Ard Biesheuvel , Steven Rostedt , Sudeep Holla , Cristian Marussi , Nathan Chancellor , Nick Desaulniers , Arnd Bergmann , Linus Walleij , Masami Hiramatsu Subject: [PATCH v3 09/13] ARM: kprobes: treat R7 as the frame pointer register in Thumb2 builds Date: Thu, 3 Feb 2022 09:22:00 +0100 Message-Id: <20220203082204.1176734-10-ardb@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220203082204.1176734-1-ardb@kernel.org> References: <20220203082204.1176734-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=4387; h=from:subject; bh=Ky+lRXD7Jdvtas0Du2i9IG80eC0i7j+egA+GMf7wjKA=; b=owEB7QES/pANAwAKAcNPIjmS2Y8kAcsmYgBh+5CjaeeglZX8klqnFokaAJMfxgCwdxxuq2k7FbBX 4wZ+AR6JAbMEAAEKAB0WIQT72WJ8QGnJQhU3VynDTyI5ktmPJAUCYfuQowAKCRDDTyI5ktmPJLyPDA C91dAlq7ZUHTd11z5UB4WDpRiLUrIXyxIcKxflEZ22GqMIUBRBzVJsleBJleA618OfA2MJw0EXfbgg D5E43m13tcE06S3w7EprMtIXJXpHkI2qFOKA30/jcamq671Jr8a4LsDbzoMsSeFOodYzlRjyblJdxi ilWvEaDUqTT7HstPGtSze82HkG3KsLdodKn8nn3krJErKKntxZsGRsyP66r7iLyYMvDjcO0+BT+849 wvUmB45lq/+MrZd4sqgr9QHIR51XuVdehBw+kxtVNxAP0EO/ZQwg17dvnjmettC1nXs6Gl63Yy3BuG D77x10QiYjWnCMC//Xf2a/9KF1VVDtAMaZHrdVNGtdQhy2diaLo1yjn5hn1IEaDscMlik8ZkRr1o2m Npr1+v7IZWzst0Hvh4mvnSgz4rMmWynqKRTcUScvp5rtnZu8fn2kpKttD1ZT7xC8Zr1ee08ursiYiW hqXGsRVJJA4To4RU19nbOYcdwWEbf+AOotpldzDlPjVMc= X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220203_002239_479683_3A6F567F X-CRM114-Status: GOOD ( 14.64 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Thumb2 code uses R7 as the frame pointer rather than R11, because the opcodes to access it are generally shorter. This means that there are cases where we cannot simply add it to the clobber list of an asm() block, but need to preserve/restore it explicitly, or the compiler may complain in some cases (e.g., Clang builds with ftrace enabled). Since R11 is not special in that case, clobber it instead, and use it to preserve/restore the value of R7. Signed-off-by: Ard Biesheuvel Reviewed-by: Masami Hiramatsu --- arch/arm/probes/kprobes/actions-common.c | 8 +++++--- arch/arm/probes/kprobes/actions-thumb.c | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/arch/arm/probes/kprobes/actions-common.c b/arch/arm/probes/kprobes/actions-common.c index 836aebe596cd..79171344dbeb 100644 --- a/arch/arm/probes/kprobes/actions-common.c +++ b/arch/arm/probes/kprobes/actions-common.c @@ -84,7 +84,8 @@ emulate_generic_r0_12_noflags(probes_opcode_t insn, register void *rfn asm("lr") = asi->insn_fn; __asm__ __volatile__ ( - "stmdb sp!, {%[regs], r11} \n\t" +ARM( "stmdb sp!, {%[regs], r11} \n\t" ) +THUMB( "stmdb sp!, {%[regs], r7} \n\t" ) "ldmia %[regs], {r0-r12} \n\t" #if __LINUX_ARM_ARCH__ >= 6 "blx %[fn] \n\t" @@ -96,10 +97,11 @@ emulate_generic_r0_12_noflags(probes_opcode_t insn, #endif "ldr lr, [sp], #4 \n\t" /* lr = regs */ "stmia lr, {r0-r12} \n\t" - "ldr r11, [sp], #4 \n\t" +ARM( "ldr r11, [sp], #4 \n\t" ) +THUMB( "ldr r7, [sp], #4 \n\t" ) : [regs] "=r" (rregs), [fn] "=r" (rfn) : "0" (rregs), "1" (rfn) - : "r0", "r2", "r3", "r4", "r5", "r6", "r7", + : "r0", "r2", "r3", "r4", "r5", "r6", ARM("r7") THUMB("r11"), "r8", "r9", "r10", "r12", "memory", "cc" ); } diff --git a/arch/arm/probes/kprobes/actions-thumb.c b/arch/arm/probes/kprobes/actions-thumb.c index 7884fcb81c26..51624fc263fc 100644 --- a/arch/arm/probes/kprobes/actions-thumb.c +++ b/arch/arm/probes/kprobes/actions-thumb.c @@ -447,14 +447,16 @@ t16_emulate_loregs(probes_opcode_t insn, __asm__ __volatile__ ( "msr cpsr_fs, %[oldcpsr] \n\t" + "mov r11, r7 \n\t" "ldmia %[regs], {r0-r7} \n\t" "blx %[fn] \n\t" "stmia %[regs], {r0-r7} \n\t" + "mov r7, r11 \n\t" "mrs %[newcpsr], cpsr \n\t" : [newcpsr] "=r" (newcpsr) : [oldcpsr] "r" (oldcpsr), [regs] "r" (regs), [fn] "r" (asi->insn_fn) - : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", + : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r11", "lr", "memory", "cc" ); @@ -524,14 +526,16 @@ t16_emulate_push(probes_opcode_t insn, struct arch_probes_insn *asi, struct pt_regs *regs) { __asm__ __volatile__ ( + "mov r11, r7 \n\t" "ldr r9, [%[regs], #13*4] \n\t" "ldr r8, [%[regs], #14*4] \n\t" "ldmia %[regs], {r0-r7} \n\t" "blx %[fn] \n\t" "str r9, [%[regs], #13*4] \n\t" + "mov r7, r11 \n\t" : : [regs] "r" (regs), [fn] "r" (asi->insn_fn) - : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", + : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r11", "lr", "memory", "cc" ); } @@ -558,14 +562,16 @@ t16_emulate_pop_nopc(probes_opcode_t insn, struct arch_probes_insn *asi, struct pt_regs *regs) { __asm__ __volatile__ ( + "mov r11, r7 \n\t" "ldr r9, [%[regs], #13*4] \n\t" "ldmia %[regs], {r0-r7} \n\t" "blx %[fn] \n\t" "stmia %[regs], {r0-r7} \n\t" "str r9, [%[regs], #13*4] \n\t" + "mov r7, r11 \n\t" : : [regs] "r" (regs), [fn] "r" (asi->insn_fn) - : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r9", + : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r9", "r11", "lr", "memory", "cc" ); } @@ -577,14 +583,16 @@ t16_emulate_pop_pc(probes_opcode_t insn, register unsigned long pc asm("r8"); __asm__ __volatile__ ( + "mov r11, r7 \n\t" "ldr r9, [%[regs], #13*4] \n\t" "ldmia %[regs], {r0-r7} \n\t" "blx %[fn] \n\t" "stmia %[regs], {r0-r7} \n\t" "str r9, [%[regs], #13*4] \n\t" + "mov r7, r11 \n\t" : "=r" (pc) : [regs] "r" (regs), [fn] "r" (asi->insn_fn) - : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r9", + : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r9", "r11", "lr", "memory", "cc" ); -- 2.30.2 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel