From patchwork Wed Oct 22 11:32:00 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Nan X-Patchwork-Id: 39272 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ee0-f72.google.com (mail-ee0-f72.google.com [74.125.83.72]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 83ACA20341 for ; Wed, 22 Oct 2014 11:34:39 +0000 (UTC) Received: by mail-ee0-f72.google.com with SMTP id d49sf1521524eek.11 for ; Wed, 22 Oct 2014 04:34:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe:content-type; bh=Tex/uy7klJhMp7ycS8GTX0NEhMsYyhqZpiVhttn/LCA=; b=Zx1lb+jpjwsZpgHfHLvuGizzuPwkJ7DQNLNp4rt761N3/5i7mj8M/tt900KDyCpAvG fa0nHp3Lgc9ZtKZ7Cb6vlI1KTzDi9gXa5EkeaZ9SjlkdnnOE2G3ES7DWMhNz0vmYYhzn gGi3nkMdnn9wDAspoLgkZxXvEROxuvqIZfDsS8D2suYeza0JNECkiJ8akIrKpvGzJa6M 9/H+Ag2gAARcRz+sIEjaT0oGKvua0XlF0+7Ay//2uaiI5qmpDbdLJbUxuYD1Vd87MbP/ 9Y9Qhwu6JE2kSLDqHaTnUEtIj0SGW511G0OYs1OTKjs0kaet7f263+EtjbTkRKBTK/+C puog== X-Gm-Message-State: ALoCoQl+j3J5UlXnJx8sD1eDQaDM/7QR1hS7QcWMyWvOdzNEaYw1YARbK/NrQ4OPPHcIQmL6vWBU X-Received: by 10.152.26.72 with SMTP id j8mr6434407lag.3.1413977678539; Wed, 22 Oct 2014 04:34:38 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.43.1 with SMTP id s1ls185654lal.30.gmail; Wed, 22 Oct 2014 04:34:38 -0700 (PDT) X-Received: by 10.152.88.70 with SMTP id be6mr41359685lab.72.1413977678237; Wed, 22 Oct 2014 04:34:38 -0700 (PDT) Received: from mail-lb0-f174.google.com (mail-lb0-f174.google.com. [209.85.217.174]) by mx.google.com with ESMTPS id pa3si22905687lbb.132.2014.10.22.04.34.38 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 22 Oct 2014 04:34:38 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.174 as permitted sender) client-ip=209.85.217.174; Received: by mail-lb0-f174.google.com with SMTP id p9so2646722lbv.19 for ; Wed, 22 Oct 2014 04:34:38 -0700 (PDT) X-Received: by 10.152.5.38 with SMTP id p6mr36182795lap.44.1413977678133; Wed, 22 Oct 2014 04:34:38 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.84.229 with SMTP id c5csp53408lbz; Wed, 22 Oct 2014 04:34:37 -0700 (PDT) X-Received: by 10.68.195.68 with SMTP id ic4mr21573519pbc.44.1413977676368; Wed, 22 Oct 2014 04:34:36 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id je3si13981982pbd.84.2014.10.22.04.34.35 for ; Wed, 22 Oct 2014 04:34:36 -0700 (PDT) Received-SPF: none (google.com: linux-kernel-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933242AbaJVLeb (ORCPT + 27 others); Wed, 22 Oct 2014 07:34:31 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:25527 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933083AbaJVLeI (ORCPT ); Wed, 22 Oct 2014 07:34:08 -0400 Received: from 172.24.2.119 (EHLO lggeml425-hub.china.huawei.com) ([172.24.2.119]) by szxrg02-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id CBC48763; Wed, 22 Oct 2014 19:33:49 +0800 (CST) Received: from kernel-host.huawei (10.107.197.247) by lggeml425-hub.china.huawei.com (10.72.61.35) with Microsoft SMTP Server id 14.3.158.1; Wed, 22 Oct 2014 19:33:36 +0800 From: Wang Nan To: , , , , , , Ben Dooks , Christoph Lameter , Rabin Vincent , "David S. Miller" CC: , , "Li Zefan" Subject: [PATCH v6 2/7] ARM: kprobes: seprates load and store actions Date: Wed, 22 Oct 2014 19:32:00 +0800 Message-ID: <1413977525-51480-3-git-send-email-wangnan0@huawei.com> X-Mailer: git-send-email 1.8.4 In-Reply-To: <1413977525-51480-1-git-send-email-wangnan0@huawei.com> References: <1413977525-51480-1-git-send-email-wangnan0@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.107.197.247] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: wangnan0@huawei.com X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.174 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , This patch seprates actions for load and store. Following patches will check store instructions for more informations. Coverage test complains register test coverage missing after this sepration. This patch introduces one testcase for it. Signed-off-by: Wang Nan --- arch/arm/kernel/kprobes-arm.c | 6 ++- arch/arm/kernel/kprobes-test-arm.c | 1 + arch/arm/kernel/kprobes-test-thumb.c | 13 ++++++ arch/arm/kernel/kprobes-thumb.c | 18 ++++++--- arch/arm/kernel/probes-arm.c | 11 +++-- arch/arm/kernel/probes-arm.h | 6 ++- arch/arm/kernel/probes-thumb.c | 78 +++++++++++++++++++++++++++--------- arch/arm/kernel/probes-thumb.h | 18 ++++++--- arch/arm/kernel/uprobes-arm.c | 6 ++- 9 files changed, 116 insertions(+), 41 deletions(-) diff --git a/arch/arm/kernel/kprobes-arm.c b/arch/arm/kernel/kprobes-arm.c index 6df9f1f..1094ff1 100644 --- a/arch/arm/kernel/kprobes-arm.c +++ b/arch/arm/kernel/kprobes-arm.c @@ -315,7 +315,8 @@ const struct decode_action kprobes_arm_actions[NUM_PROBES_ARM_ACTIONS] = { [PROBES_MUL1] = {.handler = emulate_rdlo12rdhi16rn0rm8_rwflags_nopc}, [PROBES_MUL2] = {.handler = emulate_rd16rn12rm0rs8_rwflags_nopc}, [PROBES_SWP] = {.handler = emulate_rd12rn16rm0_rwflags_nopc}, - [PROBES_LDRSTRD] = {.handler = emulate_ldrdstrd}, + [PROBES_LDRD] = {.handler = emulate_ldrdstrd}, + [PROBES_STRD] = {.handler = emulate_ldrdstrd}, [PROBES_LOAD_EXTRA] = {.handler = emulate_ldr}, [PROBES_LOAD] = {.handler = emulate_ldr}, [PROBES_STORE_EXTRA] = {.handler = emulate_str}, @@ -339,5 +340,6 @@ const struct decode_action kprobes_arm_actions[NUM_PROBES_ARM_ACTIONS] = { [PROBES_MUL_ADD] = {.handler = emulate_rd16rn12rm0rs8_rwflags_nopc}, [PROBES_BITFIELD] = {.handler = emulate_rd12rm0_noflags_nopc}, [PROBES_BRANCH] = {.handler = simulate_bbl}, - [PROBES_LDMSTM] = {.decoder = kprobe_decode_ldmstm} + [PROBES_LDM] = {.decoder = kprobe_decode_ldmstm}, + [PROBES_STM] = {.decoder = kprobe_decode_ldmstm}, }; diff --git a/arch/arm/kernel/kprobes-test-arm.c b/arch/arm/kernel/kprobes-test-arm.c index cb14242..264c064 100644 --- a/arch/arm/kernel/kprobes-test-arm.c +++ b/arch/arm/kernel/kprobes-test-arm.c @@ -571,6 +571,7 @@ void kprobe_arm_test_cases(void) TEST_RPR( "strd r",2, VAL1,", [r",5, 24,"], r",4,48,"") TEST_RPR( "strd r",10,VAL2,", [r",9, 48,"], -r",7,24,"") TEST_UNSUPPORTED(__inst_arm(0xe1afc0fa) " @ strd r12, [pc, r10]!") + TEST_UNSUPPORTED(__inst_arm(0xe1aac0ff) " @ strd r12, [r10, pc]!") TEST_PR( "ldrd r0, [r",0, 48,", -r",2,24,"]") TEST_PR( "ldrmid r8, [r",13,0, ", r",12,48,"]") diff --git a/arch/arm/kernel/kprobes-test-thumb.c b/arch/arm/kernel/kprobes-test-thumb.c index 844dd10..ed863c4 100644 --- a/arch/arm/kernel/kprobes-test-thumb.c +++ b/arch/arm/kernel/kprobes-test-thumb.c @@ -410,6 +410,13 @@ void kprobe_thumb32_test_cases(void) TEST_UNSUPPORTED(__inst_thumb32(0xe9d47d00) " @ ldrd r7, sp, [r4]") TEST_UNSUPPORTED(__inst_thumb32(0xe9d47f00) " @ ldrd r7, pc, [r4]") + TEST_UNSUPPORTED(__inst_thumb32(0xe9efec04) " @ strd r14, r12, [pc, #16]!") + TEST_UNSUPPORTED(__inst_thumb32(0xe8efec04) " @ strd r14, r12, [pc], #16") + TEST_UNSUPPORTED(__inst_thumb32(0xe9c4d800) " @ strd sp, r8, [r4]") + TEST_UNSUPPORTED(__inst_thumb32(0xe9c4f800) " @ strd pc, r8, [r4]") + TEST_UNSUPPORTED(__inst_thumb32(0xe9c47d00) " @ strd r7, sp, [r4]") + TEST_UNSUPPORTED(__inst_thumb32(0xe9c47f00) " @ strd r7, pc, [r4]") + TEST_RRP("strd r",0, VAL1,", r",1, VAL2,", [r",1, 24,", #-16]") TEST_RR( "strd r",12,VAL2,", r",14,VAL1,", [sp, #16]") TEST_RRP("strd r",1, VAL1,", r",0, VAL2,", [r",7, 24,", #-16]!") @@ -832,6 +839,12 @@ CONDITION_INSTRUCTIONS(22, TEST("str sp, [sp]") TEST_UNSUPPORTED(__inst_thumb32(0xf8cfe000) " @ str r14, [pc]") TEST_UNSUPPORTED(__inst_thumb32(0xf8cef000) " @ str pc, [r14]") + TEST_UNSUPPORTED(__inst_thumb32(0xf841100f) " @ str r1, [r1, pc]") + TEST_UNSUPPORTED(__inst_thumb32(0xf841100d) " @ str r1, [r1, sp]") + TEST_UNSUPPORTED(__inst_thumb32(0xf8a1d000) " @ strh sp, [r1]") + TEST_UNSUPPORTED(__inst_thumb32(0xf821d002) " @ strh sp, [r1, r2]") + TEST_UNSUPPORTED(__inst_thumb32(0xf822100f) " @ strh r1, [r2, pc]") + TEST_UNSUPPORTED(__inst_thumb32(0xf822100d) " @ strh r1, [r2, sp]") TEST_GROUP("Advanced SIMD element or structure load/store instructions") diff --git a/arch/arm/kernel/kprobes-thumb.c b/arch/arm/kernel/kprobes-thumb.c index 0672457..c6426b6 100644 --- a/arch/arm/kernel/kprobes-thumb.c +++ b/arch/arm/kernel/kprobes-thumb.c @@ -626,17 +626,22 @@ const struct decode_action kprobes_t16_actions[NUM_PROBES_T16_ACTIONS] = { [PROBES_T16_LDR_LIT] = {.handler = t16_simulate_ldr_literal}, [PROBES_T16_BLX] = {.handler = t16_simulate_bxblx}, [PROBES_T16_HIREGOPS] = {.decoder = t16_decode_hiregs}, - [PROBES_T16_LDRHSTRH] = {.handler = t16_emulate_loregs_rwflags}, - [PROBES_T16_LDRSTR] = {.handler = t16_simulate_ldrstr_sp_relative}, + [PROBES_T16_LDRH] = {.handler = t16_emulate_loregs_rwflags}, + [PROBES_T16_STRH] = {.handler = t16_emulate_loregs_rwflags}, + [PROBES_T16_LDR] = {.handler = t16_simulate_ldrstr_sp_relative}, + [PROBES_T16_STR] = {.handler = t16_simulate_ldrstr_sp_relative}, [PROBES_T16_ADR] = {.handler = t16_simulate_reladr}, - [PROBES_T16_LDMSTM] = {.handler = t16_emulate_loregs_rwflags}, + [PROBES_T16_LDM] = {.handler = t16_emulate_loregs_rwflags}, + [PROBES_T16_STM] = {.handler = t16_emulate_loregs_rwflags}, [PROBES_T16_BRANCH_COND] = {.decoder = t16_decode_cond_branch}, [PROBES_T16_BRANCH] = {.handler = t16_simulate_branch}, }; const struct decode_action kprobes_t32_actions[NUM_PROBES_T32_ACTIONS] = { - [PROBES_T32_LDMSTM] = {.decoder = t32_decode_ldmstm}, - [PROBES_T32_LDRDSTRD] = {.handler = t32_emulate_ldrdstrd}, + [PROBES_T32_LDM] = {.decoder = t32_decode_ldmstm}, + [PROBES_T32_STM] = {.decoder = t32_decode_ldmstm}, + [PROBES_T32_LDRD] = {.handler = t32_emulate_ldrdstrd}, + [PROBES_T32_STRD] = {.handler = t32_emulate_ldrdstrd}, [PROBES_T32_TABLE_BRANCH] = {.handler = t32_simulate_table_branch}, [PROBES_T32_TST] = {.handler = t32_emulate_rd8rn16rm0_rwflags}, [PROBES_T32_MOV] = {.handler = t32_emulate_rd8rn16rm0_rwflags}, @@ -655,7 +660,8 @@ const struct decode_action kprobes_t32_actions[NUM_PROBES_T32_ACTIONS] = { [PROBES_T32_BRANCH] = {.handler = t32_simulate_branch}, [PROBES_T32_PLDI] = {.handler = probes_simulate_nop}, [PROBES_T32_LDR_LIT] = {.handler = t32_simulate_ldr_literal}, - [PROBES_T32_LDRSTR] = {.handler = t32_emulate_ldrstr}, + [PROBES_T32_LDR] = {.handler = t32_emulate_ldrstr}, + [PROBES_T32_STR] = {.handler = t32_emulate_ldrstr}, [PROBES_T32_SIGN_EXTEND] = {.handler = t32_emulate_rd8rn16rm0_rwflags}, [PROBES_T32_MEDIA] = {.handler = t32_emulate_rd8rn16rm0_rwflags}, [PROBES_T32_REVERSE] = {.handler = t32_emulate_rd8rn16_noflags}, diff --git a/arch/arm/kernel/probes-arm.c b/arch/arm/kernel/probes-arm.c index 3d00aa7..148153e 100644 --- a/arch/arm/kernel/probes-arm.c +++ b/arch/arm/kernel/probes-arm.c @@ -270,13 +270,17 @@ static const union decode_item arm_cccc_000x_____1xx1_table[] = { DECODE_REJECT (0x0e10e0d0, 0x0000e0d0), /* LDRD (register) cccc 000x x0x0 xxxx xxxx xxxx 1101 xxxx */ + DECODE_EMULATEX (0x0e5000f0, 0x000000d0, PROBES_LDRD, + REGS(NOPCWB, NOPCX, 0, 0, NOPC)), /* STRD (register) cccc 000x x0x0 xxxx xxxx xxxx 1111 xxxx */ - DECODE_EMULATEX (0x0e5000d0, 0x000000d0, PROBES_LDRSTRD, + DECODE_EMULATEX (0x0e5000f0, 0x000000f0, PROBES_STRD, REGS(NOPCWB, NOPCX, 0, 0, NOPC)), /* LDRD (immediate) cccc 000x x1x0 xxxx xxxx xxxx 1101 xxxx */ + DECODE_EMULATEX (0x0e5000f0, 0x004000d0, PROBES_LDRD, + REGS(NOPCWB, NOPCX, 0, 0, 0)), /* STRD (immediate) cccc 000x x1x0 xxxx xxxx xxxx 1111 xxxx */ - DECODE_EMULATEX (0x0e5000d0, 0x004000d0, PROBES_LDRSTRD, + DECODE_EMULATEX (0x0e5000f0, 0x004000f0, PROBES_STRD, REGS(NOPCWB, NOPCX, 0, 0, 0)), /* STRH (register) cccc 000x x0x0 xxxx xxxx xxxx 1011 xxxx */ @@ -601,8 +605,9 @@ static const union decode_item arm_cccc_100x_table[] = { /* Block data transfer instructions */ /* LDM cccc 100x x0x1 xxxx xxxx xxxx xxxx xxxx */ + DECODE_CUSTOM (0x0e500000, 0x08100000, PROBES_LDM), /* STM cccc 100x x0x0 xxxx xxxx xxxx xxxx xxxx */ - DECODE_CUSTOM (0x0e400000, 0x08000000, PROBES_LDMSTM), + DECODE_CUSTOM (0x0e500000, 0x08000000, PROBES_STM), /* STM (user registers) cccc 100x x1x0 xxxx xxxx xxxx xxxx xxxx */ /* LDM (user registers) cccc 100x x1x1 xxxx 0xxx xxxx xxxx xxxx */ diff --git a/arch/arm/kernel/probes-arm.h b/arch/arm/kernel/probes-arm.h index 6ecc25a..18ffc9a 100644 --- a/arch/arm/kernel/probes-arm.h +++ b/arch/arm/kernel/probes-arm.h @@ -28,7 +28,8 @@ enum probes_arm_action { PROBES_MUL1, PROBES_MUL2, PROBES_SWP, - PROBES_LDRSTRD, + PROBES_LDRD, + PROBES_STRD, PROBES_LOAD, PROBES_STORE, PROBES_LOAD_EXTRA, @@ -49,7 +50,8 @@ enum probes_arm_action { PROBES_MUL_ADD, PROBES_BITFIELD, PROBES_BRANCH, - PROBES_LDMSTM, + PROBES_LDM, + PROBES_STM, NUM_PROBES_ARM_ACTIONS }; diff --git a/arch/arm/kernel/probes-thumb.c b/arch/arm/kernel/probes-thumb.c index 72aa217..749d4cd 100644 --- a/arch/arm/kernel/probes-thumb.c +++ b/arch/arm/kernel/probes-thumb.c @@ -37,10 +37,11 @@ static const union decode_item t32_table_1110_100x_x0xx[] = { DECODE_REJECT (0xfe402000, 0xe8002000), /* STMIA 1110 1000 10x0 xxxx xxxx xxxx xxxx xxxx */ - /* LDMIA 1110 1000 10x1 xxxx xxxx xxxx xxxx xxxx */ /* STMDB 1110 1001 00x0 xxxx xxxx xxxx xxxx xxxx */ + DECODE_CUSTOM (0xfe500000, 0xe8000000, PROBES_T32_STM), + /* LDMIA 1110 1000 10x1 xxxx xxxx xxxx xxxx xxxx */ /* LDMDB 1110 1001 00x1 xxxx xxxx xxxx xxxx xxxx */ - DECODE_CUSTOM (0xfe400000, 0xe8000000, PROBES_T32_LDMSTM), + DECODE_CUSTOM (0xfe500000, 0xe8100000, PROBES_T32_LDM), DECODE_END }; @@ -49,11 +50,15 @@ static const union decode_item t32_table_1110_100x_x1xx[] = { /* Load/store dual, load/store exclusive, table branch */ /* STRD (immediate) 1110 1000 x110 xxxx xxxx xxxx xxxx xxxx */ - /* LDRD (immediate) 1110 1000 x111 xxxx xxxx xxxx xxxx xxxx */ - DECODE_OR (0xff600000, 0xe8600000), + DECODE_OR (0xff700000, 0xe8600000), /* STRD (immediate) 1110 1001 x1x0 xxxx xxxx xxxx xxxx xxxx */ + DECODE_EMULATEX (0xff500000, 0xe9400000, PROBES_T32_STRD, + REGS(NOPCWB, NOSPPC, NOSPPC, 0, 0)), + + /* LDRD (immediate) 1110 1000 x111 xxxx xxxx xxxx xxxx xxxx */ + DECODE_OR (0xff700000, 0xe8700000), /* LDRD (immediate) 1110 1001 x1x1 xxxx xxxx xxxx xxxx xxxx */ - DECODE_EMULATEX (0xff400000, 0xe9400000, PROBES_T32_LDRDSTRD, + DECODE_EMULATEX (0xff500000, 0xe9500000, PROBES_T32_LDRD, REGS(NOPCWB, NOSPPC, NOSPPC, 0, 0)), /* TBB 1110 1000 1101 xxxx xxxx xxxx 0000 xxxx */ @@ -340,16 +345,29 @@ static const union decode_item t32_table_1111_100x[] = { REGS(PC, ANY, 0, 0, 0)), /* STR (immediate) 1111 1000 0100 xxxx xxxx 1xxx xxxx xxxx */ - /* LDR (immediate) 1111 1000 0101 xxxx xxxx 1xxx xxxx xxxx */ - DECODE_OR (0xffe00800, 0xf8400800), + DECODE_OR (0xfff00800, 0xf8400800), /* STR (immediate) 1111 1000 1100 xxxx xxxx xxxx xxxx xxxx */ + /* + * Reject PC for Rt. PC has already rejected by + * 0xff1f0000, 0xf80f0000 and 0xff10f000, 0xf800f000. + * Suppress complain on coverage in test code. + */ + DECODE_EMULATEX (0xfff00000, 0xf8c00000, PROBES_T32_STR, + REGS(NOPCX, NOPCX, 0, 0, 0)), + /* LDR (immediate) 1111 1000 0101 xxxx xxxx 1xxx xxxx xxxx */ + DECODE_OR (0xfff00800, 0xf8500800), /* LDR (immediate) 1111 1000 1101 xxxx xxxx xxxx xxxx xxxx */ - DECODE_EMULATEX (0xffe00000, 0xf8c00000, PROBES_T32_LDRSTR, + DECODE_EMULATEX (0xfff00000, 0xf8d00000, PROBES_T32_LDR, REGS(NOPCX, ANY, 0, 0, 0)), - /* STR (register) 1111 1000 0100 xxxx xxxx 0000 00xx xxxx */ + /* + * Rt == PC and Rn == PC have already been rejected by + * 0xff1f0000, 0xf80f0000 and 0xff10f000, 0xf800f000 + */ + DECODE_EMULATEX (0xfff00fc0, 0xf8400000, PROBES_T32_STR, + REGS(NOPCX, NOPCX, 0, 0, NOSPPC)), /* LDR (register) 1111 1000 0101 xxxx xxxx 0000 00xx xxxx */ - DECODE_EMULATEX (0xffe00fc0, 0xf8400000, PROBES_T32_LDRSTR, + DECODE_EMULATEX (0xfff00fc0, 0xf8500000, PROBES_T32_LDR, REGS(NOPCX, ANY, 0, 0, NOSPPC)), /* LDRB (literal) 1111 1000 x001 1111 xxxx xxxx xxxx xxxx */ @@ -361,27 +379,35 @@ static const union decode_item t32_table_1111_100x[] = { /* STRB (immediate) 1111 1000 0000 xxxx xxxx 1xxx xxxx xxxx */ /* STRH (immediate) 1111 1000 0010 xxxx xxxx 1xxx xxxx xxxx */ + DECODE_OR (0xffd00800, 0xf8000800), + /* STRB (immediate) 1111 1000 1000 xxxx xxxx xxxx xxxx xxxx */ + /* STRH (immediate) 1111 1000 1010 xxxx xxxx xxxx xxxx xxxx */ + DECODE_EMULATEX (0xffd00000, 0xf8800000, PROBES_T32_STR, + REGS(NOPCX, NOSPPCX, 0, 0, 0)), + /* LDRB (immediate) 1111 1000 0001 xxxx xxxx 1xxx xxxx xxxx */ /* LDRSB (immediate) 1111 1001 0001 xxxx xxxx 1xxx xxxx xxxx */ /* LDRH (immediate) 1111 1000 0011 xxxx xxxx 1xxx xxxx xxxx */ /* LDRSH (immediate) 1111 1001 0011 xxxx xxxx 1xxx xxxx xxxx */ - DECODE_OR (0xfec00800, 0xf8000800), - /* STRB (immediate) 1111 1000 1000 xxxx xxxx xxxx xxxx xxxx */ - /* STRH (immediate) 1111 1000 1010 xxxx xxxx xxxx xxxx xxxx */ + DECODE_OR (0xfed00800, 0xf8100800), + /* LDRB (immediate) 1111 1000 1001 xxxx xxxx xxxx xxxx xxxx */ /* LDRSB (immediate) 1111 1001 1001 xxxx xxxx xxxx xxxx xxxx */ /* LDRH (immediate) 1111 1000 1011 xxxx xxxx xxxx xxxx xxxx */ /* LDRSH (immediate) 1111 1001 1011 xxxx xxxx xxxx xxxx xxxx */ - DECODE_EMULATEX (0xfec00000, 0xf8800000, PROBES_T32_LDRSTR, + DECODE_EMULATEX (0xfed00000, 0xf8900000, PROBES_T32_LDR, REGS(NOPCX, NOSPPCX, 0, 0, 0)), /* STRB (register) 1111 1000 0000 xxxx xxxx 0000 00xx xxxx */ /* STRH (register) 1111 1000 0010 xxxx xxxx 0000 00xx xxxx */ + DECODE_EMULATEX (0xffd00fc0, 0xf8000000, PROBES_T32_STR, + REGS(NOPCX, NOSPPCX, 0, 0, NOSPPC)), + /* LDRB (register) 1111 1000 0001 xxxx xxxx 0000 00xx xxxx */ /* LDRSB (register) 1111 1001 0001 xxxx xxxx 0000 00xx xxxx */ /* LDRH (register) 1111 1000 0011 xxxx xxxx 0000 00xx xxxx */ /* LDRSH (register) 1111 1001 0011 xxxx xxxx 0000 00xx xxxx */ - DECODE_EMULATEX (0xfe800fc0, 0xf8000000, PROBES_T32_LDRSTR, + DECODE_EMULATEX (0xfed00fc0, 0xf8100000, PROBES_T32_LDR, REGS(NOPCX, NOSPPCX, 0, 0, NOSPPC)), /* Other unallocated instructions... */ @@ -778,23 +804,34 @@ const union decode_item probes_decode_thumb16_table[] = { /* STR (register) 0101 000x xxxx xxxx */ /* STRH (register) 0101 001x xxxx xxxx */ + DECODE_EMULATE (0xfc00, 0x5000, PROBES_T16_STRH), /* STRB (register) 0101 010x xxxx xxxx */ + DECODE_EMULATE (0xfe00, 0x5400, PROBES_T16_STRH), /* LDRSB (register) 0101 011x xxxx xxxx */ + DECODE_EMULATE (0xfe00, 0x5600, PROBES_T16_LDRH), + /* LDR (register) 0101 100x xxxx xxxx */ /* LDRH (register) 0101 101x xxxx xxxx */ /* LDRB (register) 0101 110x xxxx xxxx */ /* LDRSH (register) 0101 111x xxxx xxxx */ + DECODE_EMULATE (0xf800, 0x5800, PROBES_T16_LDRH), + /* STR (immediate, Thumb) 0110 0xxx xxxx xxxx */ - /* LDR (immediate, Thumb) 0110 1xxx xxxx xxxx */ /* STRB (immediate, Thumb) 0111 0xxx xxxx xxxx */ + DECODE_EMULATE (0xe800, 0x6000, PROBES_T16_STRH), + + /* LDR (immediate, Thumb) 0110 1xxx xxxx xxxx */ /* LDRB (immediate, Thumb) 0111 1xxx xxxx xxxx */ - DECODE_EMULATE (0xc000, 0x4000, PROBES_T16_LDRHSTRH), + DECODE_EMULATE (0xe800, 0x6800, PROBES_T16_LDRH), + /* STRH (immediate, Thumb) 1000 0xxx xxxx xxxx */ + DECODE_EMULATE (0xf800, 0x8000, PROBES_T16_STRH), /* LDRH (immediate, Thumb) 1000 1xxx xxxx xxxx */ - DECODE_EMULATE (0xf000, 0x8000, PROBES_T16_LDRHSTRH), + DECODE_EMULATE (0xf800, 0x8800, PROBES_T16_LDRH), /* STR (immediate, Thumb) 1001 0xxx xxxx xxxx */ + DECODE_SIMULATE (0xf800, 0x9000, PROBES_T16_STR), /* LDR (immediate, Thumb) 1001 1xxx xxxx xxxx */ - DECODE_SIMULATE (0xf000, 0x9000, PROBES_T16_LDRSTR), + DECODE_SIMULATE (0xf800, 0x9800, PROBES_T16_LDR), /* * Generate PC-/SP-relative address @@ -810,8 +847,9 @@ const union decode_item probes_decode_thumb16_table[] = { DECODE_TABLE (0xf000, 0xb000, t16_table_1011), /* STM 1100 0xxx xxxx xxxx */ + DECODE_EMULATE (0xf800, 0xc000, PROBES_T16_STM), /* LDM 1100 1xxx xxxx xxxx */ - DECODE_EMULATE (0xf000, 0xc000, PROBES_T16_LDMSTM), + DECODE_EMULATE (0xf800, 0xc800, PROBES_T16_LDM), /* * Conditional branch, and Supervisor Call diff --git a/arch/arm/kernel/probes-thumb.h b/arch/arm/kernel/probes-thumb.h index 2658d95..a9c65c9 100644 --- a/arch/arm/kernel/probes-thumb.h +++ b/arch/arm/kernel/probes-thumb.h @@ -30,8 +30,10 @@ enum probes_t32_action { PROBES_T32_EMULATE_NONE, PROBES_T32_SIMULATE_NOP, - PROBES_T32_LDMSTM, - PROBES_T32_LDRDSTRD, + PROBES_T32_LDM, + PROBES_T32_STM, + PROBES_T32_LDRD, + PROBES_T32_STRD, PROBES_T32_TABLE_BRANCH, PROBES_T32_TST, PROBES_T32_CMP, @@ -50,7 +52,8 @@ enum probes_t32_action { PROBES_T32_BRANCH, PROBES_T32_PLDI, PROBES_T32_LDR_LIT, - PROBES_T32_LDRSTR, + PROBES_T32_LDR, + PROBES_T32_STR, PROBES_T32_SIGN_EXTEND, PROBES_T32_MEDIA, PROBES_T32_REVERSE, @@ -75,10 +78,13 @@ enum probes_t16_action { PROBES_T16_BLX, PROBES_T16_HIREGOPS, PROBES_T16_LDR_LIT, - PROBES_T16_LDRHSTRH, - PROBES_T16_LDRSTR, + PROBES_T16_LDRH, + PROBES_T16_STRH, + PROBES_T16_LDR, + PROBES_T16_STR, PROBES_T16_ADR, - PROBES_T16_LDMSTM, + PROBES_T16_LDM, + PROBES_T16_STM, PROBES_T16_BRANCH_COND, PROBES_T16_BRANCH, NUM_PROBES_T16_ACTIONS diff --git a/arch/arm/kernel/uprobes-arm.c b/arch/arm/kernel/uprobes-arm.c index 0c0f299..0a8caa3 100644 --- a/arch/arm/kernel/uprobes-arm.c +++ b/arch/arm/kernel/uprobes-arm.c @@ -207,7 +207,8 @@ const struct decode_action uprobes_probes_actions[] = { [PROBES_MUL1] = {.handler = probes_simulate_nop}, [PROBES_MUL2] = {.handler = probes_simulate_nop}, [PROBES_SWP] = {.handler = probes_simulate_nop}, - [PROBES_LDRSTRD] = {.decoder = decode_pc_ro}, + [PROBES_LDRD] = {.decoder = decode_pc_ro}, + [PROBES_STRD] = {.decoder = decode_pc_ro}, [PROBES_LOAD_EXTRA] = {.decoder = decode_pc_ro}, [PROBES_LOAD] = {.decoder = decode_ldr}, [PROBES_STORE_EXTRA] = {.decoder = decode_pc_ro}, @@ -230,5 +231,6 @@ const struct decode_action uprobes_probes_actions[] = { [PROBES_MUL_ADD] = {.handler = probes_simulate_nop}, [PROBES_BITFIELD] = {.handler = probes_simulate_nop}, [PROBES_BRANCH] = {.handler = simulate_bbl}, - [PROBES_LDMSTM] = {.decoder = uprobe_decode_ldmstm} + [PROBES_LDM] = {.decoder = uprobe_decode_ldmstm}, + [PROBES_STM] = {.decoder = uprobe_decode_ldmstm} };