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 <Jason@xxxxxxxxx>. All Rights Reserved. > + */ > +#include <linux/kernel.h> Why do you need kernel.h here? > +#include <linux/types.h> > + > +#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 <Jason@xxxxxxxxx>. All Rights Reserved. > + */ > +#ifndef __ASM_VDSO_GETRANDOM_H > +#define __ASM_VDSO_GETRANDOM_H > + > +#ifndef __ASSEMBLY__ > + > +#include <asm/unistd.h> > +#include <asm/vvar.h> > + > +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