@@ -313,7 +313,37 @@ noswitch:
313
313
RLDICR $ 0 , R1 , $ 59 , R1 // Align for C code
314
314
MOVD R12 , CTR
315
315
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:
317
347
MOVD $ 0 , R0 // Restore R0
318
348
MOVD 0 (R1) , R3 // sec
319
349
MOVD 8 (R1) , R5 // nsec
@@ -329,7 +359,7 @@ noswitch:
329
359
MOVD 32 (R1) , R6
330
360
MOVD R6 , m_vdsoPC(R21)
331
361
332
- finish :
362
+ return :
333
363
// sec is in R3 , nsec in R5
334
364
// return nsec in R3
335
365
MOVD $ 1000000000 , R4
@@ -344,7 +374,7 @@ fallback:
344
374
SYSCALL $ SYS_clock_gettime
345
375
MOVD 32 (R1) , R3
346
376
MOVD 40 (R1) , R5
347
- JMP finish
377
+ JMP return
348
378
349
379
TEXT runtime·rtsigprocmask(SB) , NOSPLIT|NOFRAME , $ 0 - 28
350
380
MOVW how + 0 (FP) , R3
0 commit comments