lkml.org 
[lkml]   [2022]   [Nov]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [PATCH v7 3/3] x86: vdso: Wire up getrandom() vDSO implementation
    Date
    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

    \
     
     \ /
      Last update: 2022-11-26 00:09    [W:4.929 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site