Path: csiph.com!aioe.org!bofh.it!news.nic.it!robomod From: Daniel Thompson Newsgroups: linux.kernel Subject: Re: [PATCH v15 04/10] arm64: Kprobes with single stepping support Date: Fri, 29 Jul 2016 11:10:01 +0200 Message-ID: References: Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=NfbO1mY6i4P/LE40kEnNGM8h05THBnIkDRcnA4bYaXg=; b=k0iRhKD0Pd1f4cIKOHZQ2OzdNbyzihYmX3kPOfxo+qddEdwPH7j7cqrEasw7ioItBd KOl0Ntn6TW75A6p9P5YleJKjuBuvSZznOF6iwgygytLcVI7y+Xj2BhA3yYrPaI0TPhIQ OPWhEyd4YZ9nZaY67L0DyF3sPhSvCRJMdp0Qg= X-Google-Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=NfbO1mY6i4P/LE40kEnNGM8h05THBnIkDRcnA4bYaXg=; b=Ca/nkmW91T9BYWu8a7hglYoCQ8U/1C3CnqugQy8Js18U+v2uEU2agV1/rVCWX+8+Op StV1DaD/q9c1ohX783jd/PBKfCpYlMQl+NgnymFg2g2APnadF48foS1fEZKP9XEpiYRj vfVtkGWUc/vgXMGhddcwNiK9dFDMYv10c4FJpBPC2WKELEnGsV9YYLxUgnXqr5Nac0i4 CYfiegTNZKCFYPRfdteWcCnpfdx+eeXOOAS00FnRIMbIQ99r+ANwuM+WJ5M0in+sSkqZ Izq/TISJtwtJEZkmscNK2gur1ERO4Cs4zurEFjPtrF5ePYmzfQlM08mDameU0cTM7eeM X7xA== X-Gm-Message-State: AEkoouv4YMmwc8GCOkLjp1AcqUYBfPaJqF/zxlVrobG5HtTkB+m3dtqTQjuQOiB4jbzz2goH X-Received: by 10.194.110.229 with SMTP id id5mr41318973wjb.23.1469782865720; Fri, 29 Jul 2016 02:01:05 -0700 (PDT) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 MIME-Version: 1.0 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: robomod@news.nic.it List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Approved: robomod@news.nic.it Lines: 94 Organization: linux.* mail to news gateway X-Original-Cc: Mark Rutland , Yang Shi , Zi Shen Lim , Will Deacon , Andrey Ryabinin , yalin wang , Li Bin , Jisheng Zhang , John Blackwood , Pratyush Anand , Huang Shijie , Dave P Martin , Petr Mladek , Vladimir Murzin , Steve Capper , Suzuki K Poulose , Marc Zyngier , Mark Brown , Sandeepa Prabhu , William Cohen , =?UTF-8?Q?Alex_Benn=c3=a9e?= , Adam Buchbinder , linux-arm-kernel@lists.infradead.org, Ard Biesheuvel , linux-kernel@vger.kernel.org, James Morse , Masami Hiramatsu , Andrew Morton , Robin Murphy , Jens Wiklander , Christoffer Dall X-Original-Date: Fri, 29 Jul 2016 10:01:02 +0100 X-Original-Message-ID: <360d582b-5401-7126-ef40-bd78369c0a34@linaro.org> X-Original-References: <578FA238.3050206@arm.com> <5790F960.5050007@linaro.org> <57910528.7070902@arm.com> <57911590.50305@linaro.org> <20160722101617.GA17821@e104818-lin.cambridge.arm.com> <57924104.1080202@linaro.org> <20160725171350.GE2423@e104818-lin.cambridge.arm.com> <57969234.1070201@linaro.org> <22b277ba-6812-a0dd-9e8e-c29bdb3aa672@linaro.org> <57993211.1040600@linaro.org> <20160728144053.GA26510@e104818-lin.cambridge.arm.com> X-Original-Sender: linux-kernel-owner@vger.kernel.org Xref: csiph.com linux.kernel:1452335 On 28/07/16 15:40, Catalin Marinas wrote: > On Wed, Jul 27, 2016 at 06:13:37PM -0400, David Long wrote: >> On 07/27/2016 07:50 AM, Daniel Thompson wrote: >>> On 25/07/16 23:27, David Long wrote: >>>> On 07/25/2016 01:13 PM, Catalin Marinas wrote: >>>>> The problem is that the original design was done on x86 for its PCS and >>>>> it doesn't always fit other architectures. So we could either ignore the >>>>> problem, hoping that no probed function requires argument passing on >>>>> stack or we copy all the valid data on the kernel stack: >>>>> >>>>> diff --git a/arch/arm64/include/asm/kprobes.h >>>>> b/arch/arm64/include/asm/kprobes.h >>>>> index 61b49150dfa3..157fd0d0aa08 100644 >>>>> --- a/arch/arm64/include/asm/kprobes.h >>>>> +++ b/arch/arm64/include/asm/kprobes.h >>>>> @@ -22,7 +22,7 @@ >>>>> >>>>> #define __ARCH_WANT_KPROBES_INSN_SLOT >>>>> #define MAX_INSN_SIZE 1 >>>>> -#define MAX_STACK_SIZE 128 >>>>> +#define MAX_STACK_SIZE THREAD_SIZE >>>>> >>>>> #define flush_insn_slot(p) do { } while (0) >>>>> #define kretprobe_blacklist_size 0 >>>> >>>> I doubt the ARM PCS is unusual. At any rate I'm certain there are other >>>> architectures that pass aggregate parameters on the stack. I suspect >>>> other RISC(-ish) architectures have similar PCS issues and I think this >>>> is at least a big part of where this simple copy with a 64/128 limit >>>> comes from, or at least why it continues to exist. That said, I'm not >>>> enthusiastic about researching that assertion in detail as it could be >>>> time consuming. >>> >>> Given Mark shared a test program I *was* curious enough to take a look >>> at this. >>> >>> The only architecture I can find that behaves like arm64 with the >>> implicit pass-by-reference described by Catalin/Mark is sparc64. >>> >>> In contrast alpha, arm (32-bit), hppa64, mips64 and powerpc64 all use a >>> hybrid approach where the first fragments of the structure are passed in >>> registers and the remainder on the stack. >> >> That's interesting. It also looks like sparc64 does not copy any stack for >> jprobes. I guess that approach at least makes it clear what will and won't >> work. > > I suggest we do the same for arm64 - avoid the copying entirely as it's > not safe anyway. We don't know how much to copy, nor can we be sure it > is safe (see Dave's DMA to the stack example). This would need to be > documented in the kprobes.txt file and MAX_STACK_SIZE removed from the > arm64 kprobes support. > > There is also the case that Daniel was talking about - passing more than > 8 arguments. I don't think it's worth handling this Its actually quite hard to document the (architecture specific) "no big structures" *and* the "8 argument" limits. It ends up as something like: Structures/unions >16 bytes must not be passed by value and the size of all arguments, after padding each to an 8 byte boundary, must be less than 64 bytes. We cannot avoid tackling big structures through documentation but when we impose additional limits like "only 8 arguments" we are swapping an architecture neutral "gotcha" that affects almost all jprobes uses (and can be inferred from the documentation) with an architecture specific one! > but we should at > least add a warning and skip the probe: > > diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c > index bf9768588288..84e02606ec3d 100644 > --- a/arch/arm64/kernel/probes/kprobes.c > +++ b/arch/arm64/kernel/probes/kprobes.c > @@ -491,6 +491,10 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) > struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); > long stack_ptr = kernel_stack_pointer(regs); > > + /* do not allow arguments passed on the stack */ > + if (WARN_ON_ONCE(regs->sp != regs->regs[29])) > + return 0; > + I don't really understand this test. If we could reliably assume that the frame record was at the lowest address within a stack frame then we could exploit that to store the stacked arguments without risking overwriting volatile variables on the stack. Daniel.