]> www.infradead.org Git - users/jedix/linux-maple.git/commit
s390/vdso: Wire up getrandom() vdso implementation
authorHeiko Carstens <hca@linux.ibm.com>
Fri, 13 Sep 2024 13:05:43 +0000 (15:05 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Fri, 13 Sep 2024 18:57:31 +0000 (20:57 +0200)
commitb920aa77be6d57d407b6b6be5d8b4ccc17749cce
tree4a2b8ba53fe08e93d92220c7b23624173f473f0a
parentc1ae1b4ef5bf541c71ced84d087abed029f13b1a
s390/vdso: Wire up getrandom() vdso implementation

Provide the s390 specific vdso getrandom() architecture backend.

_vdso_rng_data required data is placed within the _vdso_data vvar page,
by using a hardcoded offset larger than vdso_data.

As required the chacha20 implementation does not write to the stack.

The implementation follows more or less the arm64 implementations and
makes use of vector instructions. It has a fallback to the getrandom()
system call for machines where the vector facility is not installed.

The check if the vector facility is installed, as well as an
optimization for machines with the vector-enhancements facility 2, is
implemented with alternatives, avoiding runtime checks.

Note that __kernel_getrandom() is implemented without the vdso user
wrapper which would setup a stack frame for odd cases (aka very old
glibc variants) where the caller has not done that. All callers of
__kernel_getrandom() are required to setup a stack frame, like the C ABI
requires it.

The vdso testcases vdso_test_getrandom and vdso_test_chacha pass.

Benchmark on a z16:

    $ ./vdso_test_getrandom bench-single
       vdso: 25000000 times in 0.493703559 seconds
    syscall: 25000000 times in 6.584025337 seconds

Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Reviewed-by: Harald Freudenberger <freude@linux.ibm.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
12 files changed:
arch/s390/Kconfig
arch/s390/include/asm/fpu-insn-asm.h
arch/s390/include/asm/vdso/getrandom.h [new file with mode: 0644]
arch/s390/include/asm/vdso/vsyscall.h
arch/s390/kernel/vdso.c
arch/s390/kernel/vdso64/Makefile
arch/s390/kernel/vdso64/vdso.h
arch/s390/kernel/vdso64/vdso64.lds.S
arch/s390/kernel/vdso64/vgetrandom-chacha.S [new file with mode: 0644]
arch/s390/kernel/vdso64/vgetrandom.c [new file with mode: 0644]
tools/arch/s390/vdso [new symlink]
tools/testing/selftests/vDSO/Makefile