xref: /linux/arch/powerpc/include/asm/vdso/getrandom.h (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2024 Christophe Leroy <christophe.leroy@csgroup.eu>, CS GROUP France
4  */
5 #ifndef _ASM_POWERPC_VDSO_GETRANDOM_H
6 #define _ASM_POWERPC_VDSO_GETRANDOM_H
7 
8 #ifndef __ASSEMBLY__
9 
10 static __always_inline int do_syscall_3(const unsigned long _r0, const unsigned long _r3,
11 					const unsigned long _r4, const unsigned long _r5)
12 {
13 	register long r0 asm("r0") = _r0;
14 	register unsigned long r3 asm("r3") = _r3;
15 	register unsigned long r4 asm("r4") = _r4;
16 	register unsigned long r5 asm("r5") = _r5;
17 	register int ret asm ("r3");
18 
19 	asm volatile(
20 		"       sc\n"
21 		"	bns+	1f\n"
22 		"	neg	%0, %0\n"
23 		"1:\n"
24 	: "=r" (ret), "+r" (r4), "+r" (r5), "+r" (r0)
25 	: "r" (r3)
26 	: "memory", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cr0", "ctr");
27 
28 	return ret;
29 }
30 
31 /**
32  * getrandom_syscall - Invoke the getrandom() syscall.
33  * @buffer:	Destination buffer to fill with random bytes.
34  * @len:	Size of @buffer in bytes.
35  * @flags:	Zero or more GRND_* flags.
36  * Returns:	The number of bytes written to @buffer, or a negative value indicating an error.
37  */
38 static __always_inline ssize_t getrandom_syscall(void *buffer, size_t len, unsigned int flags)
39 {
40 	return do_syscall_3(__NR_getrandom, (unsigned long)buffer,
41 			    (unsigned long)len, (unsigned long)flags);
42 }
43 
44 static __always_inline struct vdso_rng_data *__arch_get_vdso_rng_data(void)
45 {
46 	return NULL;
47 }
48 
49 ssize_t __c_kernel_getrandom(void *buffer, size_t len, unsigned int flags, void *opaque_state,
50 			     size_t opaque_len, const struct vdso_rng_data *vd);
51 
52 #endif /* !__ASSEMBLY__ */
53 
54 #endif /* _ASM_POWERPC_VDSO_GETRANDOM_H */
55