aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/sys_linux_ppc64x.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/sys_linux_ppc64x.s')
-rw-r--r--src/runtime/sys_linux_ppc64x.s108
1 files changed, 98 insertions, 10 deletions
diff --git a/src/runtime/sys_linux_ppc64x.s b/src/runtime/sys_linux_ppc64x.s
index b7d34b00da..075adf2368 100644
--- a/src/runtime/sys_linux_ppc64x.s
+++ b/src/runtime/sys_linux_ppc64x.s
@@ -154,21 +154,87 @@ TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28
// func walltime() (sec int64, nsec int32)
TEXT runtime·walltime(SB),NOSPLIT,$16
- MOVD $0, R3 // CLOCK_REALTIME
- MOVD $0(R1), R4
- SYSCALL $SYS_clock_gettime
- MOVD 0(R1), R3 // sec
- MOVD 8(R1), R5 // nsec
+ MOVD R1, R15 // R15 is unchanged by C code
+ MOVD g_m(g), R21 // R21 = m
+
+ MOVD $0, R3 // CLOCK_REALTIME
+
+ MOVD runtime·vdsoClockgettimeSym(SB), R12 // Check for VDSO availability
+ CMP R12, R0
+ BEQ fallback
+
+ // Set vdsoPC and vdsoSP for SIGPROF traceback.
+ MOVD LR, R14
+ MOVD R14, m_vdsoPC(R21)
+ MOVD R15, m_vdsoSP(R21)
+
+ MOVD m_curg(R21), R6
+ CMP g, R6
+ BNE noswitch
+
+ MOVD m_g0(R21), R7
+ MOVD (g_sched+gobuf_sp)(R7), R1 // Set SP to g0 stack
+
+noswitch:
+ SUB $16, R1 // Space for results
+ RLDICR $0, R1, $59, R1 // Align for C code
+ MOVD R12, CTR
+ MOVD R1, R4
+ BL (CTR) // Call from VDSO
+ MOVD $0, R0 // Restore R0
+ MOVD R0, m_vdsoSP(R21) // Clear vdsoSP
+ MOVD 0(R1), R3 // sec
+ MOVD 8(R1), R5 // nsec
+ MOVD R15, R1 // Restore SP
+
+finish:
MOVD R3, sec+0(FP)
MOVW R5, nsec+8(FP)
RET
+ // Syscall fallback
+fallback:
+ ADD $32, R1, R4
+ SYSCALL $SYS_clock_gettime
+ MOVD 32(R1), R3
+ MOVD 40(R1), R5
+ JMP finish
+
TEXT runtime·nanotime(SB),NOSPLIT,$16
- MOVW $1, R3 // CLOCK_MONOTONIC
- MOVD $0(R1), R4
- SYSCALL $SYS_clock_gettime
- MOVD 0(R1), R3 // sec
- MOVD 8(R1), R5 // nsec
+ MOVD $1, R3 // CLOCK_MONOTONIC
+
+ MOVD R1, R15 // R15 is unchanged by C code
+ MOVD g_m(g), R21 // R21 = m
+
+ MOVD runtime·vdsoClockgettimeSym(SB), R12 // Check for VDSO availability
+ CMP R12, R0
+ BEQ fallback
+
+ // Set vdsoPC and vdsoSP for SIGPROF traceback.
+ MOVD LR, R14 // R14 is unchanged by C code
+ MOVD R14, m_vdsoPC(R21)
+ MOVD R15, m_vdsoSP(R21)
+
+ MOVD m_curg(R21), R6
+ CMP g, R6
+ BNE noswitch
+
+ MOVD m_g0(R21), R7
+ MOVD (g_sched+gobuf_sp)(R7), R1 // Set SP to g0 stack
+
+noswitch:
+ SUB $16, R1 // Space for results
+ RLDICR $0, R1, $59, R1 // Align for C code
+ MOVD R12, CTR
+ MOVD R1, R4
+ BL (CTR) // Call from VDSO
+ MOVD $0, R0 // Restore R0
+ MOVD $0, m_vdsoSP(R21) // Clear vdsoSP
+ MOVD 0(R1), R3 // sec
+ MOVD 8(R1), R5 // nsec
+ MOVD R15, R1 // Restore SP
+
+finish:
// sec is in R3, nsec in R5
// return nsec in R3
MOVD $1000000000, R4
@@ -177,6 +243,14 @@ TEXT runtime·nanotime(SB),NOSPLIT,$16
MOVD R3, ret+0(FP)
RET
+ // Syscall fallback
+fallback:
+ ADD $32, R1, R4
+ SYSCALL $SYS_clock_gettime
+ MOVD 32(R1), R3
+ MOVD 48(R1), R5
+ JMP finish
+
TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28
MOVW how+0(FP), R3
MOVD new+8(FP), R4
@@ -193,6 +267,8 @@ TEXT runtime·rt_sigaction(SB),NOSPLIT|NOFRAME,$0-36
MOVD old+16(FP), R5
MOVD size+24(FP), R6
SYSCALL $SYS_rt_sigaction
+ BVC 2(PC)
+ NEG R3 // caller expects negative errno
MOVW R3, ret+32(FP)
RET
@@ -388,6 +464,8 @@ TEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0
MOVD addr2+24(FP), R7
MOVW val3+32(FP), R8
SYSCALL $SYS_futex
+ BVC 2(PC)
+ NEG R3 // caller expects negative errno
MOVW R3, ret+40(FP)
RET
@@ -409,6 +487,8 @@ TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0
MOVD R7, -32(R4)
SYSCALL $SYS_clone
+ BVC 2(PC)
+ NEG R3 // caller expects negative errno
// In parent, return.
CMP R3, $0
@@ -472,6 +552,8 @@ TEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0
MOVD len+8(FP), R4
MOVD buf+16(FP), R5
SYSCALL $SYS_sched_getaffinity
+ BVC 2(PC)
+ NEG R3 // caller expects negative errno
MOVW R3, ret+24(FP)
RET
@@ -479,6 +561,8 @@ TEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0
TEXT runtime·epollcreate(SB),NOSPLIT|NOFRAME,$0
MOVW size+0(FP), R3
SYSCALL $SYS_epoll_create
+ BVC 2(PC)
+ NEG R3 // caller expects negative errno
MOVW R3, ret+8(FP)
RET
@@ -486,6 +570,8 @@ TEXT runtime·epollcreate(SB),NOSPLIT|NOFRAME,$0
TEXT runtime·epollcreate1(SB),NOSPLIT|NOFRAME,$0
MOVW flags+0(FP), R3
SYSCALL $SYS_epoll_create1
+ BVC 2(PC)
+ NEG R3 // caller expects negative errno
MOVW R3, ret+8(FP)
RET
@@ -507,6 +593,8 @@ TEXT runtime·epollwait(SB),NOSPLIT|NOFRAME,$0
MOVW nev+16(FP), R5
MOVW timeout+20(FP), R6
SYSCALL $SYS_epoll_wait
+ BVC 2(PC)
+ NEG R3 // caller expects negative errno
MOVW R3, ret+24(FP)
RET