diff options
Diffstat (limited to 'src/runtime/sys_linux_loong64.s')
| -rw-r--r-- | src/runtime/sys_linux_loong64.s | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/runtime/sys_linux_loong64.s b/src/runtime/sys_linux_loong64.s index eba8e1f24c..0a25d56047 100644 --- a/src/runtime/sys_linux_loong64.s +++ b/src/runtime/sys_linux_loong64.s @@ -657,3 +657,46 @@ TEXT runtime·socket(SB),$0-20 MOVV R0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go MOVW R0, ret+16(FP) // for vet RET + +// func vgetrandom1(buf *byte, length uintptr, flags uint32, state uintptr, stateSize uintptr) int +TEXT runtime·vgetrandom1<ABIInternal>(SB),NOSPLIT,$16-48 + MOVV R3, R23 + + MOVV runtime·vdsoGetrandomSym(SB), R12 + + MOVV g_m(g), R24 + + MOVV m_vdsoPC(R24), R13 + MOVV R13, 8(R3) + MOVV m_vdsoSP(R24), R13 + MOVV R13, 16(R3) + MOVV R1, m_vdsoPC(R24) + MOVV $buf-8(FP), R13 + MOVV R13, m_vdsoSP(R24) + + AND $~15, R3 + + MOVBU runtime·iscgo(SB), R13 + BNE R13, nosaveg + MOVV m_gsignal(R24), R13 + BEQ R13, nosaveg + BEQ g, R13, nosaveg + MOVV (g_stack+stack_lo)(R13), R25 + MOVV g, (R25) + + JAL (R12) + + MOVV R0, (R25) + JMP restore + +nosaveg: + JAL (R12) + +restore: + MOVV R23, R3 + MOVV 16(R3), R25 + MOVV R25, m_vdsoSP(R24) + MOVV 8(R3), R25 + MOVV R25, m_vdsoPC(R24) + NOP R4 // Satisfy go vet, since the return value comes from the vDSO function. + RET |
