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 6BF9EC433EF for ; Mon, 31 Jan 2022 17:22:27 +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=gkgW7+Hirppusb3rP607RPiv0D0qHO6bcb7N+g0+RHA=; b=fBsknqDAYGU0+K kDYcop4vVqATCKN+iIrVmtWrECkp0rKFCa28aHQQ5zJmTjuNe/YQ0pEU2MCmIhzkaUGZYSfjPyT3f J0ZJsaxubNutUtvNv0X+or/flQ8AhvbB8wpK63gzRbblFD7XY4Fz0JmIjQeFpBXF+3msSYb9humrb /NVCDi4ae/i+FcwXVygKwn9/U9TwqsyGbs80pAEkHFI2IglCtaQ53Gu229xnW/9ypm0CEsxCLDeOa J28nuZu1+KBuhnBXkoZtYzZL+qNNZaNok4mZtF5uIcQCCQ0FbihunnVlbBE9FvgpWJKtC560XVYZF vRigaM6CFrBH2ehKzhnA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nEaMF-00A4O2-1y; Mon, 31 Jan 2022 17:20:51 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nEa6G-009zKL-Br for linux-arm-kernel@lists.infradead.org; Mon, 31 Jan 2022 17:04:22 +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 AAF2F60C55; Mon, 31 Jan 2022 17:04:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C8291C340EE; Mon, 31 Jan 2022 17:04:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1643648659; bh=4bBsmp9K7sS8onsyi7K6l2IfOQMvVpkmdVvsHOZma2I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TR2mH1MMULrVolLqJTO6T4BqxvAqt22bfbJkzRceH50+br1fDO4vtBDPrWxoprFgA J+SJ7x9iGll/tld/lhpe1oE5NCf5o9MaToGuZHrl+jqeJvhYSqBDOvDQOAcQePcW6g YhZd0/G73wC/BrmJHWq02AhawgHTI34cUVC/QvNUQt9jGg+n/LkQ4Vs4C1nV+sy2aU AP2nfkOGxYL+q3nuZzHsioz1vxCoYDN1+a3l8DSPZ07d/zqb0GY4EFGNMMzTywgQqz DpCPyamQEaReTr2pbVthmsZaubx4JypwpyRyB1guyRhWR+nAY9PiraqTH+vQQItdVm o5Rz2V2FLJP5Q== 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 v2 09/12] ARM: kprobes: treat R7 as the frame pointer register in Thumb2 builds Date: Mon, 31 Jan 2022 18:03:44 +0100 Message-Id: <20220131170347.381551-10-ardb@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220131170347.381551-1-ardb@kernel.org> References: <20220131170347.381551-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5504; h=from:subject; bh=4bBsmp9K7sS8onsyi7K6l2IfOQMvVpkmdVvsHOZma2I=; b=owEB7QES/pANAwAKAcNPIjmS2Y8kAcsmYgBh+BZs1cPyNRg2uGgptToRrcTjgriFmsNqwJJTaFfD aau3haOJAbMEAAEKAB0WIQT72WJ8QGnJQhU3VynDTyI5ktmPJAUCYfgWbAAKCRDDTyI5ktmPJKVVC/ 4sRG6viRdkshocXJXZbAPLvFXQdRigSvFUREfu66lRN9ZwK6RPDtXwaUywhHbW6uoILzG6+470RxO3 Q2KBLSIKW+WLsk2cpvgYsTDenpG1vXNN1BTm1MPevmkK1evbalcDmmebKEHBDmyOfGQrwXxcyZ5kHv bmyfoAejZhqQrO/IqTChkQQz/nsapyKBxqpgO/Pc/eBehaqtcP9yr5dlfEg8caVSASpuIZvRKr+dja 83/CiZ/BZKBeocP7rhMn9ulEK5fs7XdmlFGwdU++NQhViFfKKg+Zs/sC+uOcna8G/aHyoG6LS8ULlp nhNy7QGv3ptT4pYtAjhrH0OgfbohsvJYpbncKXxvERE/t1o4B3Yi7/5NHWyNO8c9tXLOtQfoAZt9J/ OpkykWA3zzUMKJVI6d+NizpKSJ9yIr2CIAgqvbSbWvHmolMSPEXy9cswK2djIgj0fpIURlPNve2/1C Fbc2pzeEOcipi52DIT2oQuJsnosEo/4R9Mlb+riu2B8QA= 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-20220131_090420_557271_4CB6F1FB X-CRM114-Status: GOOD ( 16.68 ) 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 --- arch/arm/include/asm/opcodes.h | 14 ++++++++ arch/arm/probes/kprobes/actions-common.c | 6 ++-- arch/arm/probes/kprobes/actions-thumb.c | 38 ++++++++++++++++---- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/arch/arm/include/asm/opcodes.h b/arch/arm/include/asm/opcodes.h index 38e3eabff5c3..9a6362408ea0 100644 --- a/arch/arm/include/asm/opcodes.h +++ b/arch/arm/include/asm/opcodes.h @@ -230,4 +230,18 @@ extern __u32 __opcode_to_mem_thumb32(__u32); ".short " __stringify(first) ", " __stringify(second) "\n\t" #endif +/* + * Which register to preserve and which register can be clobbered in inline asm + * that needs to be compatible with code that emits frame pointers. + */ +#ifdef CONFIG_THUMB2_KERNEL +#define FPREG_PRESERVE "r7" +#define FPREG_CLOBBER "r11" +#define FPREG_PRESERVE_R7 +#else +#define FPREG_PRESERVE "fp" +#define FPREG_CLOBBER "r7" +#define FPREG_PRESERVE_R11 +#endif + #endif /* __ASM_ARM_OPCODES_H */ diff --git a/arch/arm/probes/kprobes/actions-common.c b/arch/arm/probes/kprobes/actions-common.c index 836aebe596cd..f0efe16e2fdb 100644 --- a/arch/arm/probes/kprobes/actions-common.c +++ b/arch/arm/probes/kprobes/actions-common.c @@ -84,7 +84,7 @@ 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" + "stmdb sp!, {%[regs], " FPREG_PRESERVE "}\n\t" "ldmia %[regs], {r0-r12} \n\t" #if __LINUX_ARM_ARCH__ >= 6 "blx %[fn] \n\t" @@ -96,10 +96,10 @@ 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" + "ldr " FPREG_PRESERVE ", [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", FPREG_CLOBBER, "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..873757326533 100644 --- a/arch/arm/probes/kprobes/actions-thumb.c +++ b/arch/arm/probes/kprobes/actions-thumb.c @@ -447,14 +447,20 @@ t16_emulate_loregs(probes_opcode_t insn, __asm__ __volatile__ ( "msr cpsr_fs, %[oldcpsr] \n\t" +#ifdef FPREG_PRESERVE_R7 + "mov fp, r7 \n\t" +#endif "ldmia %[regs], {r0-r7} \n\t" "blx %[fn] \n\t" "stmia %[regs], {r0-r7} \n\t" +#ifdef FPREG_PRESERVE_R7 + "mov r7, fp \n\t" +#endif "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", FPREG_CLOBBER, "lr", "memory", "cc" ); @@ -524,15 +530,21 @@ t16_emulate_push(probes_opcode_t insn, struct arch_probes_insn *asi, struct pt_regs *regs) { __asm__ __volatile__ ( +#ifdef FPREG_PRESERVE_R7 + "mov fp, r7 \n\t" +#endif "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" +#ifdef FPREG_PRESERVE_R7 + "mov r7, fp \n\t" +#endif : : [regs] "r" (regs), [fn] "r" (asi->insn_fn) - : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", - "lr", "memory", "cc" + : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r8", "r9", + FPREG_CLOBBER, "lr", "memory", "cc" ); } @@ -558,15 +570,21 @@ t16_emulate_pop_nopc(probes_opcode_t insn, struct arch_probes_insn *asi, struct pt_regs *regs) { __asm__ __volatile__ ( +#ifdef FPREG_PRESERVE_R7 + "mov fp, r7 \n\t" +#endif "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" +#ifdef FPREG_PRESERVE_R7 + "mov r7, fp \n\t" +#endif : : [regs] "r" (regs), [fn] "r" (asi->insn_fn) - : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r9", - "lr", "memory", "cc" + : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r9", + FPREG_CLOBBER, "lr", "memory", "cc" ); } @@ -577,15 +595,21 @@ t16_emulate_pop_pc(probes_opcode_t insn, register unsigned long pc asm("r8"); __asm__ __volatile__ ( +#ifdef FPREG_PRESERVE_R7 + "mov fp, r7 \n\t" +#endif "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" +#ifdef FPREG_PRESERVE_R7 + "mov r7, fp \n\t" +#endif : "=r" (pc) : [regs] "r" (regs), [fn] "r" (asi->insn_fn) - : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r9", - "lr", "memory", "cc" + : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r9", + FPREG_CLOBBER, "lr", "memory", "cc" ); bx_write_pc(pc, regs); -- 2.30.2 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel