diff options
Diffstat (limited to 'pkg/tcpip/link/rawfile')
-rw-r--r-- | pkg/tcpip/link/rawfile/BUILD | 2 | ||||
-rw-r--r-- | pkg/tcpip/link/rawfile/blockingpoll_amd64.s | 6 | ||||
-rw-r--r-- | pkg/tcpip/link/rawfile/blockingpoll_amd64_unsafe.go | 59 | ||||
-rw-r--r-- | pkg/tcpip/link/rawfile/blockingpoll_unsafe_amd64.go | 24 |
4 files changed, 63 insertions, 28 deletions
diff --git a/pkg/tcpip/link/rawfile/BUILD b/pkg/tcpip/link/rawfile/BUILD index 829ea7c42..2746d4ced 100644 --- a/pkg/tcpip/link/rawfile/BUILD +++ b/pkg/tcpip/link/rawfile/BUILD @@ -6,8 +6,8 @@ go_library( name = "rawfile", srcs = [ "blockingpoll_amd64.s", + "blockingpoll_amd64_unsafe.go", "blockingpoll_unsafe.go", - "blockingpoll_unsafe_amd64.go", "errors.go", "rawfile_unsafe.go", ], diff --git a/pkg/tcpip/link/rawfile/blockingpoll_amd64.s b/pkg/tcpip/link/rawfile/blockingpoll_amd64.s index 63b8c4451..8e22ba661 100644 --- a/pkg/tcpip/link/rawfile/blockingpoll_amd64.s +++ b/pkg/tcpip/link/rawfile/blockingpoll_amd64.s @@ -20,7 +20,7 @@ // // func blockingPoll(fds *pollEvent, nfds int, timeout int64) (n int, err syscall.Errno) TEXT ·blockingPoll(SB),NOSPLIT,$0-40 - CALL runtime·entersyscallblock(SB) + CALL ·callEntersyscallblock(SB) MOVQ fds+0(FP), DI MOVQ nfds+8(FP), SI MOVQ timeout+16(FP), DX @@ -31,10 +31,10 @@ TEXT ·blockingPoll(SB),NOSPLIT,$0-40 MOVQ $-1, n+24(FP) NEGQ AX MOVQ AX, err+32(FP) - CALL runtime·exitsyscall(SB) + CALL ·callExitsyscall(SB) RET ok: MOVQ AX, n+24(FP) MOVQ $0, err+32(FP) - CALL runtime·exitsyscall(SB) + CALL ·callExitsyscall(SB) RET diff --git a/pkg/tcpip/link/rawfile/blockingpoll_amd64_unsafe.go b/pkg/tcpip/link/rawfile/blockingpoll_amd64_unsafe.go new file mode 100644 index 000000000..93479cd0d --- /dev/null +++ b/pkg/tcpip/link/rawfile/blockingpoll_amd64_unsafe.go @@ -0,0 +1,59 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build linux,amd64 +// +build !go1.13 + +// This must be validated with Go 1.13 and future releases. + +package rawfile + +import ( + "syscall" + _ "unsafe" // for go:linkname +) + +//go:noescape +func blockingPoll(fds *pollEvent, nfds int, timeout int64) (int, syscall.Errno) + +// Use go:linkname to call into the runtime. As of Go 1.12 this has to +// be done from Go code so that we make an ABIInternal call to an +// ABIInternal function; see https://golang.org/issue/27539. + +// We need to call both entersyscallblock and exitsyscall this way so +// that the runtime's check on the stack pointer lines up. + +// Note that calling an unexported function in the runtime package is +// unsafe and this hack is likely to break in future Go releases. + +//go:linkname entersyscallblock runtime.entersyscallblock +func entersyscallblock() + +//go:linkname exitsyscall runtime.exitsyscall +func exitsyscall() + +// These forwarding functions must be nosplit because 1) we must +// disallow preemption between entersyscallblock and exitsyscall, and +// 2) we have an untyped assembly frame on the stack which can not be +// grown or moved. + +//go:nosplit +func callEntersyscallblock() { + entersyscallblock() +} + +//go:nosplit +func callExitsyscall() { + exitsyscall() +} diff --git a/pkg/tcpip/link/rawfile/blockingpoll_unsafe_amd64.go b/pkg/tcpip/link/rawfile/blockingpoll_unsafe_amd64.go deleted file mode 100644 index 89a8a9954..000000000 --- a/pkg/tcpip/link/rawfile/blockingpoll_unsafe_amd64.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build linux,amd64 - -package rawfile - -import ( - "syscall" -) - -//go:noescape -func blockingPoll(fds *pollEvent, nfds int, timeout int64) (int, syscall.Errno) |