1 /* SPDX-License-Identifier: GPL-2.0 */ 2 3 #ifndef __ASM_VDSO_GETRANDOM_H 4 #define __ASM_VDSO_GETRANDOM_H 5 6 #ifndef __ASSEMBLY__ 7 8 #include <vdso/datapage.h> 9 #include <asm/vdso/vsyscall.h> 10 #include <asm/syscall.h> 11 #include <asm/unistd.h> 12 #include <asm/page.h> 13 14 /** 15 * getrandom_syscall - Invoke the getrandom() syscall. 16 * @buffer: Destination buffer to fill with random bytes. 17 * @len: Size of @buffer in bytes. 18 * @flags: Zero or more GRND_* flags. 19 * Returns: The number of random bytes written to @buffer, or a negative value indicating an error. 20 */ 21 static __always_inline ssize_t getrandom_syscall(void *buffer, size_t len, unsigned int flags) 22 { 23 return syscall3(__NR_getrandom, (long)buffer, (long)len, (long)flags); 24 } 25 26 static __always_inline const struct vdso_rng_data *__arch_get_vdso_rng_data(void) 27 { 28 /* 29 * The RNG data is in the real VVAR data page, but if a task belongs to a time namespace 30 * then VVAR_DATA_PAGE_OFFSET points to the namespace-specific VVAR page and VVAR_TIMENS_ 31 * PAGE_OFFSET points to the real VVAR page. 32 */ 33 if (IS_ENABLED(CONFIG_TIME_NS) && _vdso_data->clock_mode == VDSO_CLOCKMODE_TIMENS) 34 return (void *)&_vdso_rng_data + VVAR_TIMENS_PAGE_OFFSET * PAGE_SIZE; 35 return &_vdso_rng_data; 36 } 37 38 #endif /* !__ASSEMBLY__ */ 39 40 #endif /* __ASM_VDSO_GETRANDOM_H */ 41