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   */
getrandom_syscall(void * buffer,size_t len,unsigned int flags)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  
__arch_get_vdso_rng_data(void)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