Skip to content

Commit c3002bc

Browse files
committed
runtime: Save G on signal stack for nanotime1 vdso
1 parent 1acaa2b commit c3002bc

File tree

1 file changed

+33
-3
lines changed

1 file changed

+33
-3
lines changed

src/runtime/sys_linux_ppc64x.s

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,37 @@ noswitch:
313313
RLDICR $0, R1, $59, R1 // Align for C code
314314
MOVD R12, CTR
315315
MOVD R1, R4
316-
BL (CTR) // Call from VDSO
316+
317+
// Store g on gsignal's stack, so if we receive a signal
318+
// during VDSO code we can find the g.
319+
// If we don't have a signal stack, we won't receive signal,
320+
// so don't bother saving g.
321+
// When using cgo, we already saved g on TLS, also don't save
322+
// g here.
323+
// Also don't save g if we are already on the signal stack.
324+
// We won't get a nested signal.
325+
MOVBZ runtime·iscgo(SB), R22
326+
CMP R22, $0
327+
BNE nosaveg
328+
MOVD m_gsignal(R21), R22 // g.m.gsignal
329+
CMP R22, $0
330+
BEQ nosaveg
331+
332+
CMP g, R22
333+
BEQ nosaveg
334+
MOVD (g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo
335+
MOVD g, (R22)
336+
337+
BL (CTR) // Call from VDSO
338+
339+
MOVD $0, (R22) // clear g slot, R22 is unchanged by C code
340+
341+
JMP finish
342+
343+
nosaveg:
344+
BL (CTR) // Call from VDSO
345+
346+
finish:
317347
MOVD $0, R0 // Restore R0
318348
MOVD 0(R1), R3 // sec
319349
MOVD 8(R1), R5 // nsec
@@ -329,7 +359,7 @@ noswitch:
329359
MOVD 32(R1), R6
330360
MOVD R6, m_vdsoPC(R21)
331361

332-
finish:
362+
return:
333363
// sec is in R3, nsec in R5
334364
// return nsec in R3
335365
MOVD $1000000000, R4
@@ -344,7 +374,7 @@ fallback:
344374
SYSCALL $SYS_clock_gettime
345375
MOVD 32(R1), R3
346376
MOVD 40(R1), R5
347-
JMP finish
377+
JMP return
348378

349379
TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28
350380
MOVW how+0(FP), R3

0 commit comments

Comments
 (0)