RET
// func walltime() (sec int64, nsec int32)
-TEXT runtime·walltime(SB),NOSPLIT,$16
- MOVW $0, R2 // CLOCK_REALTIME
+TEXT runtime·walltime(SB),NOSPLIT,$32-12
+ MOVW $0, R2 // CLOCK_REALTIME
+ MOVD R15, R7 // Backup stack pointer
+
+ MOVD g_m(g), R6 //m
+
+ MOVD runtime·vdsoClockgettimeSym(SB), R9 // Check for VDSO availability
+ CMPBEQ R9, $0, fallback
+
+ MOVD m_vdsoPC(R6), R4
+ MOVD R4, 16(R15)
+ MOVD m_vdsoSP(R6), R4
+ MOVD R4, 24(R15)
+
+ MOVD R14, R8 // Backup return address
+ MOVD $sec+0(FP), R4 // return parameter caller
+
+ MOVD R8, m_vdsoPC(R6)
+ MOVD R4, m_vdsoSP(R6)
+
+ MOVD m_curg(R6), R5
+ CMP g, R5
+ BNE noswitch
+
+ MOVD m_g0(R6), R4
+ MOVD (g_sched+gobuf_sp)(R4), R15 // Set SP to g0 stack
+
+noswitch:
+ SUB $16, R15 // reserve 2x 8 bytes for parameters
+ MOVD $~7, R4 // align to 8 bytes because of gcc ABI
+ AND R4, R15
+ MOVD R15, R3 // R15 needs to be in R3 as expected by kernel_clock_gettime
+
+ MOVB runtime·iscgo(SB),R12
+ CMPBNE R12, $0, nosaveg
+
+ MOVD m_gsignal(R6), R12 // g.m.gsignal
+ CMPBEQ R12, $0, nosaveg
+
+ CMPBEQ g, R12, nosaveg
+ MOVD (g_stack+stack_lo)(R12), R12 // g.m.gsignal.stack.lo
+ MOVD g, (R12)
+
+ BL R9 // to vdso lookup
+
+ MOVD $0, (R12)
+
+ JMP finish
+
+nosaveg:
+ BL R9 // to vdso lookup
+
+finish:
+ MOVD 0(R15), R3 // sec
+ MOVD 8(R15), R5 // nsec
+ MOVD R7, R15 // Restore SP
+
+ // Restore vdsoPC, vdsoSP
+ // We don't worry about being signaled between the two stores.
+ // If we are not in a signal handler, we'll restore vdsoSP to 0,
+ // and no one will care about vdsoPC. If we are in a signal handler,
+ // we cannot receive another signal.
+ MOVD 24(R15), R12
+ MOVD R12, m_vdsoSP(R6)
+ MOVD 16(R15), R12
+ MOVD R12, m_vdsoPC(R6)
+
+return:
+ // sec is in R3, nsec in R5
+ // return nsec in R3
+ MOVD R3, sec+0(FP)
+ MOVW R5, nsec+8(FP)
+ RET
+
+ // Syscall fallback
+fallback:
MOVD $tp-16(SP), R3
MOVW $SYS_clock_gettime, R1
SYSCALL
- LMG tp-16(SP), R2, R3
+ LMG tp-16(SP), R2, R3
// sec is in R2, nsec in R3
MOVD R2, sec+0(FP)
MOVW R3, nsec+8(FP)
RET
-TEXT runtime·nanotime1(SB),NOSPLIT,$16
- MOVW $1, R2 // CLOCK_MONOTONIC
+TEXT runtime·nanotime1(SB),NOSPLIT,$32-8
+ MOVW $1, R2 // CLOCK_MONOTONIC
+
+ MOVD R15, R7 // Backup stack pointer
+
+ MOVD g_m(g), R6 //m
+
+ MOVD runtime·vdsoClockgettimeSym(SB), R9 // Check for VDSO availability
+ CMPBEQ R9, $0, fallback
+
+ MOVD m_vdsoPC(R6), R4
+ MOVD R4, 16(R15)
+ MOVD m_vdsoSP(R6), R4
+ MOVD R4, 24(R15)
+
+ MOVD R14, R8 // Backup return address
+ MOVD $ret+0(FP), R4 // caller's SP
+
+ MOVD R8, m_vdsoPC(R6)
+ MOVD R4, m_vdsoSP(R6)
+
+ MOVD m_curg(R6), R5
+ CMP g, R5
+ BNE noswitch
+
+ MOVD m_g0(R6), R4
+ MOVD (g_sched+gobuf_sp)(R4), R15 // Set SP to g0 stack
+
+noswitch:
+ SUB $16, R15 // reserve 2x 8 bytes for parameters
+ MOVD $~7, R4 // align to 8 bytes because of gcc ABI
+ AND R4, R15
+ MOVD R15, R3 // R15 needs to be in R3 as expected by kernel_clock_gettime
+
+ MOVB runtime·iscgo(SB),R12
+ CMPBNE R12, $0, nosaveg
+
+ MOVD m_gsignal(R6), R12 // g.m.gsignal
+ CMPBEQ R12, $0, nosaveg
+
+ CMPBEQ g, R12, nosaveg
+ MOVD (g_stack+stack_lo)(R12), R12 // g.m.gsignal.stack.lo
+ MOVD g, (R12)
+
+ BL R9 // to vdso lookup
+
+ MOVD $0, (R12)
+
+ JMP finish
+
+nosaveg:
+ BL R9 // to vdso lookup
+
+finish:
+ MOVD 0(R15), R3 // sec
+ MOVD 8(R15), R5 // nsec
+ MOVD R7, R15 // Restore SP
+
+ // Restore vdsoPC, vdsoSP
+ // We don't worry about being signaled between the two stores.
+ // If we are not in a signal handler, we'll restore vdsoSP to 0,
+ // and no one will care about vdsoPC. If we are in a signal handler,
+ // we cannot receive another signal.
+
+ MOVD 24(R15), R12
+ MOVD R12, m_vdsoSP(R6)
+ MOVD 16(R15), R12
+ MOVD R12, m_vdsoPC(R6)
+
+return:
+ // sec is in R3, nsec in R5
+ // return nsec in R3
+ MULLD $1000000000, R3
+ ADD R5, R3
+ MOVD R3, ret+0(FP)
+ RET
+
+ // Syscall fallback
+fallback:
MOVD $tp-16(SP), R3
- MOVW $SYS_clock_gettime, R1
+ MOVD $SYS_clock_gettime, R1
SYSCALL
- LMG tp-16(SP), R2, R3
- // sec is in R2, nsec in R3
- // return nsec in R2
- MULLD $1000000000, R2
- ADD R3, R2
- MOVD R2, ret+0(FP)
- RET
+ LMG tp-16(SP), R2, R3
+ MOVD R3, R5
+ MOVD R2, R3
+ JMP return
TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28
MOVW how+0(FP), R2