xref: /linux/arch/arm64/include/asm/vdso/getrandom.h (revision 2d7eaeb05ae265bd64270376e6a2c0d80244771f)
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