xref: /linux/arch/riscv/include/asm/vdso/getrandom.h (revision 119b1e61a769aa98e68599f44721661a4d8c55f3)
1*ee0d0305SXi Ruoyao /* SPDX-License-Identifier: GPL-2.0-only */
2*ee0d0305SXi Ruoyao /*
3*ee0d0305SXi Ruoyao  * Copyright (C) 2025 Xi Ruoyao <xry111@xry111.site>. All Rights Reserved.
4*ee0d0305SXi Ruoyao  */
5*ee0d0305SXi Ruoyao #ifndef __ASM_VDSO_GETRANDOM_H
6*ee0d0305SXi Ruoyao #define __ASM_VDSO_GETRANDOM_H
7*ee0d0305SXi Ruoyao 
8*ee0d0305SXi Ruoyao #ifndef __ASSEMBLY__
9*ee0d0305SXi Ruoyao 
10*ee0d0305SXi Ruoyao #include <asm/unistd.h>
11*ee0d0305SXi Ruoyao 
getrandom_syscall(void * _buffer,size_t _len,unsigned int _flags)12*ee0d0305SXi Ruoyao static __always_inline ssize_t getrandom_syscall(void *_buffer, size_t _len, unsigned int _flags)
13*ee0d0305SXi Ruoyao {
14*ee0d0305SXi Ruoyao 	register long ret asm("a0");
15*ee0d0305SXi Ruoyao 	register long nr asm("a7") = __NR_getrandom;
16*ee0d0305SXi Ruoyao 	register void *buffer asm("a0") = _buffer;
17*ee0d0305SXi Ruoyao 	register size_t len asm("a1") = _len;
18*ee0d0305SXi Ruoyao 	register unsigned int flags asm("a2") = _flags;
19*ee0d0305SXi Ruoyao 
20*ee0d0305SXi Ruoyao 	asm volatile ("ecall\n"
21*ee0d0305SXi Ruoyao 		      : "+r" (ret)
22*ee0d0305SXi Ruoyao 		      : "r" (nr), "r" (buffer), "r" (len), "r" (flags)
23*ee0d0305SXi Ruoyao 		      : "memory");
24*ee0d0305SXi Ruoyao 
25*ee0d0305SXi Ruoyao 	return ret;
26*ee0d0305SXi Ruoyao }
27*ee0d0305SXi Ruoyao 
28*ee0d0305SXi Ruoyao #endif /* !__ASSEMBLY__ */
29*ee0d0305SXi Ruoyao 
30*ee0d0305SXi Ruoyao #endif /* __ASM_VDSO_GETRANDOM_H */
31