Skip to content

Commit

Permalink
syscall: call internal/runtime/syscall.Syscall6 in RawSyscall6
Browse files Browse the repository at this point in the history
For #65355

Change-Id: I9168d9a767e3b2ece65ac6dcab6827ab6f6b11bb
Reviewed-on: https://go-review.googlesource.com/c/go/+/560136
Reviewed-by: Michael Knyszek <[email protected]>
LUCI-TryBot-Result: Go LUCI <[email protected]>
Reviewed-by: Michael Pratt <[email protected]>
Auto-Submit: Ian Lance Taylor <[email protected]>
  • Loading branch information
panjf2000 authored and gopherbot committed Mar 4, 2024
1 parent 5cbea57 commit dff3a00
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 32 deletions.
23 changes: 0 additions & 23 deletions src/internal/runtime/syscall/syscall_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,29 +15,6 @@ import (
// Syscall6 calls system call number 'num' with arguments a1-6.
func Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr)

// syscall_RawSyscall6 is a push linkname to export Syscall6 as
// syscall.RawSyscall6.
//
// //go:uintptrkeepalive because the uintptr argument may be converted pointers
// that need to be kept alive in the caller (this is implied for Syscall6 since
// it has no body).
//
// //go:nosplit because stack copying does not account for uintptrkeepalive, so
// the stack must not grow. Stack copying cannot blindly assume that all
// uintptr arguments are pointers, because some values may look like pointers,
// but not really be pointers, and adjusting their value would break the call.
//
// This is a separate wrapper because we can't export one function as two
// names. The assembly implementations name themselves Syscall6 would not be
// affected by a linkname.
//
//go:uintptrkeepalive
//go:nosplit
//go:linkname syscall_RawSyscall6 syscall.RawSyscall6
func syscall_RawSyscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {
return Syscall6(num, a1, a2, a3, a4, a5, a6)
}

func EpollCreate1(flags int32) (fd int32, errno uintptr) {
r1, _, e := Syscall6(SYS_EPOLL_CREATE1, uintptr(flags), 0, 0, 0, 0, 0)
return int32(r1), e
Expand Down
22 changes: 13 additions & 9 deletions src/syscall/syscall_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,11 @@ package syscall

import (
"internal/itoa"
runtimesyscall "internal/runtime/syscall"
"runtime"
"unsafe"
)

// N.B. RawSyscall6 is provided via linkname by internal/runtime/syscall.
//
// Errno is uintptr and thus compatible with the internal/runtime/syscall
// definition.

func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)

// Pull in entersyscall/exitsyscall for Syscall/Syscall6.
//
// Note that this can't be a push linkname because the runtime already has a
Expand All @@ -40,8 +34,7 @@ func runtime_exitsyscall()
// N.B. For the Syscall functions below:
//
// //go:uintptrkeepalive because the uintptr argument may be converted pointers
// that need to be kept alive in the caller (this is implied for RawSyscall6
// since it has no body).
// that need to be kept alive in the caller.
//
// //go:nosplit because stack copying does not account for uintptrkeepalive, so
// the stack must not grow. Stack copying cannot blindly assume that all
Expand All @@ -62,6 +55,17 @@ func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {
return RawSyscall6(trap, a1, a2, a3, 0, 0, 0)
}

//go:uintptrkeepalive
//go:nosplit
//go:norace
//go:linkname RawSyscall6
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {
var errno uintptr
r1, r2, errno = runtimesyscall.Syscall6(trap, a1, a2, a3, a4, a5, a6)
err = Errno(errno)
return
}

//go:uintptrkeepalive
//go:nosplit
//go:linkname Syscall
Expand Down

0 comments on commit dff3a00

Please sign in to comment.