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