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