]> Cypherpunks repositories - gostls13.git/commit
cmd/internal/obj, runtime: preempt & restart some instruction sequences
authorCherry Zhang <cherryyz@google.com>
Wed, 20 Nov 2019 22:10:34 +0000 (17:10 -0500)
committerCherry Zhang <cherryyz@google.com>
Wed, 6 May 2020 15:41:12 +0000 (15:41 +0000)
commitee330385ca684f7c166913e10998f791d1be06e7
tree63f9b19a0811656bb78fc35df4ad2c7ced36a49d
parent4daf8719e7f4c71a620f650d73caab2a9d7ea499
cmd/internal/obj, runtime: preempt & restart some instruction sequences

On some architectures, for async preemption the injected call
needs to clobber a register (usually REGTMP) in order to return
to the preempted function. As a consequence, the PC ranges where
REGTMP is live are not preemptible.

The uses of REGTMP are usually generated by the assembler, where
it needs to load or materialize a large constant or offset that
doesn't fit into the instruction. In those cases, REGTMP is not
live at the start of the instruction sequence. Instead of giving
up preemption in those cases, we could preempt it and restart the
sequence when resuming the execution. Basically, this is like
reissuing an interrupted instruction, except that here the
"instruction" is a Prog that consists of multiple machine
instructions. For this to work, we need to generate PC data to
mark the start of the Prog.

Currently this is only done for ARM64.

TODO: the split-stack function prologue is currently not async
preemptible. We could use this mechanism, preempt it and restart
at the function entry.

Change-Id: I37cb282f8e606e7ab6f67b3edfdc6063097b4bd1
Reviewed-on: https://go-review.googlesource.com/c/go/+/208126
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
20 files changed:
src/cmd/internal/obj/arm64/asm7.go
src/cmd/internal/obj/mips/asm0.go
src/cmd/internal/obj/plist.go
src/cmd/internal/obj/riscv/obj.go
src/cmd/internal/obj/s390x/asmz.go
src/cmd/internal/obj/x86/asm6.go
src/cmd/internal/objabi/funcdata.go
src/runtime/os_windows.go
src/runtime/preempt.go
src/runtime/signal_386.go
src/runtime/signal_amd64.go
src/runtime/signal_arm.go
src/runtime/signal_arm64.go
src/runtime/signal_linux_s390x.go
src/runtime/signal_mips64x.go
src/runtime/signal_mipsx.go
src/runtime/signal_ppc64x.go
src/runtime/signal_riscv64.go
src/runtime/signal_unix.go
src/runtime/symtab.go