1 /* SPDX-License-Identifier: GPL-2.0 */ 2 3 #ifndef __ASM_VDSO_GETRANDOM_H 4 #define __ASM_VDSO_GETRANDOM_H 5 6 #ifndef __ASSEMBLER__ 7 8 #include <asm/unistd.h> 9 #include <vdso/datapage.h> 10 11 /** 12 * getrandom_syscall - Invoke the getrandom() syscall. 13 * @buffer: Destination buffer to fill with random bytes. 14 * @len: Size of @buffer in bytes. 15 * @flags: Zero or more GRND_* flags. 16 * Returns: The number of random bytes written to @buffer, or a negative value indicating an error. 17 */ 18 static __always_inline ssize_t getrandom_syscall(void *_buffer, size_t _len, unsigned int _flags) 19 { 20 register void *buffer asm ("x0") = _buffer; 21 register size_t len asm ("x1") = _len; 22 register unsigned int flags asm ("x2") = _flags; 23 register long ret asm ("x0"); 24 register long nr asm ("x8") = __NR_getrandom; 25 26 asm volatile( 27 " svc #0\n" 28 : "=r" (ret) 29 : "r" (buffer), "r" (len), "r" (flags), "r" (nr) 30 : "memory"); 31 32 return ret; 33 } 34 35 #endif /* !__ASSEMBLER__ */ 36 37 #endif /* __ASM_VDSO_GETRANDOM_H */ 38