Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp11389997rwb; Fri, 25 Nov 2022 15:10:28 -0800 (PST) X-Google-Smtp-Source: AA0mqf7vtWWSD/dGqXh1aMOJkJO5lqiPVpMPPvBsjKz3DgcS3AprTtUy7rEtcJfYuVZCekkLgNzw X-Received: by 2002:a17:902:a5cc:b0:186:de87:7ffd with SMTP id t12-20020a170902a5cc00b00186de877ffdmr32827320plq.94.1669417828155; Fri, 25 Nov 2022 15:10:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669417828; cv=none; d=google.com; s=arc-20160816; b=gmv6q6dTo046wdnMwoPG9NR1RpKTJZ1qAE1KKRl2S5j97klZsvCsa7/ldaJ3PZLQD+ cGZqVsAybk6V9ZV12wpPIJU24lOf6UtDslERKsFxJ7rY7ZLX+qkY6ZVDZ1Ys3Se3TFrt 2AaSIjNnrcwGRgU4gbqxrS9Ds8m/4j5EXb3QbQ8rUkuieKKpY8rv20DGFhGnKTql8ONH DKATUuwjyyrg3PWrDt5Nu3XnD9FtpLjfHZrRv2g1qgvmeev0hwLTbp/6wyOH7OQrM6s6 FpV3GiP2PTdn3WaLbDG4xJLYFqPCECBIhz74BWrmz0+0ZegXMUFe7EIEmUy1GJfoniJJ 3ZYw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:message-id:date:references :in-reply-to:subject:cc:to:dkim-signature:dkim-signature:from; bh=6hxW2N4kxmUbACxVJ2sLC2tD7nS+hLHLjTZx7sixZYM=; b=XBWS2IaMFZlvocURweCiJrfOJoZ4g0/0A404LMGbNMBuD8M58FFNI8oRJrzCQYOc9T vihjpoZIYFVMBzhrrx0KfmaBAcG0qcq0Sy9wmpWSPMtOKVeV2p1sy74FCcnx9XV6p7kz BxEGLCAU1aNGIxowC4EQ7xy1Gx824IAGoGwXNQdxaN0w50jt+hhkkXRazWcdP52VpHN3 cDDdL1zPlDADXwx97GdTNbW7IxVaijEFEqO/a4h7zlYMncWA1ivzsmPrTj0VOaLRHRdj OUN0J30LOl3wkHec0QEQJmkgyPmdNPryyPqDJb1SnkH5DCPIFxS6uOzuP1j6LWJFsHug LUMw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=twx8rF2l; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e header.b="/L7yn3LQ"; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 21-20020a170902c21500b001889ad3ed98si4611764pll.462.2022.11.25.15.10.10; Fri, 25 Nov 2022 15:10:28 -0800 (PST) Received-SPF: pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=twx8rF2l; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e header.b="/L7yn3LQ"; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229583AbiKYXIp (ORCPT + 99 others); Fri, 25 Nov 2022 18:08:45 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41726 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229454AbiKYXIp (ORCPT ); Fri, 25 Nov 2022 18:08:45 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1C0FE27B0E; Fri, 25 Nov 2022 15:08:44 -0800 (PST) From: Thomas Gleixner DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1669417722; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=6hxW2N4kxmUbACxVJ2sLC2tD7nS+hLHLjTZx7sixZYM=; b=twx8rF2lsPE6PBtsHMA++brIpc3uCQi+qb0wdSHkIvs7AfFXtCPsY1x4O0PwGnK7QYl3xk YEKB4yBS4owCWRqCu6HHA3uQipm3zAOwBuxDGtLOUy62I+YAfSJ2s0QGVER1uhnz53QaRx cIYqn6gVZRRxAL0cE210J66VCvKCc07xUfjesKnwcgTAW40UYdKANSpfX2Sa765hgXAqzg bLE/eEPyETCs7B2E+0alr7dtdZAKXsHNUDTFUdUlhAiyBU7aCnldKqARjlCUHugS7Ex/Dv sYnIfVSCOkXl4dKQoFyQWUPyBgvugFnN/FLcP6RIvDNeJBNIKkXCX1a5Y5aIjA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1669417722; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=6hxW2N4kxmUbACxVJ2sLC2tD7nS+hLHLjTZx7sixZYM=; b=/L7yn3LQCqK3rKZ4qZRQwSYbwQP7NCTdySqDRR88jr6gFkN+qbUuQYHxLVPWAw4Wh6/QJC 2lFUsr+kgdfqOZBQ== To: "Jason A. Donenfeld" , linux-kernel@vger.kernel.org, patches@lists.linux.dev Cc: "Jason A. Donenfeld" , linux-crypto@vger.kernel.org, linux-api@vger.kernel.org, x86@kernel.org, Greg Kroah-Hartman , Adhemerval Zanella Netto , Carlos O'Donell , Florian Weimer , Arnd Bergmann , Christian Brauner Subject: Re: [PATCH v7 3/3] x86: vdso: Wire up getrandom() vDSO implementation In-Reply-To: <20221124165536.1631325-4-Jason@zx2c4.com> References: <20221124165536.1631325-1-Jason@zx2c4.com> <20221124165536.1631325-4-Jason@zx2c4.com> Date: Sat, 26 Nov 2022 00:08:41 +0100 Message-ID: <874jumy6me.ffs@tglx> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org Jason! On Thu, Nov 24 2022 at 17:55, Jason A. Donenfeld wrote: > +++ b/arch/x86/entry/vdso/vgetrandom-chacha.S > +/* > + * Very basic SSE2 implementation of ChaCha20. Produces a given positive number > + * of blocks of output with a nonce of 0, taking an input key and 8-byte > + * counter. Importantly does not spill to the stack. Its arguments are: Basic or not. This needs a Reviewed-by from someone who understands SSE2 and ChaCha20 before this can go anywhere near the x86 tree. > +++ b/arch/x86/entry/vdso/vgetrandom.c > @@ -0,0 +1,18 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * Copyright (C) 2022 Jason A. Donenfeld . All Rights Reserved. > + */ > +#include Why do you need kernel.h here? > +#include > + > +#include "../../../../lib/vdso/getrandom.c" > + > +ssize_t __vdso_getrandom(void *buffer, size_t len, unsigned int flags, void *state); > + > +ssize_t __vdso_getrandom(void *buffer, size_t len, unsigned int flags, void *state) > +{ > + return __cvdso_getrandom(buffer, len, flags, state); > +} > + > +ssize_t getrandom(void *, size_t, unsigned int, void *) > + __attribute__((weak, alias("__vdso_getrandom"))); > diff --git a/arch/x86/include/asm/vdso/getrandom.h b/arch/x86/include/asm/vdso/getrandom.h > new file mode 100644 > index 000000000000..099aca58ef20 > --- /dev/null > +++ b/arch/x86/include/asm/vdso/getrandom.h > @@ -0,0 +1,49 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) 2022 Jason A. Donenfeld . All Rights Reserved. > + */ > +#ifndef __ASM_VDSO_GETRANDOM_H > +#define __ASM_VDSO_GETRANDOM_H > + > +#ifndef __ASSEMBLY__ > + > +#include > +#include > + > +static __always_inline ssize_t > +getrandom_syscall(void *buffer, size_t len, unsigned int flags) static __always_inline ssize_t getrandom_syscall(void *buffer, size_t len, unsigned int flags) please. We expanded to 100 quite some time ago. Some kernel-doc compliant comment for this would be appreciated as well. > +{ > + long ret; > + > + asm ("syscall" : "=a" (ret) : > + "0" (__NR_getrandom), "D" (buffer), "S" (len), "d" (flags) : > + "rcx", "r11", "memory"); > + > + return ret; > +} > + > +#define __vdso_rng_data (VVAR(_vdso_rng_data)) > + > +static __always_inline const struct vdso_rng_data *__arch_get_vdso_rng_data(void) > +{ > + if (__vdso_data->clock_mode == VDSO_CLOCKMODE_TIMENS) > + return (void *)&__vdso_rng_data + > + ((void *)&__timens_vdso_data - (void *)&__vdso_data); > + return &__vdso_rng_data; So either bite the bullet and write it: if (__vdso_data->clock_mode == VDSO_CLOCKMODE_TIMENS) return (void *)&__vdso_rng_data + ((void *)&__timens_vdso_data - (void *)&__vdso_data); return &__vdso_rng_data; or comply to the well documented rules of the tip tree: https://www.kernel.org/doc/html/latest/process/maintainer-tip.html#bracket-rules > +/* > + * Generates a given positive number of block of ChaCha20 output with nonce=0, > + * and does not write to any stack or memory outside of the parameters passed > + * to it. This way, we don't need to worry about stack data leaking into forked > + * child processes. Please use proper kernel-doc > + */ > +static __always_inline void __arch_chacha20_blocks_nostack(u8 *dst_bytes, const u32 *key, u32 *counter, size_t nblocks) > +{ > + extern void chacha20_blocks_nostack(u8 *dst_bytes, const u32 *key, u32 *counter, size_t nblocks); > + return chacha20_blocks_nostack(dst_bytes, key, counter, nblocks); You surely have an issue with your newline key... The above aside, can you please explain the value of this __arch_() wrapper? It's just voodoo for no value because it hands through the arguments 1:1. So where are you expecting that that __arch...() version of this is any different than invoking the architecture specific version of chacha20_blocks_nostack(). Can you spot the irony of your naming choices? __arch_chacha20_blocks_nostack() { return chacha20_blocks_nostack() }; Thanks, tglx