diff options
Diffstat (limited to 'src/pkg/runtime/freebsd/386/sys.s')
-rw-r--r-- | src/pkg/runtime/freebsd/386/sys.s | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/src/pkg/runtime/freebsd/386/sys.s b/src/pkg/runtime/freebsd/386/sys.s index 7110e6924..60c189bf8 100644 --- a/src/pkg/runtime/freebsd/386/sys.s +++ b/src/pkg/runtime/freebsd/386/sys.s @@ -111,30 +111,36 @@ TEXT runtime·sigaction(SB),7,$-4 CALL runtime·notok(SB) RET -TEXT runtime·sigtramp(SB),7,$40 - // g = m->gsignal - get_tls(DX) - MOVL m(DX), BP - MOVL m_gsignal(BP), BP - MOVL BP, g(DX) +TEXT runtime·sigtramp(SB),7,$44 + get_tls(CX) - MOVL signo+0(FP), AX - MOVL siginfo+4(FP), BX - MOVL context+8(FP), CX + // save g + MOVL g(CX), DI + MOVL DI, 20(SP) + + // g = m->gsignal + MOVL m(CX), BX + MOVL m_gsignal(BX), BX + MOVL BX, g(CX) - MOVL AX, 0(SP) + // copy arguments for call to sighandler + MOVL signo+0(FP), BX + MOVL BX, 0(SP) + MOVL info+4(FP), BX MOVL BX, 4(SP) - MOVL CX, 8(SP) - CALL runtime·sighandler(SB) + MOVL context+8(FP), BX + MOVL BX, 8(SP) + MOVL DI, 12(SP) - // g = m->curg - get_tls(DX) - MOVL m(DX), BP - MOVL m_curg(BP), BP - MOVL BP, g(DX) + CALL runtime·sighandler(SB) + // restore g + get_tls(CX) + MOVL 20(SP), BX + MOVL BX, g(CX) + + // call sigreturn MOVL context+8(FP), AX - MOVL $0, 0(SP) // syscall gap MOVL AX, 4(SP) MOVL $417, AX // sigreturn(ucontext) |