mirror of
https://github.com/rwinkhart/sys.git
synced 2026-09-05 16:47:27 -04:00
unix: implement alarm(2) on Linux on all GOARCH except arm* and riscv.
SYS_ALARM is not defined for arm* or riscv, but is available for all other Linux GOARCH values. Ian suggested I create a new file with build tags matching these constraints. In order to handle special case files such as this one (which don't match the existing syscall_linux_goarch.go scheme), I've added logic to the Linux build system which can evaluate the build constraints in a given file to determine whether that file should be appended to the arguments for a given target. Change-Id: I0136534522a26a0ce495308f63953546ea6bb8e5 Reviewed-on: https://go-review.googlesource.com/c/sys/+/383734 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Trust: Daniel Martí <mvdan@mvdan.cc>
This commit is contained in:
committed by
Ian Lance Taylor
parent
1c1b9b1eba
commit
5739886226
+84
-1
@@ -22,6 +22,7 @@ import (
|
|||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"go/build/constraint"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
@@ -510,10 +511,92 @@ func (t *target) makeZSyscallFile() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
args := append(t.mksyscallFlags(), "-tags", "linux,"+t.GoArch,
|
args := append(t.mksyscallFlags(), "-tags", "linux,"+t.GoArch,
|
||||||
"syscall_linux.go", archSyscallFile)
|
"syscall_linux.go",
|
||||||
|
archSyscallFile,
|
||||||
|
)
|
||||||
|
|
||||||
|
files, err := t.archMksyscallFiles()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to check GOARCH-specific mksyscall files: %v", err)
|
||||||
|
}
|
||||||
|
args = append(args, files...)
|
||||||
|
|
||||||
return t.commandFormatOutput("gofmt", zsyscallFile, "mksyscall", args...)
|
return t.commandFormatOutput("gofmt", zsyscallFile, "mksyscall", args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// archMksyscallFiles produces additional file arguments to mksyscall if the
|
||||||
|
// build constraints in those files match those defined for target.
|
||||||
|
func (t *target) archMksyscallFiles() ([]string, error) {
|
||||||
|
// These input files don't fit the typical GOOS/GOARCH file name conventions
|
||||||
|
// but are included conditionally in the arguments to mksyscall based on
|
||||||
|
// whether or not the target matches the build constraints defined in each
|
||||||
|
// file.
|
||||||
|
//
|
||||||
|
// TODO(mdlayher): it should be possible to generalize this approach to work
|
||||||
|
// over all of syscall_linux_* rather than hard-coding a few special files.
|
||||||
|
// Investigate this.
|
||||||
|
inputs := []string{
|
||||||
|
// GOARCH: all except arm* and riscv.
|
||||||
|
"syscall_linux_alarm.go",
|
||||||
|
}
|
||||||
|
|
||||||
|
var outputs []string
|
||||||
|
for _, in := range inputs {
|
||||||
|
ok, err := t.matchesMksyscallFile(in)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to parse file %q: %v", in, err)
|
||||||
|
}
|
||||||
|
if ok {
|
||||||
|
// Constraints match, use for this target's code generation.
|
||||||
|
outputs = append(outputs, in)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return outputs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// matchesMksyscallFile reports whether the input file contains constraints
|
||||||
|
// which match those defined for target.
|
||||||
|
func (t *target) matchesMksyscallFile(file string) (bool, error) {
|
||||||
|
f, err := os.Open(file)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
var (
|
||||||
|
expr constraint.Expr
|
||||||
|
found bool
|
||||||
|
)
|
||||||
|
|
||||||
|
s := bufio.NewScanner(f)
|
||||||
|
for s.Scan() {
|
||||||
|
// Keep scanning until a valid constraint is found or we hit EOF.
|
||||||
|
//
|
||||||
|
// This only supports single-line constraints such as the //go:build
|
||||||
|
// convention used in Go 1.17+. Because the old //+build convention
|
||||||
|
// (which may have multiple lines of build tags) is being deprecated,
|
||||||
|
// we don't bother looking for multi-line constraints.
|
||||||
|
if expr, err = constraint.Parse(s.Text()); err == nil {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := s.Err(); err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
return false, errors.New("no build constraints found")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do the defined constraints match target's GOOS/GOARCH?
|
||||||
|
ok := expr.Eval(func(tag string) bool {
|
||||||
|
return tag == GOOS || tag == t.GoArch
|
||||||
|
})
|
||||||
|
|
||||||
|
return ok, nil
|
||||||
|
}
|
||||||
|
|
||||||
// makes the zerrors_linux_$GOARCH.go file
|
// makes the zerrors_linux_$GOARCH.go file
|
||||||
func (t *target) makeZErrorsFile() error {
|
func (t *target) makeZErrorsFile() error {
|
||||||
zerrorsFile := fmt.Sprintf("zerrors_linux_%s.go", t.GoArch)
|
zerrorsFile := fmt.Sprintf("zerrors_linux_%s.go", t.GoArch)
|
||||||
|
|||||||
@@ -2318,7 +2318,6 @@ type RemoteIovec struct {
|
|||||||
* Unimplemented
|
* Unimplemented
|
||||||
*/
|
*/
|
||||||
// AfsSyscall
|
// AfsSyscall
|
||||||
// Alarm
|
|
||||||
// ArchPrctl
|
// ArchPrctl
|
||||||
// Brk
|
// Brk
|
||||||
// ClockNanosleep
|
// ClockNanosleep
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
// Copyright 2022 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build linux && (386 || amd64 || mips || mipsle || mips64 || mipsle || ppc64 || ppc64le || ppc || s390x || sparc64)
|
||||||
|
// +build linux
|
||||||
|
// +build 386 amd64 mips mipsle mips64 mipsle ppc64 ppc64le ppc s390x sparc64
|
||||||
|
|
||||||
|
package unix
|
||||||
|
|
||||||
|
// SYS_ALARM is not defined on arm or riscv, but is available for other GOARCH
|
||||||
|
// values.
|
||||||
|
|
||||||
|
//sys Alarm(seconds uint) (remaining uint, err error)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go
|
// go run mksyscall.go -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && 386
|
//go:build linux && 386
|
||||||
@@ -524,3 +524,14 @@ func utimes(path string, times *[2]Timeval) (err error) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go
|
// go run mksyscall.go -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && amd64
|
//go:build linux && amd64
|
||||||
@@ -691,3 +691,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go
|
// go run mksyscall.go -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && mips
|
//go:build linux && mips
|
||||||
@@ -702,3 +702,14 @@ func setrlimit(resource int, rlim *rlimit32) (err error) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go
|
// go run mksyscall.go -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && mips64
|
//go:build linux && mips64
|
||||||
@@ -696,3 +696,14 @@ func stat(path string, st *stat_t) (err error) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go
|
// go run mksyscall.go -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && mipsle
|
//go:build linux && mipsle
|
||||||
@@ -702,3 +702,14 @@ func setrlimit(resource int, rlim *rlimit32) (err error) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -b32 -tags linux,ppc syscall_linux.go syscall_linux_ppc.go
|
// go run mksyscall.go -b32 -tags linux,ppc syscall_linux.go syscall_linux_ppc.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && ppc
|
//go:build linux && ppc
|
||||||
@@ -707,3 +707,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go
|
// go run mksyscall.go -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && ppc64
|
//go:build linux && ppc64
|
||||||
@@ -753,3 +753,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go
|
// go run mksyscall.go -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && ppc64le
|
//go:build linux && ppc64le
|
||||||
@@ -753,3 +753,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -tags linux,s390x syscall_linux.go syscall_linux_s390x.go
|
// go run mksyscall.go -tags linux,s390x syscall_linux.go syscall_linux_s390x.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && s390x
|
//go:build linux && s390x
|
||||||
@@ -533,3 +533,14 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// go run mksyscall.go -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go
|
// go run mksyscall.go -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go syscall_linux_alarm.go
|
||||||
// Code generated by the command above; see README.md. DO NOT EDIT.
|
// Code generated by the command above; see README.md. DO NOT EDIT.
|
||||||
|
|
||||||
//go:build linux && sparc64
|
//go:build linux && sparc64
|
||||||
@@ -697,3 +697,14 @@ func utimes(path string, times *[2]Timeval) (err error) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
|
||||||
|
|
||||||
|
func Alarm(seconds uint) (remaining uint, err error) {
|
||||||
|
r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0)
|
||||||
|
remaining = uint(r0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user