From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1424621AbcFMPXH (ORCPT ); Mon, 13 Jun 2016 11:23:07 -0400 Received: from mail-qk0-f171.google.com ([209.85.220.171]:35488 "EHLO mail-qk0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1424293AbcFMPXD (ORCPT ); Mon, 13 Jun 2016 11:23:03 -0400 Subject: Re: [PATCH v13 05/10] arm64: Kprobes with single stepping support To: Masami Hiramatsu References: <1464924384-15269-1-git-send-email-dave.long@linaro.org> <1464924384-15269-6-git-send-email-dave.long@linaro.org> <20160608100714.4abbcebcf356eb72173d0ce3@kernel.org> <575E3235.1020904@linaro.org> <20160613155017.860097875e8bc86563a065ce@kernel.org> Cc: Catalin Marinas , Huang Shijie , James Morse , Marc Zyngier , Pratyush Anand , Sandeepa Prabhu , Will Deacon , William Cohen , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Steve Capper , Li Bin , Adam Buchbinder , =?UTF-8?Q?Alex_Benn=c3=a9e?= , Andrew Morton , Andrey Ryabinin , Ard Biesheuvel , Christoffer Dall , Daniel Thompson , Dave P Martin , Jens Wiklander , Jisheng Zhang , John Blackwood , Mark Rutland , Petr Mladek , Robin Murphy , Suzuki K Poulose , Vladimir Murzin , Yang Shi , Zi Shen Lim , yalin wang , Mark Brown From: David Long Message-ID: <575ECFC7.10207@linaro.org> Date: Mon, 13 Jun 2016 11:22:47 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 In-Reply-To: <20160613155017.860097875e8bc86563a065ce@kernel.org> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 06/13/2016 02:50 AM, Masami Hiramatsu wrote: > On Mon, 13 Jun 2016 00:10:29 -0400 > David Long wrote: > >>>> --- >>>> arch/arm64/Kconfig | 1 + >>>> arch/arm64/include/asm/debug-monitors.h | 5 + >>>> arch/arm64/include/asm/insn.h | 4 +- >>>> arch/arm64/include/asm/kprobes.h | 60 ++++ >>>> arch/arm64/include/asm/probes.h | 44 +++ >>>> arch/arm64/kernel/Makefile | 1 + >>>> arch/arm64/kernel/debug-monitors.c | 18 +- >>>> arch/arm64/kernel/kprobes-arm64.c | 144 +++++++++ >>>> arch/arm64/kernel/kprobes-arm64.h | 35 +++ >>>> arch/arm64/kernel/kprobes.c | 526 ++++++++++++++++++++++++++++++++ >>> >>> Not sure why kprobes.c and kprobes-arm64.c are splitted. >>> >>> >> >> This comes from the model of the arm32 kprobes code where handling of >> the low-level instruction simulation is implemented in separate files >> for 32-bit vs. thumb instructions. It should make a little more sense >> in the future when additional instruction simulation code will hopefully >> be added for those instructions we cannot currently single-step >> out-of-line. It also probably *could* be merged into one file. > > Hmm, at least the name of arch/arm64/kernel/kprobes-arm64.c is > meaningless. As we've done in x86, I think we can make it > arch/arm64/kernel/kprobes/decode-insn.{c,h} > I've changed the name to kprobe-decode-insn.[hc], or do you feel strongly the three kprobes source files in arch/arm64/kernel need their own subdirectory? > > [..] >>>> + >>>> +/* Return: >>>> + * INSN_REJECTED If instruction is one not allowed to kprobe, >>>> + * INSN_GOOD If instruction is supported and uses instruction slot, >>>> + * INSN_GOOD_NO_SLOT If instruction is supported but doesn't use its slot. >>> >>> Is there any chance to return INSN_GOOD_NO_SLOT? >>> >> >> Ah, that gets used later when simulation support is added. I've removed >> this enum value from this commit and will add it to the later one. >> Please no one complain about using an enum instead of a bool, it will >> eventually have three possible values. > > OK :) > > [..] >>>> +enum kprobe_insn __kprobes >>>> +arm_kprobe_decode_insn(kprobe_opcode_t *addr, struct arch_specific_insn *asi) >>>> +{ >>>> + enum kprobe_insn decoded; >>>> + kprobe_opcode_t insn = le32_to_cpu(*addr); >>>> + kprobe_opcode_t *scan_start = addr - 1; >>>> + kprobe_opcode_t *scan_end = addr - MAX_ATOMIC_CONTEXT_SIZE; >>>> +#if defined(CONFIG_MODULES) && defined(MODULES_VADDR) >>>> + struct module *mod; >>>> +#endif >>>> + >>>> + if (addr >= (kprobe_opcode_t *)_text && >>>> + scan_end < (kprobe_opcode_t *)_text) >>>> + scan_end = (kprobe_opcode_t *)_text; >>>> +#if defined(CONFIG_MODULES) && defined(MODULES_VADDR) >>>> + else { >>>> + preempt_disable(); >>>> + mod = __module_address((unsigned long)addr); >>>> + if (mod && within_module_init((unsigned long)addr, mod) && >>>> + !within_module_init((unsigned long)scan_end, mod)) >>>> + scan_end = (kprobe_opcode_t *)mod->init_layout.base; >>>> + else if (mod && within_module_core((unsigned long)addr, mod) && >>>> + !within_module_core((unsigned long)scan_end, mod)) >>>> + scan_end = (kprobe_opcode_t *)mod->core_layout.base; >>> >>> What happen if mod == NULL? it should be return error, isn't it? >>> >> >> No, it should be fine. It just means it didn't have to do either of the >> extra checks to limit the end of the search through the code to the >> boundary of one of the corresponding module text sections. It means the >> instruction is in the regular kernel (non-module) text segment. > > Ah, I see. It is OK then. :) > > Thank you, > > Thanks, -dl From mboxrd@z Thu Jan 1 00:00:00 1970 From: dave.long@linaro.org (David Long) Date: Mon, 13 Jun 2016 11:22:47 -0400 Subject: [PATCH v13 05/10] arm64: Kprobes with single stepping support In-Reply-To: <20160613155017.860097875e8bc86563a065ce@kernel.org> References: <1464924384-15269-1-git-send-email-dave.long@linaro.org> <1464924384-15269-6-git-send-email-dave.long@linaro.org> <20160608100714.4abbcebcf356eb72173d0ce3@kernel.org> <575E3235.1020904@linaro.org> <20160613155017.860097875e8bc86563a065ce@kernel.org> Message-ID: <575ECFC7.10207@linaro.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 06/13/2016 02:50 AM, Masami Hiramatsu wrote: > On Mon, 13 Jun 2016 00:10:29 -0400 > David Long wrote: > >>>> --- >>>> arch/arm64/Kconfig | 1 + >>>> arch/arm64/include/asm/debug-monitors.h | 5 + >>>> arch/arm64/include/asm/insn.h | 4 +- >>>> arch/arm64/include/asm/kprobes.h | 60 ++++ >>>> arch/arm64/include/asm/probes.h | 44 +++ >>>> arch/arm64/kernel/Makefile | 1 + >>>> arch/arm64/kernel/debug-monitors.c | 18 +- >>>> arch/arm64/kernel/kprobes-arm64.c | 144 +++++++++ >>>> arch/arm64/kernel/kprobes-arm64.h | 35 +++ >>>> arch/arm64/kernel/kprobes.c | 526 ++++++++++++++++++++++++++++++++ >>> >>> Not sure why kprobes.c and kprobes-arm64.c are splitted. >>> >>> >> >> This comes from the model of the arm32 kprobes code where handling of >> the low-level instruction simulation is implemented in separate files >> for 32-bit vs. thumb instructions. It should make a little more sense >> in the future when additional instruction simulation code will hopefully >> be added for those instructions we cannot currently single-step >> out-of-line. It also probably *could* be merged into one file. > > Hmm, at least the name of arch/arm64/kernel/kprobes-arm64.c is > meaningless. As we've done in x86, I think we can make it > arch/arm64/kernel/kprobes/decode-insn.{c,h} > I've changed the name to kprobe-decode-insn.[hc], or do you feel strongly the three kprobes source files in arch/arm64/kernel need their own subdirectory? > > [..] >>>> + >>>> +/* Return: >>>> + * INSN_REJECTED If instruction is one not allowed to kprobe, >>>> + * INSN_GOOD If instruction is supported and uses instruction slot, >>>> + * INSN_GOOD_NO_SLOT If instruction is supported but doesn't use its slot. >>> >>> Is there any chance to return INSN_GOOD_NO_SLOT? >>> >> >> Ah, that gets used later when simulation support is added. I've removed >> this enum value from this commit and will add it to the later one. >> Please no one complain about using an enum instead of a bool, it will >> eventually have three possible values. > > OK :) > > [..] >>>> +enum kprobe_insn __kprobes >>>> +arm_kprobe_decode_insn(kprobe_opcode_t *addr, struct arch_specific_insn *asi) >>>> +{ >>>> + enum kprobe_insn decoded; >>>> + kprobe_opcode_t insn = le32_to_cpu(*addr); >>>> + kprobe_opcode_t *scan_start = addr - 1; >>>> + kprobe_opcode_t *scan_end = addr - MAX_ATOMIC_CONTEXT_SIZE; >>>> +#if defined(CONFIG_MODULES) && defined(MODULES_VADDR) >>>> + struct module *mod; >>>> +#endif >>>> + >>>> + if (addr >= (kprobe_opcode_t *)_text && >>>> + scan_end < (kprobe_opcode_t *)_text) >>>> + scan_end = (kprobe_opcode_t *)_text; >>>> +#if defined(CONFIG_MODULES) && defined(MODULES_VADDR) >>>> + else { >>>> + preempt_disable(); >>>> + mod = __module_address((unsigned long)addr); >>>> + if (mod && within_module_init((unsigned long)addr, mod) && >>>> + !within_module_init((unsigned long)scan_end, mod)) >>>> + scan_end = (kprobe_opcode_t *)mod->init_layout.base; >>>> + else if (mod && within_module_core((unsigned long)addr, mod) && >>>> + !within_module_core((unsigned long)scan_end, mod)) >>>> + scan_end = (kprobe_opcode_t *)mod->core_layout.base; >>> >>> What happen if mod == NULL? it should be return error, isn't it? >>> >> >> No, it should be fine. It just means it didn't have to do either of the >> extra checks to limit the end of the search through the code to the >> boundary of one of the corresponding module text sections. It means the >> instruction is in the regular kernel (non-module) text segment. > > Ah, I see. It is OK then. :) > > Thank you, > > Thanks, -dl