]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: M-targeted signals for Linux
authorAustin Clements <austin@google.com>
Thu, 3 Oct 2019 14:19:38 +0000 (10:19 -0400)
committerAustin Clements <austin@google.com>
Sat, 26 Oct 2019 02:52:25 +0000 (02:52 +0000)
We'll add a test once all of the POSIX platforms are done.

For #10958, #24543.

Change-Id: If7e3f14e8391791364877629bf415d9f8e788b0a
Reviewed-on: https://go-review.googlesource.com/c/go/+/201401
Run-TryBot: Austin Clements <austin@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/runtime/os_linux.go
src/runtime/sys_linux_386.s
src/runtime/sys_linux_amd64.s
src/runtime/sys_linux_arm.s
src/runtime/sys_linux_arm64.s
src/runtime/sys_linux_mips64x.s
src/runtime/sys_linux_mipsx.s
src/runtime/sys_linux_ppc64x.s
src/runtime/sys_linux_s390x.s

index b1ddf53dd1d2a1bec36b74b768dc011d17121a63..20b947f2500bb938ecfcfb48145f710e3cac172e 100644 (file)
@@ -332,7 +332,9 @@ func gettid() uint32
 func minit() {
        minitSignals()
 
-       // for debuggers, in case cgo created the thread
+       // Cgo-created threads and the bootstrap m are missing a
+       // procid. We need this for asynchronous preemption and its
+       // useful in debuggers.
        getg().m.procid = uint64(gettid())
 }
 
