Messages in this thread | | | From | Thomas Gleixner <> | Subject | Re: [PATCH v7 3/3] x86: vdso: Wire up getrandom() vDSO implementation | Date | Sat, 26 Nov 2022 00:08:41 +0100 |
| |
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@zx2c4.com>. 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@zx2c4.com>. 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
| |