xref: /linux/arch/loongarch/include/asm/vdso/getrandom.h (revision ab93e0dd72c37d378dd936f031ffb83ff2bd87ce)
118efd0b1SXi Ruoyao // SPDX-License-Identifier: GPL-2.0-only
218efd0b1SXi Ruoyao /*
318efd0b1SXi Ruoyao  * Copyright (C) 2024 Xi Ruoyao <xry111@xry111.site>. All Rights Reserved.
418efd0b1SXi Ruoyao  */
518efd0b1SXi Ruoyao #ifndef __ASM_VDSO_GETRANDOM_H
618efd0b1SXi Ruoyao #define __ASM_VDSO_GETRANDOM_H
718efd0b1SXi Ruoyao 
818efd0b1SXi Ruoyao #ifndef __ASSEMBLER__
918efd0b1SXi Ruoyao 
1018efd0b1SXi Ruoyao #include <asm/unistd.h>
1118efd0b1SXi Ruoyao #include <asm/vdso/vdso.h>
1218efd0b1SXi Ruoyao 
getrandom_syscall(void * _buffer,size_t _len,unsigned int _flags)1318efd0b1SXi Ruoyao static __always_inline ssize_t getrandom_syscall(void *_buffer, size_t _len, unsigned int _flags)
1418efd0b1SXi Ruoyao {
1518efd0b1SXi Ruoyao 	register long ret asm("a0");
1618efd0b1SXi Ruoyao 	register long nr asm("a7") = __NR_getrandom;
1718efd0b1SXi Ruoyao 	register void *buffer asm("a0") = _buffer;
1818efd0b1SXi Ruoyao 	register size_t len asm("a1") = _len;
1918efd0b1SXi Ruoyao 	register unsigned int flags asm("a2") = _flags;
2018efd0b1SXi Ruoyao 
2118efd0b1SXi Ruoyao 	asm volatile(
2218efd0b1SXi Ruoyao 	"      syscall 0\n"
23*e242bbbbSThomas Weißschuh 	: "=r" (ret)
2418efd0b1SXi Ruoyao 	: "r" (nr), "r" (buffer), "r" (len), "r" (flags)
2518efd0b1SXi Ruoyao 	: "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8",
2618efd0b1SXi Ruoyao 	  "memory");
2718efd0b1SXi Ruoyao 
2818efd0b1SXi Ruoyao 	return ret;
2918efd0b1SXi Ruoyao }
3018efd0b1SXi Ruoyao 
3118efd0b1SXi Ruoyao #endif /* !__ASSEMBLER__ */
3218efd0b1SXi Ruoyao 
3318efd0b1SXi Ruoyao #endif /* __ASM_VDSO_GETRANDOM_H */
34