@@ -84,17 +84,6 @@ TEXT runtime·write_trampoline(SB),NOSPLIT,$0
84
84
POPL BP
85
85
RET
86
86
87
- TEXT runtime·raiseproc(SB),NOSPLIT,$16
88
- MOVL $20 , AX // getpid
89
- INT $0x80
90
- MOVL AX, 4 (SP) // pid
91
- MOVL sig+0 (FP), AX
92
- MOVL AX, 8 (SP) // signal
93
- MOVL $1 , 12 (SP) // posix
94
- MOVL $37 , AX // kill
95
- INT $0x80
96
- RET
97
-
98
87
TEXT runtime·mmap_trampoline(SB),NOSPLIT,$0
99
88
PUSHL BP
100
89
MOVL SP, BP
@@ -211,18 +200,73 @@ initialized:
211
200
POPL BP
212
201
RET
213
202
214
- TEXT runtime·sigprocmask(SB),NOSPLIT,$0
215
- MOVL $329 , AX // pthread_sigmask (on OS X, sigprocmask==entire process)
216
- INT $0x80
217
- JAE 2 (PC)
203
+ TEXT runtime·sigaction_trampoline(SB),NOSPLIT,$0
204
+ PUSHL BP
205
+ MOVL SP, BP
206
+ SUBL $24 , SP
207
+ MOVL 32 (SP), CX
208
+ MOVL 0 (CX), AX // arg 1 sig
209
+ MOVL AX, 0 (SP)
210
+ MOVL 4 (CX), AX // arg 2 new
211
+ MOVL AX, 4 (SP)
212
+ MOVL 8 (CX), AX // arg 3 old
213
+ MOVL AX, 8 (SP)
214
+ CALL libc_sigaction(SB)
215
+ TESTL AX, AX
216
+ JEQ 2 (PC)
218
217
MOVL $0xf1 , 0xf1 // crash
218
+ MOVL BP, SP
219
+ POPL BP
219
220
RET
220
221
221
- TEXT runtime·sigaction(SB),NOSPLIT,$0
222
- MOVL $46 , AX
223
- INT $0x80
224
- JAE 2 (PC)
222
+ TEXT runtime·sigprocmask_trampoline(SB),NOSPLIT,$0
223
+ PUSHL BP
224
+ MOVL SP, BP
225
+ SUBL $24 , SP
226
+ MOVL 32 (SP), CX
227
+ MOVL 0 (CX), AX // arg 1 how
228
+ MOVL AX, 0 (SP)
229
+ MOVL 4 (CX), AX // arg 2 new
230
+ MOVL AX, 4 (SP)
231
+ MOVL 8 (CX), AX // arg 3 old
232
+ MOVL AX, 8 (SP)
233
+ CALL libc_pthread_sigmask(SB)
234
+ TESTL AX, AX
235
+ JEQ 2 (PC)
236
+ MOVL $0xf1 , 0xf1 // crash
237
+ MOVL BP, SP
238
+ POPL BP
239
+ RET
240
+
241
+ TEXT runtime·sigaltstack_trampoline(SB),NOSPLIT,$0
242
+ PUSHL BP
243
+ MOVL SP, BP
244
+ SUBL $8 , SP
245
+ MOVL 16 (SP), CX
246
+ MOVL 0 (CX), AX // arg 1 new
247
+ MOVL AX, 0 (SP)
248
+ MOVL 4 (CX), AX // arg 2 old
249
+ MOVL AX, 4 (SP)
250
+ CALL libc_sigaltstack(SB)
251
+ TESTL AX, AX
252
+ JEQ 2 (PC)
225
253
MOVL $0xf1 , 0xf1 // crash
254
+ MOVL BP, SP
255
+ POPL BP
256
+ RET
257
+
258
+ TEXT runtime·raiseproc_trampoline(SB),NOSPLIT,$0
259
+ PUSHL BP
260
+ MOVL SP, BP
261
+ SUBL $8 , SP
262
+ CALL libc_getpid(SB)
263
+ MOVL AX, 0 (SP) // arg 1 pid
264
+ MOVL 16 (SP), CX
265
+ MOVL 0 (CX), AX
266
+ MOVL AX, 4 (SP) // arg 2 signal
267
+ CALL libc_kill(SB)
268
+ MOVL BP, SP
269
+ POPL BP
226
270
RET
227
271
228
272
TEXT runtime·sigfwd(SB),NOSPLIT,$0 -16
@@ -243,38 +287,32 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-16
243
287
RET
244
288
245
289
// Sigtramp's job is to call the actual signal handler.
246
- // It is called with the following arguments on the stack:
247
- // 0(SP) "return address" - ignored
248
- // 4(SP) actual handler
249
- // 8(SP) siginfo style
250
- // 12(SP) signal number
251
- // 16(SP) siginfo
252
- // 20(SP) context
253
- TEXT runtime·sigtramp(SB),NOSPLIT,$20
254
- MOVL sig+8 (FP), BX
255
- MOVL BX, 0 (SP)
256
- MOVL info+12 (FP), BX
257
- MOVL BX, 4 (SP)
258
- MOVL ctx+16 (FP), BX
259
- MOVL BX, 8 (SP)
290
+ // It is called with the C calling convention, and calls out
291
+ // to sigtrampgo with the Go calling convention.
292
+ TEXT runtime·sigtramp(SB),NOSPLIT,$0
293
+ SUBL $28 , SP
294
+
295
+ // Save callee-save registers.
296
+ MOVL BP, 12 (SP)
297
+ MOVL BX, 16 (SP)
298
+ MOVL SI, 20 (SP)
299
+ MOVL DI, 24 (SP)
300
+
301
+ MOVL 32 (SP), AX
302
+ MOVL AX, 0 (SP) // arg 1 signal number
303
+ MOVL 36 (SP), AX
304
+ MOVL AX, 4 (SP) // arg 2 siginfo
305
+ MOVL 40 (SP), AX
306
+ MOVL AX, 8 (SP) // arg 3 ctxt
260
307
CALL runtime·sigtrampgo(SB)
261
308
262
- // call sigreturn
263
- MOVL ctx+16 (FP), CX
264
- MOVL infostyle+4 (FP), BX
265
- MOVL $0 , 0 (SP) // "caller PC" - ignored
266
- MOVL CX, 4 (SP)
267
- MOVL BX, 8 (SP)
268
- MOVL $184 , AX // sigreturn(ucontext, infostyle)
269
- INT $0x80
270
- MOVL $0xf1 , 0xf1 // crash
271
- RET
309
+ // Restore callee-save registers.
310
+ MOVL 12 (SP), BP
311
+ MOVL 16 (SP), BX
312
+ MOVL 20 (SP), SI
313
+ MOVL 24 (SP), DI
272
314
273
- TEXT runtime·sigaltstack(SB),NOSPLIT,$0
274
- MOVL $53 , AX
275
- INT $0x80
276
- JAE 2 (PC)
277
- MOVL $0xf1 , 0xf1 // crash
315
+ ADDL $28 , SP
278
316
RET
279
317
280
318
TEXT runtime·usleep_trampoline(SB),NOSPLIT,$0
@@ -409,8 +447,15 @@ TEXT runtime·mstart_stub(SB),NOSPLIT,$0
409
447
// The value at SP+4 points to the m.
410
448
// We are already on m's g0 stack.
411
449
450
+ // Save callee-save registers.
451
+ SUBL $16 , SP
452
+ MOVL BP, 0 (SP)
453
+ MOVL BX, 4 (SP)
454
+ MOVL SI, 8 (SP)
455
+ MOVL DI, 12 (SP)
456
+
412
457
MOVL SP, AX // hide argument read from vet (vet thinks this function is using the Go calling convention)
413
- MOVL 4 (AX), DI // m
458
+ MOVL 20 (AX), DI // m
414
459
MOVL m_g0(DI), DX // g
415
460
416
461
// Initialize TLS entry.
@@ -422,10 +467,18 @@ TEXT runtime·mstart_stub(SB),NOSPLIT,$0
422
467
423
468
CALL runtime·mstart(SB)
424
469
470
+ // Restore callee-save registers.
471
+ MOVL 0 (SP), BP
472
+ MOVL 4 (SP), BX
473
+ MOVL 8 (SP), SI
474
+ MOVL 12 (SP), DI
475
+
425
476
// Go is all done with this OS thread.
426
477
// Tell pthread everything is ok (we never join with this thread, so
427
478
// the value here doesn't really matter).
428
479
XORL AX, AX
480
+
481
+ ADDL $16 , SP
429
482
RET
430
483
431
484
TEXT runtime·pthread_attr_init_trampoline(SB),NOSPLIT,$0
0 commit comments