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
do_syscall_3(const unsigned long _r0,const unsigned long _r3,const unsigned long _r4,const unsigned long _r5)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 */
getrandom_syscall(void * buffer,size_t len,unsigned int flags)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
__arch_get_vdso_rng_data(void)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