@@ -454,3 +456,11 @@ func sysSigaction(sig uint32, new, old *sigactiont) {
 // rt_sigaction is implemented in assembly.
 //go:noescape
 func rt_sigaction(sig uintptr, new, old *sigactiont, size uintptr) int32
+
+func getpid() int
+func tgkill(tgid, tid, sig int)
+
+// signalM sends a signal to mp.
+func signalM(mp *m, sig int) {
+       tgkill(getpid(), int(mp.procid), sig)
+}
index 4b440b13cbf37ee309e2666c09d7787f13d7a50b..373d9d3bc2bef93bd9b39488b3e39bf98a66fc50 100644 (file)
@@ -188,6 +188,20 @@ TEXT runtime·raiseproc(SB),NOSPLIT,$12
        INVOKE_SYSCALL
        RET
 
+TEXT ·getpid(SB),NOSPLIT,$0-4
+       MOVL    $SYS_getpid, AX
+       INVOKE_SYSCALL
+       MOVL    AX, ret+0(FP)
+       RET
+
+TEXT ·tgkill(SB),NOSPLIT,$0
+       MOVL    $SYS_tgkill, AX
+       MOVL    tgid+0(FP), BX
+       MOVL    tid+4(FP), CX
+       MOVL    sig+8(FP), DX
+       INVOKE_SYSCALL
+       RET
+
 TEXT runtime·setitimer(SB),NOSPLIT,$0-12
        MOVL    $SYS_setittimer, AX
        MOVL    mode+0(FP), BX
index 0728d1766e2aa73d1d88c01a706928cf4d4cc4c6..d16060f6fa2f77689afe98434e82f6ca13963792 100644 (file)
@@ -171,6 +171,20 @@ TEXT runtime·raiseproc(SB),NOSPLIT,$0
        SYSCALL
        RET
 
+TEXT ·getpid(SB),NOSPLIT,$0-8
+       MOVL    $SYS_getpid, AX
+       SYSCALL
+       MOVQ    AX, ret+0(FP)
+       RET
+
+TEXT ·tgkill(SB),NOSPLIT,$0
+       MOVQ    tgid+0(FP), DI
+       MOVQ    tid+8(FP), SI
+       MOVQ    sig+16(FP), DX
+       MOVL    $SYS_tgkill, AX
+       SYSCALL
+       RET
+
 TEXT runtime·setitimer(SB),NOSPLIT,$0-24
        MOVL    mode+0(FP), DI
        MOVQ    new+8(FP), SI
index 9a9e1c92c75119d9806b767dcf8608470dc5b821..a787440a1514c5f4d0c5a136f845a6d98958788e 100644 (file)
@@ -172,6 +172,20 @@ TEXT       runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0
        SWI     $0
        RET
 
+TEXT ·getpid(SB),NOSPLIT,$0-4
+       MOVW    $SYS_getpid, R7
+       SWI     $0
+       MOVW    R0, ret+0(FP)
+       RET
+
+TEXT ·tgkill(SB),NOSPLIT,$0-12
+       MOVW    tgid+0(FP), R0
+       MOVW    tid+4(FP), R1
+       MOVW    sig+8(FP), R2
+       MOVW    $SYS_tgkill, R7
+       SWI     $0
+       RET
+
 TEXT runtime·mmap(SB),NOSPLIT,$0
        MOVW    addr+0(FP), R0
        MOVW    n+4(FP), R1
index a77be98739fc6937d4d1f961b1eaa65cd47dbed6..e0d681ebf1269513a3a902532edaef132a3ab106 100644 (file)
@@ -175,6 +175,20 @@ TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0
        SVC
        RET
 
+TEXT ·getpid(SB),NOSPLIT|NOFRAME,$0-8
+       MOVD    $SYS_getpid, R8
+       SVC
+       MOVD    R0, ret+0(FP)
+       RET
+
+TEXT ·tgkill(SB),NOSPLIT,$0-24
+       MOVD    tgid+0(FP), R0
+       MOVD    tid+8(FP), R1
+       MOVD    sig+16(FP), R2
+       MOVD    $SYS_tgkill, R8
+       SVC
+       RET
+
 TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24
        MOVW    mode+0(FP), R0
        MOVD    new+8(FP), R1
index 49459b0cece32338b6020f4489ae0407c60127f4..e4d02a39533a09ae9cd7ec9543ceef603e91058d 100644 (file)
@@ -177,6 +177,20 @@ TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0
        SYSCALL
        RET
 
+TEXT ·getpid(SB),NOSPLIT|NOFRAME,$0-8
+       MOVV    $SYS_getpid, R2
+       SYSCALL
+       MOVV    R2, ret+0(FP)
+       RET
+
+TEXT ·tgkill(SB),NOSPLIT|NOFRAME,$0-24
+       MOVV    tgid+0(FP), R4
+       MOVV    tid+8(FP), R5
+       MOVV    sig+16(FP), R6
+       MOVV    $SYS_tgkill, R2
+       SYSCALL
+       RET
+
 TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24
        MOVW    mode+0(FP), R4
        MOVV    new+8(FP), R5
index 3c405c264e19f0f2e2f7dc99e68b2094ce7611f0..15893a7a28bc567332e89f4804ef8ca8aa08f6c9 100644 (file)
@@ -183,6 +183,20 @@ TEXT runtime·raiseproc(SB),NOSPLIT,$0
        SYSCALL
        RET
 
+TEXT ·getpid(SB),NOSPLIT,$0-4
+       MOVW    $SYS_getpid, R2
+       SYSCALL
+       MOVW    R2, ret+0(FP)
+       RET
+
+TEXT ·tgkill(SB),NOSPLIT,$0-12
+       MOVW    tgid+0(FP), R4
+       MOVW    tid+4(FP), R5
+       MOVW    sig+8(FP), R6
+       MOVW    $SYS_tgkill, R2
+       SYSCALL
+       RET
+
 TEXT runtime·setitimer(SB),NOSPLIT,$0-12
        MOVW    mode+0(FP), R4
        MOVW    new+4(FP), R5
index 203ce089c1351b50c352e2abd76c40894f35f4fe..de14418338af9d459adeac3c26229402f47b2d20 100644 (file)
@@ -156,6 +156,18 @@ TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0
        SYSCALL $SYS_kill
        RET
 
+TEXT ·getpid(SB),NOSPLIT|NOFRAME,$0-8
+       SYSCALL $SYS_getpid
+       MOVD    R3, ret+0(FP)
+       RET
+
+TEXT ·tgkill(SB),NOSPLIT|NOFRAME,$0-24
+       MOVD    tgid+0(FP), R3
+       MOVD    tid+8(FP), R4
+       MOVD    sig+16(FP), R5
+       SYSCALL $SYS_tgkill
+       RET
+
 TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24
        MOVW    mode+0(FP), R3
        MOVD    new+8(FP), R4
index df01271f7b5f30cf22b9e715444fa4f719429086..c15a1d5364b982e84d3b356e19d20711218aec08 100644 (file)
@@ -163,6 +163,20 @@ TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0
        SYSCALL
        RET
 
+TEXT ·getpid(SB),NOSPLIT|NOFRAME,$0-8
+       MOVW    $SYS_getpid, R1
+       SYSCALL
+       MOVD    R2, ret+0(FP)
+       RET
+
+TEXT ·tgkill(SB),NOSPLIT|NOFRAME,$0-24
+       MOVD    tgid+0(FP), R2
+       MOVD    tid+8(FP), R3
+       MOVD    sig+16(FP), R4
+       MOVW    $SYS_tgkill, R1
+       SYSCALL
+       RET
+
 TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24
        MOVW    mode+0(FP), R2
        MOVD    new+8(FP), R3