From 49ded663dab1ae71335cc8e9ec029091414f34af Mon Sep 17 00:00:00 2001 From: Jelle van den Hooff Date: Sat, 23 Nov 2024 17:43:15 -0800 Subject: [PATCH] gensyscall: replace syscall numbers with func pointers Instead of numbers and big switch statement, store functions pointers directly on the syscall struct. The big switch statement was impossible to extend outside of gensyscall. These new function pairs do not have this problem. --- internal/simulation/gensyscall/main.go | 33 +- internal/simulation/gosim_gensyscall.go | 294 +++--- internal/simulation/linux_gensyscall_amd64.go | 878 +++++++++--------- internal/simulation/linux_gensyscall_arm64.go | 878 +++++++++--------- internal/simulation/syscallabi/syscall.go | 17 +- 5 files changed, 984 insertions(+), 1116 deletions(-) diff --git a/internal/simulation/gensyscall/main.go b/internal/simulation/gensyscall/main.go index 2816cce..aa9ec27 100644 --- a/internal/simulation/gensyscall/main.go +++ b/internal/simulation/gensyscall/main.go @@ -98,7 +98,7 @@ func (o *outputSorter) append(key, value string) { } func (o *outputSorter) output() string { - slices.SortFunc(o.outputs, func(a, b outputWithSortKey) int { + slices.SortStableFunc(o.outputs, func(a, b outputWithSortKey) int { return cmp.Compare(a.sortKey, b.sortKey) }) var out strings.Builder @@ -477,7 +477,6 @@ func writeSyscalls(outputPath string, syscalls []syscallInfo, isMachine bool) { } callers := newOutputSorter() - dispatches := newOutputSorter() checks := newOutputSorter() ifaces := newOutputSorter() for _, info := range syscalls { @@ -569,14 +568,6 @@ func writeSyscalls(outputPath string, syscalls []syscallInfo, isMachine bool) { parseDispatchText += "\t\tsyscall.Complete()\n" } - dispatchText := fmt.Sprintf("\tcase %s:\n", sysVal) + - "\t\t// called by (for find references):\n" + - fmt.Sprintf("\t\t_ = %s\n", "Syscall"+ifaceName) + - prepareDispatch + - fmt.Sprintf("\t\t%sos.%s(%s)\n", dispatchRet, ifaceName, strings.Join(dispatchArgs, ", ")) + - parseDispatchText - dispatches.append(sysName, dispatchText) - if info.sysVal == 0 { checkText := fmt.Sprintf("\tcase %s:\n", sysVal) + "\t\treturn true\n" @@ -588,11 +579,9 @@ func writeSyscalls(outputPath string, syscalls []syscallInfo, isMachine bool) { callerText := "//go:norace\n" + fmt.Sprintf("func %s(%s)%s {\n", "Syscall"+ifaceName, strings.Join(callerArgs, ", "), callerRet) + - "\t// invokes (for go to definition):\n" + - fmt.Sprintf("\t_ = (*%s).%s\n", osTypeName, ifaceName) + "\tsyscall := syscallabi.GetGoroutineLocalSyscall()\n" + + fmt.Sprintf("\tsyscall.Trampoline = trampoline%s\n", ifaceName) + fmt.Sprintf("\tsyscall.OS = %s\n", osImplName) + - fmt.Sprintf("\tsyscall.Trap = %s\n", sysVal) + prepareCaller + fmt.Sprintf("\t%s.dispatchSyscall(syscall)\n", osImplName) + parseCallerText + @@ -600,6 +589,14 @@ func writeSyscalls(outputPath string, syscalls []syscallInfo, isMachine bool) { "\treturn\n" + "}\n\n" callers.append(sysName, callerText) + + dispatchText := "//go:norace\n" + + fmt.Sprintf("func trampoline%s(syscall *syscallabi.Syscall) {\n", ifaceName) + + prepareDispatch + + fmt.Sprintf("\t\t%ssyscall.OS.(*%s).%s(%s)\n", dispatchRet, osTypeName, ifaceName, strings.Join(dispatchArgs, ", ")) + + parseDispatchText + + "}\n\n" + callers.append(sysName, dispatchText) } output := "" @@ -647,15 +644,7 @@ func (os *%s) dispatchSyscall(s *syscallabi.Syscall) { os.dispatcher.Dispatch(s) } -//go:norace -func (os *%s) HandleSyscall(syscall *syscallabi.Syscall) { - switch (syscall.Trap) { -`, osIfaceName, osTypeName, osTypeName, osTypeName) + dispatches.output() + ` default: - panic("bad") - } -} - -` + callers.output() +`, osIfaceName, osTypeName, osTypeName) + callers.output() if !isMachine { output += ` diff --git a/internal/simulation/gosim_gensyscall.go b/internal/simulation/gosim_gensyscall.go index 6b3d27d..b203d59 100644 --- a/internal/simulation/gosim_gensyscall.go +++ b/internal/simulation/gosim_gensyscall.go @@ -54,129 +54,11 @@ func (os *GosimOS) dispatchSyscall(s *syscallabi.Syscall) { os.dispatcher.Dispatch(s) } -//go:norace -func (os *GosimOS) HandleSyscall(syscall *syscallabi.Syscall) { - switch syscall.Trap { - case 1011: - // called by (for find references): - _ = SyscallMachineGetLabel - machineID := int(syscall.Int0) - label, err := os.MachineGetLabel(machineID) - syscall.RPtr0 = label - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case 1005: - // called by (for find references): - _ = SyscallMachineInodeInfo - machineID := int(syscall.Int0) - inodeID := int(syscall.Int1) - info := syscallabi.NewValueView(syscall.Ptr2.(*fs.InodeInfo)) - os.MachineInodeInfo(machineID, inodeID, info) - syscall.Complete() - case 1003: - // called by (for find references): - _ = SyscallMachineNew - label := syscall.Ptr0.(string) - addr := syscall.Ptr1.(string) - program := syscall.Ptr2.(any) - machineID := os.MachineNew(label, addr, program) - syscall.R0 = uintptr(machineID) - syscall.Complete() - case 1007: - // called by (for find references): - _ = SyscallMachineRecoverInit - machineID := int(syscall.Int0) - program := syscall.Ptr1.(any) - iterID := os.MachineRecoverInit(machineID, program) - syscall.R0 = uintptr(iterID) - syscall.Complete() - case 1008: - // called by (for find references): - _ = SyscallMachineRecoverNext - iterID := int(syscall.Int0) - machineID, ok := os.MachineRecoverNext(iterID) - syscall.R0 = uintptr(machineID) - syscall.R1 = syscallabi.BoolToUintptr(ok) - syscall.Complete() - case 1009: - // called by (for find references): - _ = SyscallMachineRecoverRelease - iterID := int(syscall.Int0) - os.MachineRecoverRelease(iterID) - syscall.Complete() - case 1010: - // called by (for find references): - _ = SyscallMachineRestart - machineID := int(syscall.Int0) - partialDisk := syscallabi.BoolFromUintptr(syscall.Int1) - err := os.MachineRestart(machineID, partialDisk) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case 1012: - // called by (for find references): - _ = SyscallMachineSetBootProgram - machineID := int(syscall.Int0) - program := syscall.Ptr1.(any) - err := os.MachineSetBootProgram(machineID, program) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case 1013: - // called by (for find references): - _ = SyscallMachineSetSometimesCrashOnSync - machineID := int(syscall.Int0) - crash := syscallabi.BoolFromUintptr(syscall.Int1) - err := os.MachineSetSometimesCrashOnSync(machineID, crash) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case 1004: - // called by (for find references): - _ = SyscallMachineStop - machineID := int(syscall.Int0) - graceful := syscallabi.BoolFromUintptr(syscall.Int1) - os.MachineStop(machineID, graceful) - syscall.Complete() - case 1006: - // called by (for find references): - _ = SyscallMachineWait - machineID := int(syscall.Int0) - os.MachineWait(machineID, syscall) - case 1001: - // called by (for find references): - _ = SyscallSetConnected - a := syscall.Ptr0.(string) - b := syscall.Ptr1.(string) - connected := syscallabi.BoolFromUintptr(syscall.Int2) - err := os.SetConnected(a, b, connected) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case 1002: - // called by (for find references): - _ = SyscallSetDelay - a := syscall.Ptr0.(string) - b := syscall.Ptr1.(string) - delay := time.Duration(syscall.Int2) - err := os.SetDelay(a, b, delay) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case 1000: - // called by (for find references): - _ = SyscallSetSimulationTimeout - timeout := time.Duration(syscall.Int0) - err := os.SetSimulationTimeout(timeout) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - default: - panic("bad") - } -} - //go:norace func SyscallMachineGetLabel(machineID int) (label string, err error) { - // invokes (for go to definition): - _ = (*GosimOS).MachineGetLabel syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineMachineGetLabel syscall.OS = gosimOS - syscall.Trap = 1011 syscall.Int0 = uintptr(machineID) gosimOS.dispatchSyscall(syscall) label = syscall.RPtr0.(string) @@ -184,13 +66,20 @@ func SyscallMachineGetLabel(machineID int) (label string, err error) { return } +//go:norace +func trampolineMachineGetLabel(syscall *syscallabi.Syscall) { + machineID := int(syscall.Int0) + label, err := syscall.OS.(*GosimOS).MachineGetLabel(machineID) + syscall.RPtr0 = label + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallMachineInodeInfo(machineID int, inodeID int, info *fs.InodeInfo) { - // invokes (for go to definition): - _ = (*GosimOS).MachineInodeInfo syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineMachineInodeInfo syscall.OS = gosimOS - syscall.Trap = 1005 syscall.Int0 = uintptr(machineID) syscall.Int1 = uintptr(inodeID) syscall.Ptr2 = info @@ -199,13 +88,20 @@ func SyscallMachineInodeInfo(machineID int, inodeID int, info *fs.InodeInfo) { return } +//go:norace +func trampolineMachineInodeInfo(syscall *syscallabi.Syscall) { + machineID := int(syscall.Int0) + inodeID := int(syscall.Int1) + info := syscallabi.NewValueView(syscall.Ptr2.(*fs.InodeInfo)) + syscall.OS.(*GosimOS).MachineInodeInfo(machineID, inodeID, info) + syscall.Complete() +} + //go:norace func SyscallMachineNew(label string, addr string, program any) (machineID int) { - // invokes (for go to definition): - _ = (*GosimOS).MachineNew syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineMachineNew syscall.OS = gosimOS - syscall.Trap = 1003 syscall.Ptr0 = label syscall.Ptr1 = addr syscall.Ptr2 = program @@ -217,13 +113,21 @@ func SyscallMachineNew(label string, addr string, program any) (machineID int) { return } +//go:norace +func trampolineMachineNew(syscall *syscallabi.Syscall) { + label := syscall.Ptr0.(string) + addr := syscall.Ptr1.(string) + program := syscall.Ptr2.(any) + machineID := syscall.OS.(*GosimOS).MachineNew(label, addr, program) + syscall.R0 = uintptr(machineID) + syscall.Complete() +} + //go:norace func SyscallMachineRecoverInit(machineID int, program any) (iterID int) { - // invokes (for go to definition): - _ = (*GosimOS).MachineRecoverInit syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineMachineRecoverInit syscall.OS = gosimOS - syscall.Trap = 1007 syscall.Int0 = uintptr(machineID) syscall.Ptr1 = program gosimOS.dispatchSyscall(syscall) @@ -232,13 +136,20 @@ func SyscallMachineRecoverInit(machineID int, program any) (iterID int) { return } +//go:norace +func trampolineMachineRecoverInit(syscall *syscallabi.Syscall) { + machineID := int(syscall.Int0) + program := syscall.Ptr1.(any) + iterID := syscall.OS.(*GosimOS).MachineRecoverInit(machineID, program) + syscall.R0 = uintptr(iterID) + syscall.Complete() +} + //go:norace func SyscallMachineRecoverNext(iterID int) (machineID int, ok bool) { - // invokes (for go to definition): - _ = (*GosimOS).MachineRecoverNext syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineMachineRecoverNext syscall.OS = gosimOS - syscall.Trap = 1008 syscall.Int0 = uintptr(iterID) gosimOS.dispatchSyscall(syscall) machineID = int(syscall.R0) @@ -246,25 +157,37 @@ func SyscallMachineRecoverNext(iterID int) (machineID int, ok bool) { return } +//go:norace +func trampolineMachineRecoverNext(syscall *syscallabi.Syscall) { + iterID := int(syscall.Int0) + machineID, ok := syscall.OS.(*GosimOS).MachineRecoverNext(iterID) + syscall.R0 = uintptr(machineID) + syscall.R1 = syscallabi.BoolToUintptr(ok) + syscall.Complete() +} + //go:norace func SyscallMachineRecoverRelease(iterID int) { - // invokes (for go to definition): - _ = (*GosimOS).MachineRecoverRelease syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineMachineRecoverRelease syscall.OS = gosimOS - syscall.Trap = 1009 syscall.Int0 = uintptr(iterID) gosimOS.dispatchSyscall(syscall) return } +//go:norace +func trampolineMachineRecoverRelease(syscall *syscallabi.Syscall) { + iterID := int(syscall.Int0) + syscall.OS.(*GosimOS).MachineRecoverRelease(iterID) + syscall.Complete() +} + //go:norace func SyscallMachineRestart(machineID int, partialDisk bool) (err error) { - // invokes (for go to definition): - _ = (*GosimOS).MachineRestart syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineMachineRestart syscall.OS = gosimOS - syscall.Trap = 1010 syscall.Int0 = uintptr(machineID) syscall.Int1 = syscallabi.BoolToUintptr(partialDisk) gosimOS.dispatchSyscall(syscall) @@ -272,13 +195,20 @@ func SyscallMachineRestart(machineID int, partialDisk bool) (err error) { return } +//go:norace +func trampolineMachineRestart(syscall *syscallabi.Syscall) { + machineID := int(syscall.Int0) + partialDisk := syscallabi.BoolFromUintptr(syscall.Int1) + err := syscall.OS.(*GosimOS).MachineRestart(machineID, partialDisk) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallMachineSetBootProgram(machineID int, program any) (err error) { - // invokes (for go to definition): - _ = (*GosimOS).MachineSetBootProgram syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineMachineSetBootProgram syscall.OS = gosimOS - syscall.Trap = 1012 syscall.Int0 = uintptr(machineID) syscall.Ptr1 = program gosimOS.dispatchSyscall(syscall) @@ -287,13 +217,20 @@ func SyscallMachineSetBootProgram(machineID int, program any) (err error) { return } +//go:norace +func trampolineMachineSetBootProgram(syscall *syscallabi.Syscall) { + machineID := int(syscall.Int0) + program := syscall.Ptr1.(any) + err := syscall.OS.(*GosimOS).MachineSetBootProgram(machineID, program) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallMachineSetSometimesCrashOnSync(machineID int, crash bool) (err error) { - // invokes (for go to definition): - _ = (*GosimOS).MachineSetSometimesCrashOnSync syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineMachineSetSometimesCrashOnSync syscall.OS = gosimOS - syscall.Trap = 1013 syscall.Int0 = uintptr(machineID) syscall.Int1 = syscallabi.BoolToUintptr(crash) gosimOS.dispatchSyscall(syscall) @@ -301,38 +238,55 @@ func SyscallMachineSetSometimesCrashOnSync(machineID int, crash bool) (err error return } +//go:norace +func trampolineMachineSetSometimesCrashOnSync(syscall *syscallabi.Syscall) { + machineID := int(syscall.Int0) + crash := syscallabi.BoolFromUintptr(syscall.Int1) + err := syscall.OS.(*GosimOS).MachineSetSometimesCrashOnSync(machineID, crash) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallMachineStop(machineID int, graceful bool) { - // invokes (for go to definition): - _ = (*GosimOS).MachineStop syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineMachineStop syscall.OS = gosimOS - syscall.Trap = 1004 syscall.Int0 = uintptr(machineID) syscall.Int1 = syscallabi.BoolToUintptr(graceful) gosimOS.dispatchSyscall(syscall) return } +//go:norace +func trampolineMachineStop(syscall *syscallabi.Syscall) { + machineID := int(syscall.Int0) + graceful := syscallabi.BoolFromUintptr(syscall.Int1) + syscall.OS.(*GosimOS).MachineStop(machineID, graceful) + syscall.Complete() +} + //go:norace func SyscallMachineWait(machineID int) { - // invokes (for go to definition): - _ = (*GosimOS).MachineWait syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineMachineWait syscall.OS = gosimOS - syscall.Trap = 1006 syscall.Int0 = uintptr(machineID) gosimOS.dispatchSyscall(syscall) return } +//go:norace +func trampolineMachineWait(syscall *syscallabi.Syscall) { + machineID := int(syscall.Int0) + syscall.OS.(*GosimOS).MachineWait(machineID, syscall) +} + //go:norace func SyscallSetConnected(a string, b string, connected bool) (err error) { - // invokes (for go to definition): - _ = (*GosimOS).SetConnected syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSetConnected syscall.OS = gosimOS - syscall.Trap = 1001 syscall.Ptr0 = a syscall.Ptr1 = b syscall.Int2 = syscallabi.BoolToUintptr(connected) @@ -343,13 +297,21 @@ func SyscallSetConnected(a string, b string, connected bool) (err error) { return } +//go:norace +func trampolineSetConnected(syscall *syscallabi.Syscall) { + a := syscall.Ptr0.(string) + b := syscall.Ptr1.(string) + connected := syscallabi.BoolFromUintptr(syscall.Int2) + err := syscall.OS.(*GosimOS).SetConnected(a, b, connected) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSetDelay(a string, b string, delay time.Duration) (err error) { - // invokes (for go to definition): - _ = (*GosimOS).SetDelay syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSetDelay syscall.OS = gosimOS - syscall.Trap = 1002 syscall.Ptr0 = a syscall.Ptr1 = b syscall.Int2 = uintptr(delay) @@ -360,15 +322,31 @@ func SyscallSetDelay(a string, b string, delay time.Duration) (err error) { return } +//go:norace +func trampolineSetDelay(syscall *syscallabi.Syscall) { + a := syscall.Ptr0.(string) + b := syscall.Ptr1.(string) + delay := time.Duration(syscall.Int2) + err := syscall.OS.(*GosimOS).SetDelay(a, b, delay) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSetSimulationTimeout(timeout time.Duration) (err error) { - // invokes (for go to definition): - _ = (*GosimOS).SetSimulationTimeout syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSetSimulationTimeout syscall.OS = gosimOS - syscall.Trap = 1000 syscall.Int0 = uintptr(timeout) gosimOS.dispatchSyscall(syscall) err = syscallabi.ErrnoErr(syscall.Errno) return } + +//go:norace +func trampolineSetSimulationTimeout(syscall *syscallabi.Syscall) { + timeout := time.Duration(syscall.Int0) + err := syscall.OS.(*GosimOS).SetSimulationTimeout(timeout) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} diff --git a/internal/simulation/linux_gensyscall_amd64.go b/internal/simulation/linux_gensyscall_amd64.go index 6057570..a89597b 100644 --- a/internal/simulation/linux_gensyscall_amd64.go +++ b/internal/simulation/linux_gensyscall_amd64.go @@ -80,361 +80,11 @@ func (os *LinuxOS) dispatchSyscall(s *syscallabi.Syscall) { os.dispatcher.Dispatch(s) } -//go:norace -func (os *LinuxOS) HandleSyscall(syscall *syscallabi.Syscall) { - switch syscall.Trap { - case 1001: - // called by (for find references): - _ = SyscallPollClose - fd := int(syscall.Int0) - desc := syscallabi.NewValueView(syscall.Ptr1.(*syscallabi.PollDesc)) - code := os.PollClose(fd, desc) - syscall.R0 = uintptr(code) - syscall.Complete() - case 1000: - // called by (for find references): - _ = SyscallPollOpen - fd := int(syscall.Int0) - desc := syscallabi.NewValueView(syscall.Ptr1.(*syscallabi.PollDesc)) - code := os.PollOpen(fd, desc) - syscall.R0 = uintptr(code) - syscall.Complete() - case unix.SYS_ACCEPT4: - // called by (for find references): - _ = SyscallSysAccept4 - s := int(syscall.Int0) - rsa := syscallabi.NewValueView(syscall.Ptr1.(*RawSockaddrAny)) - addrlen := syscallabi.NewValueView(syscall.Ptr2.(*Socklen)) - flags := int(syscall.Int3) - fd, err := os.SysAccept4(s, rsa, addrlen, flags) - syscall.R0 = uintptr(fd) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_BIND: - // called by (for find references): - _ = SyscallSysBind - s := int(syscall.Int0) - addr := syscall.Ptr1.(unsafe.Pointer) - addrlen := Socklen(syscall.Int2) - err := os.SysBind(s, addr, addrlen) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_CHDIR: - // called by (for find references): - _ = SyscallSysChdir - path := syscall.Ptr0.(string) - err := os.SysChdir(path) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_CLOSE: - // called by (for find references): - _ = SyscallSysClose - fd := int(syscall.Int0) - err := os.SysClose(fd) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_CONNECT: - // called by (for find references): - _ = SyscallSysConnect - s := int(syscall.Int0) - addr := syscall.Ptr1.(unsafe.Pointer) - addrlen := Socklen(syscall.Int2) - err := os.SysConnect(s, addr, addrlen) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FALLOCATE: - // called by (for find references): - _ = SyscallSysFallocate - fd := int(syscall.Int0) - mode := uint32(syscall.Int1) - off := int64(syscall.Int2) - len := int64(syscall.Int3) - err := os.SysFallocate(fd, mode, off, len) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FCNTL: - // called by (for find references): - _ = SyscallSysFcntl - fd := int(syscall.Int0) - cmd := int(syscall.Int1) - arg := int(syscall.Int2) - val, err := os.SysFcntl(fd, cmd, arg) - syscall.R0 = uintptr(val) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FDATASYNC: - // called by (for find references): - _ = SyscallSysFdatasync - fd := int(syscall.Int0) - err := os.SysFdatasync(fd) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FLOCK: - // called by (for find references): - _ = SyscallSysFlock - fd := int(syscall.Int0) - how := int(syscall.Int1) - err := os.SysFlock(fd, how) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FSTAT: - // called by (for find references): - _ = SyscallSysFstat - fd := int(syscall.Int0) - stat := syscallabi.NewValueView(syscall.Ptr1.(*Stat_t)) - err := os.SysFstat(fd, stat) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FSYNC: - // called by (for find references): - _ = SyscallSysFsync - fd := int(syscall.Int0) - err := os.SysFsync(fd) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FTRUNCATE: - // called by (for find references): - _ = SyscallSysFtruncate - fd := int(syscall.Int0) - length := int64(syscall.Int1) - err := os.SysFtruncate(fd, length) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_GETCWD: - // called by (for find references): - _ = SyscallSysGetcwd - buf := syscallabi.NewSliceView(syscall.Ptr0.(*byte), syscall.Int0) - n, err := os.SysGetcwd(buf) - syscall.R0 = uintptr(n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_GETDENTS64: - // called by (for find references): - _ = SyscallSysGetdents64 - fd := int(syscall.Int0) - buf := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) - n, err := os.SysGetdents64(fd, buf) - syscall.R0 = uintptr(n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_GETPEERNAME: - // called by (for find references): - _ = SyscallSysGetpeername - fd := int(syscall.Int0) - rsa := syscallabi.NewValueView(syscall.Ptr1.(*RawSockaddrAny)) - addrlen := syscallabi.NewValueView(syscall.Ptr2.(*Socklen)) - err := os.SysGetpeername(fd, rsa, addrlen) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_GETPID: - // called by (for find references): - _ = SyscallSysGetpid - pid := os.SysGetpid() - syscall.R0 = uintptr(pid) - syscall.Complete() - case unix.SYS_GETRANDOM: - // called by (for find references): - _ = SyscallSysGetrandom - buf := syscallabi.NewSliceView(syscall.Ptr0.(*byte), syscall.Int0) - flags := int(syscall.Int1) - n, err := os.SysGetrandom(buf, flags) - syscall.R0 = uintptr(n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_GETSOCKNAME: - // called by (for find references): - _ = SyscallSysGetsockname - fd := int(syscall.Int0) - rsa := syscallabi.NewValueView(syscall.Ptr1.(*RawSockaddrAny)) - addrlen := syscallabi.NewValueView(syscall.Ptr2.(*Socklen)) - err := os.SysGetsockname(fd, rsa, addrlen) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_GETSOCKOPT: - // called by (for find references): - _ = SyscallSysGetsockopt - s := int(syscall.Int0) - level := int(syscall.Int1) - name := int(syscall.Int2) - val := syscall.Ptr3.(unsafe.Pointer) - vallen := syscallabi.NewValueView(syscall.Ptr4.(*Socklen)) - err := os.SysGetsockopt(s, level, name, val, vallen) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_LISTEN: - // called by (for find references): - _ = SyscallSysListen - s := int(syscall.Int0) - n := int(syscall.Int1) - err := os.SysListen(s, n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_LSEEK: - // called by (for find references): - _ = SyscallSysLseek - fd := int(syscall.Int0) - offset := int64(syscall.Int1) - whence := int(syscall.Int2) - off, err := os.SysLseek(fd, offset, whence) - syscall.R0 = uintptr(off) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_MADVISE: - // called by (for find references): - _ = SyscallSysMadvise - b := syscallabi.NewSliceView(syscall.Ptr0.(*byte), syscall.Int0) - advice := int(syscall.Int1) - err := os.SysMadvise(b, advice) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_MKDIRAT: - // called by (for find references): - _ = SyscallSysMkdirat - dirfd := int(syscall.Int0) - path := syscall.Ptr1.(string) - mode := uint32(syscall.Int2) - err := os.SysMkdirat(dirfd, path, mode) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_MMAP: - // called by (for find references): - _ = SyscallSysMmap - addr := uintptr(syscall.Int0) - length := uintptr(syscall.Int1) - prot := int(syscall.Int2) - flags := int(syscall.Int3) - fd := int(syscall.Int4) - offset := int64(syscall.Int5) - xaddr, err := os.SysMmap(addr, length, prot, flags, fd, offset) - syscall.R0 = uintptr(xaddr) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_MUNMAP: - // called by (for find references): - _ = SyscallSysMunmap - addr := uintptr(syscall.Int0) - length := uintptr(syscall.Int1) - err := os.SysMunmap(addr, length) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_NEWFSTATAT: - // called by (for find references): - _ = SyscallSysNewfstatat - fd := int(syscall.Int0) - path := syscall.Ptr1.(string) - stat := syscallabi.NewValueView(syscall.Ptr2.(*Stat_t)) - flags := int(syscall.Int3) - err := os.SysNewfstatat(fd, path, stat, flags) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_OPENAT: - // called by (for find references): - _ = SyscallSysOpenat - dirfd := int(syscall.Int0) - path := syscall.Ptr1.(string) - flags := int(syscall.Int2) - mode := uint32(syscall.Int3) - fd, err := os.SysOpenat(dirfd, path, flags, mode) - syscall.R0 = uintptr(fd) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_PREAD64: - // called by (for find references): - _ = SyscallSysPread64 - fd := int(syscall.Int0) - p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) - offset := int64(syscall.Int2) - n, err := os.SysPread64(fd, p, offset) - syscall.R0 = uintptr(n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_PWRITE64: - // called by (for find references): - _ = SyscallSysPwrite64 - fd := int(syscall.Int0) - p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) - offset := int64(syscall.Int2) - n, err := os.SysPwrite64(fd, p, offset) - syscall.R0 = uintptr(n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_READ: - // called by (for find references): - _ = SyscallSysRead - fd := int(syscall.Int0) - p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) - n, err := os.SysRead(fd, p) - syscall.R0 = uintptr(n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_RENAMEAT: - // called by (for find references): - _ = SyscallSysRenameat - olddirfd := int(syscall.Int0) - oldpath := syscall.Ptr1.(string) - newdirfd := int(syscall.Int2) - newpath := syscall.Ptr3.(string) - err := os.SysRenameat(olddirfd, oldpath, newdirfd, newpath) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_SETSOCKOPT: - // called by (for find references): - _ = SyscallSysSetsockopt - s := int(syscall.Int0) - level := int(syscall.Int1) - name := int(syscall.Int2) - val := syscall.Ptr3.(unsafe.Pointer) - vallen := uintptr(syscall.Int4) - err := os.SysSetsockopt(s, level, name, val, vallen) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_SOCKET: - // called by (for find references): - _ = SyscallSysSocket - domain := int(syscall.Int0) - typ := int(syscall.Int1) - proto := int(syscall.Int2) - fd, err := os.SysSocket(domain, typ, proto) - syscall.R0 = uintptr(fd) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_UNAME: - // called by (for find references): - _ = SyscallSysUname - buf := syscallabi.NewValueView(syscall.Ptr0.(*Utsname)) - err := os.SysUname(buf) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_UNLINKAT: - // called by (for find references): - _ = SyscallSysUnlinkat - dirfd := int(syscall.Int0) - path := syscall.Ptr1.(string) - flags := int(syscall.Int2) - err := os.SysUnlinkat(dirfd, path, flags) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_WRITE: - // called by (for find references): - _ = SyscallSysWrite - fd := int(syscall.Int0) - p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) - n, err := os.SysWrite(fd, p) - syscall.R0 = uintptr(n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - default: - panic("bad") - } -} - //go:norace func SyscallPollClose(fd int, desc *syscallabi.PollDesc) (code int) { - // invokes (for go to definition): - _ = (*LinuxOS).PollClose syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolinePollClose syscall.OS = linuxOS - syscall.Trap = 1001 syscall.Int0 = uintptr(fd) syscall.Ptr1 = desc linuxOS.dispatchSyscall(syscall) @@ -443,13 +93,20 @@ func SyscallPollClose(fd int, desc *syscallabi.PollDesc) (code int) { return } +//go:norace +func trampolinePollClose(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + desc := syscallabi.NewValueView(syscall.Ptr1.(*syscallabi.PollDesc)) + code := syscall.OS.(*LinuxOS).PollClose(fd, desc) + syscall.R0 = uintptr(code) + syscall.Complete() +} + //go:norace func SyscallPollOpen(fd int, desc *syscallabi.PollDesc) (code int) { - // invokes (for go to definition): - _ = (*LinuxOS).PollOpen syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolinePollOpen syscall.OS = linuxOS - syscall.Trap = 1000 syscall.Int0 = uintptr(fd) syscall.Ptr1 = desc linuxOS.dispatchSyscall(syscall) @@ -458,13 +115,20 @@ func SyscallPollOpen(fd int, desc *syscallabi.PollDesc) (code int) { return } +//go:norace +func trampolinePollOpen(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + desc := syscallabi.NewValueView(syscall.Ptr1.(*syscallabi.PollDesc)) + code := syscall.OS.(*LinuxOS).PollOpen(fd, desc) + syscall.R0 = uintptr(code) + syscall.Complete() +} + //go:norace func SyscallSysAccept4(s int, rsa *RawSockaddrAny, addrlen *Socklen, flags int) (fd int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysAccept4 syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysAccept4 syscall.OS = linuxOS - syscall.Trap = unix.SYS_ACCEPT4 syscall.Int0 = uintptr(s) syscall.Ptr1 = rsa syscall.Ptr2 = addrlen @@ -477,13 +141,23 @@ func SyscallSysAccept4(s int, rsa *RawSockaddrAny, addrlen *Socklen, flags int) return } +//go:norace +func trampolineSysAccept4(syscall *syscallabi.Syscall) { + s := int(syscall.Int0) + rsa := syscallabi.NewValueView(syscall.Ptr1.(*RawSockaddrAny)) + addrlen := syscallabi.NewValueView(syscall.Ptr2.(*Socklen)) + flags := int(syscall.Int3) + fd, err := syscall.OS.(*LinuxOS).SysAccept4(s, rsa, addrlen, flags) + syscall.R0 = uintptr(fd) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysBind(s int, addr unsafe.Pointer, addrlen Socklen) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysBind syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysBind syscall.OS = linuxOS - syscall.Trap = unix.SYS_BIND syscall.Int0 = uintptr(s) syscall.Ptr1 = addr syscall.Int2 = uintptr(addrlen) @@ -493,13 +167,21 @@ func SyscallSysBind(s int, addr unsafe.Pointer, addrlen Socklen) (err error) { return } +//go:norace +func trampolineSysBind(syscall *syscallabi.Syscall) { + s := int(syscall.Int0) + addr := syscall.Ptr1.(unsafe.Pointer) + addrlen := Socklen(syscall.Int2) + err := syscall.OS.(*LinuxOS).SysBind(s, addr, addrlen) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysChdir(path string) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysChdir syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysChdir syscall.OS = linuxOS - syscall.Trap = unix.SYS_CHDIR syscall.Ptr0 = path linuxOS.dispatchSyscall(syscall) err = syscallabi.ErrnoErr(syscall.Errno) @@ -507,26 +189,38 @@ func SyscallSysChdir(path string) (err error) { return } +//go:norace +func trampolineSysChdir(syscall *syscallabi.Syscall) { + path := syscall.Ptr0.(string) + err := syscall.OS.(*LinuxOS).SysChdir(path) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysClose(fd int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysClose syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysClose syscall.OS = linuxOS - syscall.Trap = unix.SYS_CLOSE syscall.Int0 = uintptr(fd) linuxOS.dispatchSyscall(syscall) err = syscallabi.ErrnoErr(syscall.Errno) return } +//go:norace +func trampolineSysClose(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + err := syscall.OS.(*LinuxOS).SysClose(fd) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysConnect(s int, addr unsafe.Pointer, addrlen Socklen) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysConnect syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysConnect syscall.OS = linuxOS - syscall.Trap = unix.SYS_CONNECT syscall.Int0 = uintptr(s) syscall.Ptr1 = addr syscall.Int2 = uintptr(addrlen) @@ -536,13 +230,21 @@ func SyscallSysConnect(s int, addr unsafe.Pointer, addrlen Socklen) (err error) return } +//go:norace +func trampolineSysConnect(syscall *syscallabi.Syscall) { + s := int(syscall.Int0) + addr := syscall.Ptr1.(unsafe.Pointer) + addrlen := Socklen(syscall.Int2) + err := syscall.OS.(*LinuxOS).SysConnect(s, addr, addrlen) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFallocate(fd int, mode uint32, off int64, len int64) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFallocate syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFallocate syscall.OS = linuxOS - syscall.Trap = unix.SYS_FALLOCATE syscall.Int0 = uintptr(fd) syscall.Int1 = uintptr(mode) syscall.Int2 = uintptr(off) @@ -552,13 +254,22 @@ func SyscallSysFallocate(fd int, mode uint32, off int64, len int64) (err error) return } +//go:norace +func trampolineSysFallocate(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + mode := uint32(syscall.Int1) + off := int64(syscall.Int2) + len := int64(syscall.Int3) + err := syscall.OS.(*LinuxOS).SysFallocate(fd, mode, off, len) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFcntl(fd int, cmd int, arg int) (val int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFcntl syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFcntl syscall.OS = linuxOS - syscall.Trap = unix.SYS_FCNTL syscall.Int0 = uintptr(fd) syscall.Int1 = uintptr(cmd) syscall.Int2 = uintptr(arg) @@ -568,26 +279,41 @@ func SyscallSysFcntl(fd int, cmd int, arg int) (val int, err error) { return } +//go:norace +func trampolineSysFcntl(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + cmd := int(syscall.Int1) + arg := int(syscall.Int2) + val, err := syscall.OS.(*LinuxOS).SysFcntl(fd, cmd, arg) + syscall.R0 = uintptr(val) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFdatasync(fd int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFdatasync syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFdatasync syscall.OS = linuxOS - syscall.Trap = unix.SYS_FDATASYNC syscall.Int0 = uintptr(fd) linuxOS.dispatchSyscall(syscall) err = syscallabi.ErrnoErr(syscall.Errno) return } +//go:norace +func trampolineSysFdatasync(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + err := syscall.OS.(*LinuxOS).SysFdatasync(fd) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFlock(fd int, how int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFlock syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFlock syscall.OS = linuxOS - syscall.Trap = unix.SYS_FLOCK syscall.Int0 = uintptr(fd) syscall.Int1 = uintptr(how) linuxOS.dispatchSyscall(syscall) @@ -595,13 +321,20 @@ func SyscallSysFlock(fd int, how int) (err error) { return } +//go:norace +func trampolineSysFlock(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + how := int(syscall.Int1) + err := syscall.OS.(*LinuxOS).SysFlock(fd, how) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFstat(fd int, stat *Stat_t) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFstat syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFstat syscall.OS = linuxOS - syscall.Trap = unix.SYS_FSTAT syscall.Int0 = uintptr(fd) syscall.Ptr1 = stat linuxOS.dispatchSyscall(syscall) @@ -610,26 +343,39 @@ func SyscallSysFstat(fd int, stat *Stat_t) (err error) { return } +//go:norace +func trampolineSysFstat(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + stat := syscallabi.NewValueView(syscall.Ptr1.(*Stat_t)) + err := syscall.OS.(*LinuxOS).SysFstat(fd, stat) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFsync(fd int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFsync syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFsync syscall.OS = linuxOS - syscall.Trap = unix.SYS_FSYNC syscall.Int0 = uintptr(fd) linuxOS.dispatchSyscall(syscall) err = syscallabi.ErrnoErr(syscall.Errno) return } +//go:norace +func trampolineSysFsync(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + err := syscall.OS.(*LinuxOS).SysFsync(fd) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFtruncate(fd int, length int64) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFtruncate syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFtruncate syscall.OS = linuxOS - syscall.Trap = unix.SYS_FTRUNCATE syscall.Int0 = uintptr(fd) syscall.Int1 = uintptr(length) linuxOS.dispatchSyscall(syscall) @@ -637,13 +383,20 @@ func SyscallSysFtruncate(fd int, length int64) (err error) { return } +//go:norace +func trampolineSysFtruncate(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + length := int64(syscall.Int1) + err := syscall.OS.(*LinuxOS).SysFtruncate(fd, length) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysGetcwd(buf []byte) (n int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysGetcwd syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysGetcwd syscall.OS = linuxOS - syscall.Trap = unix.SYS_GETCWD syscall.Ptr0, syscall.Int0 = unsafe.SliceData(buf), uintptr(len(buf)) linuxOS.dispatchSyscall(syscall) n = int(syscall.R0) @@ -652,13 +405,20 @@ func SyscallSysGetcwd(buf []byte) (n int, err error) { return } +//go:norace +func trampolineSysGetcwd(syscall *syscallabi.Syscall) { + buf := syscallabi.NewSliceView(syscall.Ptr0.(*byte), syscall.Int0) + n, err := syscall.OS.(*LinuxOS).SysGetcwd(buf) + syscall.R0 = uintptr(n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysGetdents64(fd int, buf []byte) (n int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysGetdents64 syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysGetdents64 syscall.OS = linuxOS - syscall.Trap = unix.SYS_GETDENTS64 syscall.Int0 = uintptr(fd) syscall.Ptr1, syscall.Int1 = unsafe.SliceData(buf), uintptr(len(buf)) linuxOS.dispatchSyscall(syscall) @@ -668,13 +428,21 @@ func SyscallSysGetdents64(fd int, buf []byte) (n int, err error) { return } +//go:norace +func trampolineSysGetdents64(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + buf := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) + n, err := syscall.OS.(*LinuxOS).SysGetdents64(fd, buf) + syscall.R0 = uintptr(n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysGetpeername(fd int, rsa *RawSockaddrAny, addrlen *Socklen) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysGetpeername syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysGetpeername syscall.OS = linuxOS - syscall.Trap = unix.SYS_GETPEERNAME syscall.Int0 = uintptr(fd) syscall.Ptr1 = rsa syscall.Ptr2 = addrlen @@ -685,25 +453,38 @@ func SyscallSysGetpeername(fd int, rsa *RawSockaddrAny, addrlen *Socklen) (err e return } +//go:norace +func trampolineSysGetpeername(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + rsa := syscallabi.NewValueView(syscall.Ptr1.(*RawSockaddrAny)) + addrlen := syscallabi.NewValueView(syscall.Ptr2.(*Socklen)) + err := syscall.OS.(*LinuxOS).SysGetpeername(fd, rsa, addrlen) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysGetpid() (pid int) { - // invokes (for go to definition): - _ = (*LinuxOS).SysGetpid syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysGetpid syscall.OS = linuxOS - syscall.Trap = unix.SYS_GETPID linuxOS.dispatchSyscall(syscall) pid = int(syscall.R0) return } +//go:norace +func trampolineSysGetpid(syscall *syscallabi.Syscall) { + pid := syscall.OS.(*LinuxOS).SysGetpid() + syscall.R0 = uintptr(pid) + syscall.Complete() +} + //go:norace func SyscallSysGetrandom(buf []byte, flags int) (n int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysGetrandom syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysGetrandom syscall.OS = linuxOS - syscall.Trap = unix.SYS_GETRANDOM syscall.Ptr0, syscall.Int0 = unsafe.SliceData(buf), uintptr(len(buf)) syscall.Int1 = uintptr(flags) linuxOS.dispatchSyscall(syscall) @@ -713,13 +494,21 @@ func SyscallSysGetrandom(buf []byte, flags int) (n int, err error) { return } +//go:norace +func trampolineSysGetrandom(syscall *syscallabi.Syscall) { + buf := syscallabi.NewSliceView(syscall.Ptr0.(*byte), syscall.Int0) + flags := int(syscall.Int1) + n, err := syscall.OS.(*LinuxOS).SysGetrandom(buf, flags) + syscall.R0 = uintptr(n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysGetsockname(fd int, rsa *RawSockaddrAny, addrlen *Socklen) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysGetsockname syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysGetsockname syscall.OS = linuxOS - syscall.Trap = unix.SYS_GETSOCKNAME syscall.Int0 = uintptr(fd) syscall.Ptr1 = rsa syscall.Ptr2 = addrlen @@ -730,13 +519,21 @@ func SyscallSysGetsockname(fd int, rsa *RawSockaddrAny, addrlen *Socklen) (err e return } +//go:norace +func trampolineSysGetsockname(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + rsa := syscallabi.NewValueView(syscall.Ptr1.(*RawSockaddrAny)) + addrlen := syscallabi.NewValueView(syscall.Ptr2.(*Socklen)) + err := syscall.OS.(*LinuxOS).SysGetsockname(fd, rsa, addrlen) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysGetsockopt(s int, level int, name int, val unsafe.Pointer, vallen *Socklen) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysGetsockopt syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysGetsockopt syscall.OS = linuxOS - syscall.Trap = unix.SYS_GETSOCKOPT syscall.Int0 = uintptr(s) syscall.Int1 = uintptr(level) syscall.Int2 = uintptr(name) @@ -749,13 +546,23 @@ func SyscallSysGetsockopt(s int, level int, name int, val unsafe.Pointer, vallen return } +//go:norace +func trampolineSysGetsockopt(syscall *syscallabi.Syscall) { + s := int(syscall.Int0) + level := int(syscall.Int1) + name := int(syscall.Int2) + val := syscall.Ptr3.(unsafe.Pointer) + vallen := syscallabi.NewValueView(syscall.Ptr4.(*Socklen)) + err := syscall.OS.(*LinuxOS).SysGetsockopt(s, level, name, val, vallen) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysListen(s int, n int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysListen syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysListen syscall.OS = linuxOS - syscall.Trap = unix.SYS_LISTEN syscall.Int0 = uintptr(s) syscall.Int1 = uintptr(n) linuxOS.dispatchSyscall(syscall) @@ -763,13 +570,20 @@ func SyscallSysListen(s int, n int) (err error) { return } +//go:norace +func trampolineSysListen(syscall *syscallabi.Syscall) { + s := int(syscall.Int0) + n := int(syscall.Int1) + err := syscall.OS.(*LinuxOS).SysListen(s, n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysLseek(fd int, offset int64, whence int) (off int64, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysLseek syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysLseek syscall.OS = linuxOS - syscall.Trap = unix.SYS_LSEEK syscall.Int0 = uintptr(fd) syscall.Int1 = uintptr(offset) syscall.Int2 = uintptr(whence) @@ -779,13 +593,22 @@ func SyscallSysLseek(fd int, offset int64, whence int) (off int64, err error) { return } +//go:norace +func trampolineSysLseek(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + offset := int64(syscall.Int1) + whence := int(syscall.Int2) + off, err := syscall.OS.(*LinuxOS).SysLseek(fd, offset, whence) + syscall.R0 = uintptr(off) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysMadvise(b []byte, advice int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysMadvise syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysMadvise syscall.OS = linuxOS - syscall.Trap = unix.SYS_MADVISE syscall.Ptr0, syscall.Int0 = unsafe.SliceData(b), uintptr(len(b)) syscall.Int1 = uintptr(advice) linuxOS.dispatchSyscall(syscall) @@ -794,13 +617,20 @@ func SyscallSysMadvise(b []byte, advice int) (err error) { return } +//go:norace +func trampolineSysMadvise(syscall *syscallabi.Syscall) { + b := syscallabi.NewSliceView(syscall.Ptr0.(*byte), syscall.Int0) + advice := int(syscall.Int1) + err := syscall.OS.(*LinuxOS).SysMadvise(b, advice) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysMkdirat(dirfd int, path string, mode uint32) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysMkdirat syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysMkdirat syscall.OS = linuxOS - syscall.Trap = unix.SYS_MKDIRAT syscall.Int0 = uintptr(dirfd) syscall.Ptr1 = path syscall.Int2 = uintptr(mode) @@ -810,13 +640,21 @@ func SyscallSysMkdirat(dirfd int, path string, mode uint32) (err error) { return } +//go:norace +func trampolineSysMkdirat(syscall *syscallabi.Syscall) { + dirfd := int(syscall.Int0) + path := syscall.Ptr1.(string) + mode := uint32(syscall.Int2) + err := syscall.OS.(*LinuxOS).SysMkdirat(dirfd, path, mode) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysMmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysMmap syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysMmap syscall.OS = linuxOS - syscall.Trap = unix.SYS_MMAP syscall.Int0 = uintptr(addr) syscall.Int1 = uintptr(length) syscall.Int2 = uintptr(prot) @@ -829,13 +667,25 @@ func SyscallSysMmap(addr uintptr, length uintptr, prot int, flags int, fd int, o return } +//go:norace +func trampolineSysMmap(syscall *syscallabi.Syscall) { + addr := uintptr(syscall.Int0) + length := uintptr(syscall.Int1) + prot := int(syscall.Int2) + flags := int(syscall.Int3) + fd := int(syscall.Int4) + offset := int64(syscall.Int5) + xaddr, err := syscall.OS.(*LinuxOS).SysMmap(addr, length, prot, flags, fd, offset) + syscall.R0 = uintptr(xaddr) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysMunmap(addr uintptr, length uintptr) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysMunmap syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysMunmap syscall.OS = linuxOS - syscall.Trap = unix.SYS_MUNMAP syscall.Int0 = uintptr(addr) syscall.Int1 = uintptr(length) linuxOS.dispatchSyscall(syscall) @@ -843,13 +693,20 @@ func SyscallSysMunmap(addr uintptr, length uintptr) (err error) { return } +//go:norace +func trampolineSysMunmap(syscall *syscallabi.Syscall) { + addr := uintptr(syscall.Int0) + length := uintptr(syscall.Int1) + err := syscall.OS.(*LinuxOS).SysMunmap(addr, length) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysNewfstatat(fd int, path string, stat *Stat_t, flags int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysNewfstatat syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysNewfstatat syscall.OS = linuxOS - syscall.Trap = unix.SYS_NEWFSTATAT syscall.Int0 = uintptr(fd) syscall.Ptr1 = path syscall.Ptr2 = stat @@ -861,13 +718,22 @@ func SyscallSysNewfstatat(fd int, path string, stat *Stat_t, flags int) (err err return } +//go:norace +func trampolineSysNewfstatat(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + path := syscall.Ptr1.(string) + stat := syscallabi.NewValueView(syscall.Ptr2.(*Stat_t)) + flags := int(syscall.Int3) + err := syscall.OS.(*LinuxOS).SysNewfstatat(fd, path, stat, flags) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysOpenat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysOpenat syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysOpenat syscall.OS = linuxOS - syscall.Trap = unix.SYS_OPENAT syscall.Int0 = uintptr(dirfd) syscall.Ptr1 = path syscall.Int2 = uintptr(flags) @@ -879,13 +745,23 @@ func SyscallSysOpenat(dirfd int, path string, flags int, mode uint32) (fd int, e return } +//go:norace +func trampolineSysOpenat(syscall *syscallabi.Syscall) { + dirfd := int(syscall.Int0) + path := syscall.Ptr1.(string) + flags := int(syscall.Int2) + mode := uint32(syscall.Int3) + fd, err := syscall.OS.(*LinuxOS).SysOpenat(dirfd, path, flags, mode) + syscall.R0 = uintptr(fd) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysPread64(fd int, p []byte, offset int64) (n int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysPread64 syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysPread64 syscall.OS = linuxOS - syscall.Trap = unix.SYS_PREAD64 syscall.Int0 = uintptr(fd) syscall.Ptr1, syscall.Int1 = unsafe.SliceData(p), uintptr(len(p)) syscall.Int2 = uintptr(offset) @@ -896,13 +772,22 @@ func SyscallSysPread64(fd int, p []byte, offset int64) (n int, err error) { return } +//go:norace +func trampolineSysPread64(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) + offset := int64(syscall.Int2) + n, err := syscall.OS.(*LinuxOS).SysPread64(fd, p, offset) + syscall.R0 = uintptr(n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysPwrite64(fd int, p []byte, offset int64) (n int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysPwrite64 syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysPwrite64 syscall.OS = linuxOS - syscall.Trap = unix.SYS_PWRITE64 syscall.Int0 = uintptr(fd) syscall.Ptr1, syscall.Int1 = unsafe.SliceData(p), uintptr(len(p)) syscall.Int2 = uintptr(offset) @@ -913,13 +798,22 @@ func SyscallSysPwrite64(fd int, p []byte, offset int64) (n int, err error) { return } +//go:norace +func trampolineSysPwrite64(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) + offset := int64(syscall.Int2) + n, err := syscall.OS.(*LinuxOS).SysPwrite64(fd, p, offset) + syscall.R0 = uintptr(n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysRead(fd int, p []byte) (n int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysRead syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysRead syscall.OS = linuxOS - syscall.Trap = unix.SYS_READ syscall.Int0 = uintptr(fd) syscall.Ptr1, syscall.Int1 = unsafe.SliceData(p), uintptr(len(p)) linuxOS.dispatchSyscall(syscall) @@ -929,13 +823,21 @@ func SyscallSysRead(fd int, p []byte) (n int, err error) { return } +//go:norace +func trampolineSysRead(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) + n, err := syscall.OS.(*LinuxOS).SysRead(fd, p) + syscall.R0 = uintptr(n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysRenameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysRenameat syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysRenameat syscall.OS = linuxOS - syscall.Trap = unix.SYS_RENAMEAT syscall.Int0 = uintptr(olddirfd) syscall.Ptr1 = oldpath syscall.Int2 = uintptr(newdirfd) @@ -947,13 +849,22 @@ func SyscallSysRenameat(olddirfd int, oldpath string, newdirfd int, newpath stri return } +//go:norace +func trampolineSysRenameat(syscall *syscallabi.Syscall) { + olddirfd := int(syscall.Int0) + oldpath := syscall.Ptr1.(string) + newdirfd := int(syscall.Int2) + newpath := syscall.Ptr3.(string) + err := syscall.OS.(*LinuxOS).SysRenameat(olddirfd, oldpath, newdirfd, newpath) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysSetsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysSetsockopt syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysSetsockopt syscall.OS = linuxOS - syscall.Trap = unix.SYS_SETSOCKOPT syscall.Int0 = uintptr(s) syscall.Int1 = uintptr(level) syscall.Int2 = uintptr(name) @@ -965,13 +876,23 @@ func SyscallSysSetsockopt(s int, level int, name int, val unsafe.Pointer, vallen return } +//go:norace +func trampolineSysSetsockopt(syscall *syscallabi.Syscall) { + s := int(syscall.Int0) + level := int(syscall.Int1) + name := int(syscall.Int2) + val := syscall.Ptr3.(unsafe.Pointer) + vallen := uintptr(syscall.Int4) + err := syscall.OS.(*LinuxOS).SysSetsockopt(s, level, name, val, vallen) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysSocket(domain int, typ int, proto int) (fd int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysSocket syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysSocket syscall.OS = linuxOS - syscall.Trap = unix.SYS_SOCKET syscall.Int0 = uintptr(domain) syscall.Int1 = uintptr(typ) syscall.Int2 = uintptr(proto) @@ -981,13 +902,22 @@ func SyscallSysSocket(domain int, typ int, proto int) (fd int, err error) { return } +//go:norace +func trampolineSysSocket(syscall *syscallabi.Syscall) { + domain := int(syscall.Int0) + typ := int(syscall.Int1) + proto := int(syscall.Int2) + fd, err := syscall.OS.(*LinuxOS).SysSocket(domain, typ, proto) + syscall.R0 = uintptr(fd) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysUname(buf *Utsname) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysUname syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysUname syscall.OS = linuxOS - syscall.Trap = unix.SYS_UNAME syscall.Ptr0 = buf linuxOS.dispatchSyscall(syscall) err = syscallabi.ErrnoErr(syscall.Errno) @@ -995,13 +925,19 @@ func SyscallSysUname(buf *Utsname) (err error) { return } +//go:norace +func trampolineSysUname(syscall *syscallabi.Syscall) { + buf := syscallabi.NewValueView(syscall.Ptr0.(*Utsname)) + err := syscall.OS.(*LinuxOS).SysUname(buf) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysUnlinkat(dirfd int, path string, flags int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysUnlinkat syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysUnlinkat syscall.OS = linuxOS - syscall.Trap = unix.SYS_UNLINKAT syscall.Int0 = uintptr(dirfd) syscall.Ptr1 = path syscall.Int2 = uintptr(flags) @@ -1011,13 +947,21 @@ func SyscallSysUnlinkat(dirfd int, path string, flags int) (err error) { return } +//go:norace +func trampolineSysUnlinkat(syscall *syscallabi.Syscall) { + dirfd := int(syscall.Int0) + path := syscall.Ptr1.(string) + flags := int(syscall.Int2) + err := syscall.OS.(*LinuxOS).SysUnlinkat(dirfd, path, flags) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysWrite(fd int, p []byte) (n int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysWrite syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysWrite syscall.OS = linuxOS - syscall.Trap = unix.SYS_WRITE syscall.Int0 = uintptr(fd) syscall.Ptr1, syscall.Int1 = unsafe.SliceData(p), uintptr(len(p)) linuxOS.dispatchSyscall(syscall) @@ -1027,6 +971,16 @@ func SyscallSysWrite(fd int, p []byte) (n int, err error) { return } +//go:norace +func trampolineSysWrite(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) + n, err := syscall.OS.(*LinuxOS).SysWrite(fd, p) + syscall.R0 = uintptr(n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + func IsHandledSyscall(trap uintptr) bool { switch trap { case unix.SYS_ACCEPT4: diff --git a/internal/simulation/linux_gensyscall_arm64.go b/internal/simulation/linux_gensyscall_arm64.go index dccb27a..af45c6a 100644 --- a/internal/simulation/linux_gensyscall_arm64.go +++ b/internal/simulation/linux_gensyscall_arm64.go @@ -80,361 +80,11 @@ func (os *LinuxOS) dispatchSyscall(s *syscallabi.Syscall) { os.dispatcher.Dispatch(s) } -//go:norace -func (os *LinuxOS) HandleSyscall(syscall *syscallabi.Syscall) { - switch syscall.Trap { - case 1001: - // called by (for find references): - _ = SyscallPollClose - fd := int(syscall.Int0) - desc := syscallabi.NewValueView(syscall.Ptr1.(*syscallabi.PollDesc)) - code := os.PollClose(fd, desc) - syscall.R0 = uintptr(code) - syscall.Complete() - case 1000: - // called by (for find references): - _ = SyscallPollOpen - fd := int(syscall.Int0) - desc := syscallabi.NewValueView(syscall.Ptr1.(*syscallabi.PollDesc)) - code := os.PollOpen(fd, desc) - syscall.R0 = uintptr(code) - syscall.Complete() - case unix.SYS_ACCEPT4: - // called by (for find references): - _ = SyscallSysAccept4 - s := int(syscall.Int0) - rsa := syscallabi.NewValueView(syscall.Ptr1.(*RawSockaddrAny)) - addrlen := syscallabi.NewValueView(syscall.Ptr2.(*Socklen)) - flags := int(syscall.Int3) - fd, err := os.SysAccept4(s, rsa, addrlen, flags) - syscall.R0 = uintptr(fd) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_BIND: - // called by (for find references): - _ = SyscallSysBind - s := int(syscall.Int0) - addr := syscall.Ptr1.(unsafe.Pointer) - addrlen := Socklen(syscall.Int2) - err := os.SysBind(s, addr, addrlen) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_CHDIR: - // called by (for find references): - _ = SyscallSysChdir - path := syscall.Ptr0.(string) - err := os.SysChdir(path) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_CLOSE: - // called by (for find references): - _ = SyscallSysClose - fd := int(syscall.Int0) - err := os.SysClose(fd) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_CONNECT: - // called by (for find references): - _ = SyscallSysConnect - s := int(syscall.Int0) - addr := syscall.Ptr1.(unsafe.Pointer) - addrlen := Socklen(syscall.Int2) - err := os.SysConnect(s, addr, addrlen) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FALLOCATE: - // called by (for find references): - _ = SyscallSysFallocate - fd := int(syscall.Int0) - mode := uint32(syscall.Int1) - off := int64(syscall.Int2) - len := int64(syscall.Int3) - err := os.SysFallocate(fd, mode, off, len) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FCNTL: - // called by (for find references): - _ = SyscallSysFcntl - fd := int(syscall.Int0) - cmd := int(syscall.Int1) - arg := int(syscall.Int2) - val, err := os.SysFcntl(fd, cmd, arg) - syscall.R0 = uintptr(val) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FDATASYNC: - // called by (for find references): - _ = SyscallSysFdatasync - fd := int(syscall.Int0) - err := os.SysFdatasync(fd) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FLOCK: - // called by (for find references): - _ = SyscallSysFlock - fd := int(syscall.Int0) - how := int(syscall.Int1) - err := os.SysFlock(fd, how) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FSTAT: - // called by (for find references): - _ = SyscallSysFstat - fd := int(syscall.Int0) - stat := syscallabi.NewValueView(syscall.Ptr1.(*Stat_t)) - err := os.SysFstat(fd, stat) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FSTATAT: - // called by (for find references): - _ = SyscallSysFstatat - dirfd := int(syscall.Int0) - path := syscall.Ptr1.(string) - stat := syscallabi.NewValueView(syscall.Ptr2.(*Stat_t)) - flags := int(syscall.Int3) - err := os.SysFstatat(dirfd, path, stat, flags) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FSYNC: - // called by (for find references): - _ = SyscallSysFsync - fd := int(syscall.Int0) - err := os.SysFsync(fd) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_FTRUNCATE: - // called by (for find references): - _ = SyscallSysFtruncate - fd := int(syscall.Int0) - length := int64(syscall.Int1) - err := os.SysFtruncate(fd, length) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_GETCWD: - // called by (for find references): - _ = SyscallSysGetcwd - buf := syscallabi.NewSliceView(syscall.Ptr0.(*byte), syscall.Int0) - n, err := os.SysGetcwd(buf) - syscall.R0 = uintptr(n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_GETDENTS64: - // called by (for find references): - _ = SyscallSysGetdents64 - fd := int(syscall.Int0) - buf := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) - n, err := os.SysGetdents64(fd, buf) - syscall.R0 = uintptr(n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_GETPEERNAME: - // called by (for find references): - _ = SyscallSysGetpeername - fd := int(syscall.Int0) - rsa := syscallabi.NewValueView(syscall.Ptr1.(*RawSockaddrAny)) - addrlen := syscallabi.NewValueView(syscall.Ptr2.(*Socklen)) - err := os.SysGetpeername(fd, rsa, addrlen) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_GETPID: - // called by (for find references): - _ = SyscallSysGetpid - pid := os.SysGetpid() - syscall.R0 = uintptr(pid) - syscall.Complete() - case unix.SYS_GETRANDOM: - // called by (for find references): - _ = SyscallSysGetrandom - buf := syscallabi.NewSliceView(syscall.Ptr0.(*byte), syscall.Int0) - flags := int(syscall.Int1) - n, err := os.SysGetrandom(buf, flags) - syscall.R0 = uintptr(n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_GETSOCKNAME: - // called by (for find references): - _ = SyscallSysGetsockname - fd := int(syscall.Int0) - rsa := syscallabi.NewValueView(syscall.Ptr1.(*RawSockaddrAny)) - addrlen := syscallabi.NewValueView(syscall.Ptr2.(*Socklen)) - err := os.SysGetsockname(fd, rsa, addrlen) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_GETSOCKOPT: - // called by (for find references): - _ = SyscallSysGetsockopt - s := int(syscall.Int0) - level := int(syscall.Int1) - name := int(syscall.Int2) - val := syscall.Ptr3.(unsafe.Pointer) - vallen := syscallabi.NewValueView(syscall.Ptr4.(*Socklen)) - err := os.SysGetsockopt(s, level, name, val, vallen) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_LISTEN: - // called by (for find references): - _ = SyscallSysListen - s := int(syscall.Int0) - n := int(syscall.Int1) - err := os.SysListen(s, n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_LSEEK: - // called by (for find references): - _ = SyscallSysLseek - fd := int(syscall.Int0) - offset := int64(syscall.Int1) - whence := int(syscall.Int2) - off, err := os.SysLseek(fd, offset, whence) - syscall.R0 = uintptr(off) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_MADVISE: - // called by (for find references): - _ = SyscallSysMadvise - b := syscallabi.NewSliceView(syscall.Ptr0.(*byte), syscall.Int0) - advice := int(syscall.Int1) - err := os.SysMadvise(b, advice) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_MKDIRAT: - // called by (for find references): - _ = SyscallSysMkdirat - dirfd := int(syscall.Int0) - path := syscall.Ptr1.(string) - mode := uint32(syscall.Int2) - err := os.SysMkdirat(dirfd, path, mode) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_MMAP: - // called by (for find references): - _ = SyscallSysMmap - addr := uintptr(syscall.Int0) - length := uintptr(syscall.Int1) - prot := int(syscall.Int2) - flags := int(syscall.Int3) - fd := int(syscall.Int4) - offset := int64(syscall.Int5) - xaddr, err := os.SysMmap(addr, length, prot, flags, fd, offset) - syscall.R0 = uintptr(xaddr) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_MUNMAP: - // called by (for find references): - _ = SyscallSysMunmap - addr := uintptr(syscall.Int0) - length := uintptr(syscall.Int1) - err := os.SysMunmap(addr, length) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_OPENAT: - // called by (for find references): - _ = SyscallSysOpenat - dirfd := int(syscall.Int0) - path := syscall.Ptr1.(string) - flags := int(syscall.Int2) - mode := uint32(syscall.Int3) - fd, err := os.SysOpenat(dirfd, path, flags, mode) - syscall.R0 = uintptr(fd) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_PREAD64: - // called by (for find references): - _ = SyscallSysPread64 - fd := int(syscall.Int0) - p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) - offset := int64(syscall.Int2) - n, err := os.SysPread64(fd, p, offset) - syscall.R0 = uintptr(n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_PWRITE64: - // called by (for find references): - _ = SyscallSysPwrite64 - fd := int(syscall.Int0) - p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) - offset := int64(syscall.Int2) - n, err := os.SysPwrite64(fd, p, offset) - syscall.R0 = uintptr(n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_READ: - // called by (for find references): - _ = SyscallSysRead - fd := int(syscall.Int0) - p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) - n, err := os.SysRead(fd, p) - syscall.R0 = uintptr(n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_RENAMEAT: - // called by (for find references): - _ = SyscallSysRenameat - olddirfd := int(syscall.Int0) - oldpath := syscall.Ptr1.(string) - newdirfd := int(syscall.Int2) - newpath := syscall.Ptr3.(string) - err := os.SysRenameat(olddirfd, oldpath, newdirfd, newpath) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_SETSOCKOPT: - // called by (for find references): - _ = SyscallSysSetsockopt - s := int(syscall.Int0) - level := int(syscall.Int1) - name := int(syscall.Int2) - val := syscall.Ptr3.(unsafe.Pointer) - vallen := uintptr(syscall.Int4) - err := os.SysSetsockopt(s, level, name, val, vallen) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_SOCKET: - // called by (for find references): - _ = SyscallSysSocket - domain := int(syscall.Int0) - typ := int(syscall.Int1) - proto := int(syscall.Int2) - fd, err := os.SysSocket(domain, typ, proto) - syscall.R0 = uintptr(fd) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_UNAME: - // called by (for find references): - _ = SyscallSysUname - buf := syscallabi.NewValueView(syscall.Ptr0.(*Utsname)) - err := os.SysUname(buf) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_UNLINKAT: - // called by (for find references): - _ = SyscallSysUnlinkat - dirfd := int(syscall.Int0) - path := syscall.Ptr1.(string) - flags := int(syscall.Int2) - err := os.SysUnlinkat(dirfd, path, flags) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - case unix.SYS_WRITE: - // called by (for find references): - _ = SyscallSysWrite - fd := int(syscall.Int0) - p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) - n, err := os.SysWrite(fd, p) - syscall.R0 = uintptr(n) - syscall.Errno = syscallabi.ErrErrno(err) - syscall.Complete() - default: - panic("bad") - } -} - //go:norace func SyscallPollClose(fd int, desc *syscallabi.PollDesc) (code int) { - // invokes (for go to definition): - _ = (*LinuxOS).PollClose syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolinePollClose syscall.OS = linuxOS - syscall.Trap = 1001 syscall.Int0 = uintptr(fd) syscall.Ptr1 = desc linuxOS.dispatchSyscall(syscall) @@ -443,13 +93,20 @@ func SyscallPollClose(fd int, desc *syscallabi.PollDesc) (code int) { return } +//go:norace +func trampolinePollClose(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + desc := syscallabi.NewValueView(syscall.Ptr1.(*syscallabi.PollDesc)) + code := syscall.OS.(*LinuxOS).PollClose(fd, desc) + syscall.R0 = uintptr(code) + syscall.Complete() +} + //go:norace func SyscallPollOpen(fd int, desc *syscallabi.PollDesc) (code int) { - // invokes (for go to definition): - _ = (*LinuxOS).PollOpen syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolinePollOpen syscall.OS = linuxOS - syscall.Trap = 1000 syscall.Int0 = uintptr(fd) syscall.Ptr1 = desc linuxOS.dispatchSyscall(syscall) @@ -458,13 +115,20 @@ func SyscallPollOpen(fd int, desc *syscallabi.PollDesc) (code int) { return } +//go:norace +func trampolinePollOpen(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + desc := syscallabi.NewValueView(syscall.Ptr1.(*syscallabi.PollDesc)) + code := syscall.OS.(*LinuxOS).PollOpen(fd, desc) + syscall.R0 = uintptr(code) + syscall.Complete() +} + //go:norace func SyscallSysAccept4(s int, rsa *RawSockaddrAny, addrlen *Socklen, flags int) (fd int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysAccept4 syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysAccept4 syscall.OS = linuxOS - syscall.Trap = unix.SYS_ACCEPT4 syscall.Int0 = uintptr(s) syscall.Ptr1 = rsa syscall.Ptr2 = addrlen @@ -477,13 +141,23 @@ func SyscallSysAccept4(s int, rsa *RawSockaddrAny, addrlen *Socklen, flags int) return } +//go:norace +func trampolineSysAccept4(syscall *syscallabi.Syscall) { + s := int(syscall.Int0) + rsa := syscallabi.NewValueView(syscall.Ptr1.(*RawSockaddrAny)) + addrlen := syscallabi.NewValueView(syscall.Ptr2.(*Socklen)) + flags := int(syscall.Int3) + fd, err := syscall.OS.(*LinuxOS).SysAccept4(s, rsa, addrlen, flags) + syscall.R0 = uintptr(fd) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysBind(s int, addr unsafe.Pointer, addrlen Socklen) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysBind syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysBind syscall.OS = linuxOS - syscall.Trap = unix.SYS_BIND syscall.Int0 = uintptr(s) syscall.Ptr1 = addr syscall.Int2 = uintptr(addrlen) @@ -493,13 +167,21 @@ func SyscallSysBind(s int, addr unsafe.Pointer, addrlen Socklen) (err error) { return } +//go:norace +func trampolineSysBind(syscall *syscallabi.Syscall) { + s := int(syscall.Int0) + addr := syscall.Ptr1.(unsafe.Pointer) + addrlen := Socklen(syscall.Int2) + err := syscall.OS.(*LinuxOS).SysBind(s, addr, addrlen) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysChdir(path string) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysChdir syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysChdir syscall.OS = linuxOS - syscall.Trap = unix.SYS_CHDIR syscall.Ptr0 = path linuxOS.dispatchSyscall(syscall) err = syscallabi.ErrnoErr(syscall.Errno) @@ -507,26 +189,38 @@ func SyscallSysChdir(path string) (err error) { return } +//go:norace +func trampolineSysChdir(syscall *syscallabi.Syscall) { + path := syscall.Ptr0.(string) + err := syscall.OS.(*LinuxOS).SysChdir(path) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysClose(fd int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysClose syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysClose syscall.OS = linuxOS - syscall.Trap = unix.SYS_CLOSE syscall.Int0 = uintptr(fd) linuxOS.dispatchSyscall(syscall) err = syscallabi.ErrnoErr(syscall.Errno) return } +//go:norace +func trampolineSysClose(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + err := syscall.OS.(*LinuxOS).SysClose(fd) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysConnect(s int, addr unsafe.Pointer, addrlen Socklen) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysConnect syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysConnect syscall.OS = linuxOS - syscall.Trap = unix.SYS_CONNECT syscall.Int0 = uintptr(s) syscall.Ptr1 = addr syscall.Int2 = uintptr(addrlen) @@ -536,13 +230,21 @@ func SyscallSysConnect(s int, addr unsafe.Pointer, addrlen Socklen) (err error) return } +//go:norace +func trampolineSysConnect(syscall *syscallabi.Syscall) { + s := int(syscall.Int0) + addr := syscall.Ptr1.(unsafe.Pointer) + addrlen := Socklen(syscall.Int2) + err := syscall.OS.(*LinuxOS).SysConnect(s, addr, addrlen) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFallocate(fd int, mode uint32, off int64, len int64) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFallocate syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFallocate syscall.OS = linuxOS - syscall.Trap = unix.SYS_FALLOCATE syscall.Int0 = uintptr(fd) syscall.Int1 = uintptr(mode) syscall.Int2 = uintptr(off) @@ -552,13 +254,22 @@ func SyscallSysFallocate(fd int, mode uint32, off int64, len int64) (err error) return } +//go:norace +func trampolineSysFallocate(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + mode := uint32(syscall.Int1) + off := int64(syscall.Int2) + len := int64(syscall.Int3) + err := syscall.OS.(*LinuxOS).SysFallocate(fd, mode, off, len) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFcntl(fd int, cmd int, arg int) (val int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFcntl syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFcntl syscall.OS = linuxOS - syscall.Trap = unix.SYS_FCNTL syscall.Int0 = uintptr(fd) syscall.Int1 = uintptr(cmd) syscall.Int2 = uintptr(arg) @@ -568,26 +279,41 @@ func SyscallSysFcntl(fd int, cmd int, arg int) (val int, err error) { return } +//go:norace +func trampolineSysFcntl(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + cmd := int(syscall.Int1) + arg := int(syscall.Int2) + val, err := syscall.OS.(*LinuxOS).SysFcntl(fd, cmd, arg) + syscall.R0 = uintptr(val) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFdatasync(fd int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFdatasync syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFdatasync syscall.OS = linuxOS - syscall.Trap = unix.SYS_FDATASYNC syscall.Int0 = uintptr(fd) linuxOS.dispatchSyscall(syscall) err = syscallabi.ErrnoErr(syscall.Errno) return } +//go:norace +func trampolineSysFdatasync(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + err := syscall.OS.(*LinuxOS).SysFdatasync(fd) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFlock(fd int, how int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFlock syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFlock syscall.OS = linuxOS - syscall.Trap = unix.SYS_FLOCK syscall.Int0 = uintptr(fd) syscall.Int1 = uintptr(how) linuxOS.dispatchSyscall(syscall) @@ -595,13 +321,20 @@ func SyscallSysFlock(fd int, how int) (err error) { return } +//go:norace +func trampolineSysFlock(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + how := int(syscall.Int1) + err := syscall.OS.(*LinuxOS).SysFlock(fd, how) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFstat(fd int, stat *Stat_t) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFstat syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFstat syscall.OS = linuxOS - syscall.Trap = unix.SYS_FSTAT syscall.Int0 = uintptr(fd) syscall.Ptr1 = stat linuxOS.dispatchSyscall(syscall) @@ -610,13 +343,20 @@ func SyscallSysFstat(fd int, stat *Stat_t) (err error) { return } +//go:norace +func trampolineSysFstat(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + stat := syscallabi.NewValueView(syscall.Ptr1.(*Stat_t)) + err := syscall.OS.(*LinuxOS).SysFstat(fd, stat) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFstatat syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFstatat syscall.OS = linuxOS - syscall.Trap = unix.SYS_FSTATAT syscall.Int0 = uintptr(dirfd) syscall.Ptr1 = path syscall.Ptr2 = stat @@ -628,26 +368,41 @@ func SyscallSysFstatat(dirfd int, path string, stat *Stat_t, flags int) (err err return } +//go:norace +func trampolineSysFstatat(syscall *syscallabi.Syscall) { + dirfd := int(syscall.Int0) + path := syscall.Ptr1.(string) + stat := syscallabi.NewValueView(syscall.Ptr2.(*Stat_t)) + flags := int(syscall.Int3) + err := syscall.OS.(*LinuxOS).SysFstatat(dirfd, path, stat, flags) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFsync(fd int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFsync syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFsync syscall.OS = linuxOS - syscall.Trap = unix.SYS_FSYNC syscall.Int0 = uintptr(fd) linuxOS.dispatchSyscall(syscall) err = syscallabi.ErrnoErr(syscall.Errno) return } +//go:norace +func trampolineSysFsync(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + err := syscall.OS.(*LinuxOS).SysFsync(fd) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysFtruncate(fd int, length int64) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysFtruncate syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysFtruncate syscall.OS = linuxOS - syscall.Trap = unix.SYS_FTRUNCATE syscall.Int0 = uintptr(fd) syscall.Int1 = uintptr(length) linuxOS.dispatchSyscall(syscall) @@ -655,13 +410,20 @@ func SyscallSysFtruncate(fd int, length int64) (err error) { return } +//go:norace +func trampolineSysFtruncate(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + length := int64(syscall.Int1) + err := syscall.OS.(*LinuxOS).SysFtruncate(fd, length) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysGetcwd(buf []byte) (n int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysGetcwd syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysGetcwd syscall.OS = linuxOS - syscall.Trap = unix.SYS_GETCWD syscall.Ptr0, syscall.Int0 = unsafe.SliceData(buf), uintptr(len(buf)) linuxOS.dispatchSyscall(syscall) n = int(syscall.R0) @@ -670,13 +432,20 @@ func SyscallSysGetcwd(buf []byte) (n int, err error) { return } +//go:norace +func trampolineSysGetcwd(syscall *syscallabi.Syscall) { + buf := syscallabi.NewSliceView(syscall.Ptr0.(*byte), syscall.Int0) + n, err := syscall.OS.(*LinuxOS).SysGetcwd(buf) + syscall.R0 = uintptr(n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysGetdents64(fd int, buf []byte) (n int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysGetdents64 syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysGetdents64 syscall.OS = linuxOS - syscall.Trap = unix.SYS_GETDENTS64 syscall.Int0 = uintptr(fd) syscall.Ptr1, syscall.Int1 = unsafe.SliceData(buf), uintptr(len(buf)) linuxOS.dispatchSyscall(syscall) @@ -686,13 +455,21 @@ func SyscallSysGetdents64(fd int, buf []byte) (n int, err error) { return } +//go:norace +func trampolineSysGetdents64(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + buf := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) + n, err := syscall.OS.(*LinuxOS).SysGetdents64(fd, buf) + syscall.R0 = uintptr(n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysGetpeername(fd int, rsa *RawSockaddrAny, addrlen *Socklen) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysGetpeername syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysGetpeername syscall.OS = linuxOS - syscall.Trap = unix.SYS_GETPEERNAME syscall.Int0 = uintptr(fd) syscall.Ptr1 = rsa syscall.Ptr2 = addrlen @@ -703,25 +480,38 @@ func SyscallSysGetpeername(fd int, rsa *RawSockaddrAny, addrlen *Socklen) (err e return } +//go:norace +func trampolineSysGetpeername(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + rsa := syscallabi.NewValueView(syscall.Ptr1.(*RawSockaddrAny)) + addrlen := syscallabi.NewValueView(syscall.Ptr2.(*Socklen)) + err := syscall.OS.(*LinuxOS).SysGetpeername(fd, rsa, addrlen) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysGetpid() (pid int) { - // invokes (for go to definition): - _ = (*LinuxOS).SysGetpid syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysGetpid syscall.OS = linuxOS - syscall.Trap = unix.SYS_GETPID linuxOS.dispatchSyscall(syscall) pid = int(syscall.R0) return } +//go:norace +func trampolineSysGetpid(syscall *syscallabi.Syscall) { + pid := syscall.OS.(*LinuxOS).SysGetpid() + syscall.R0 = uintptr(pid) + syscall.Complete() +} + //go:norace func SyscallSysGetrandom(buf []byte, flags int) (n int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysGetrandom syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysGetrandom syscall.OS = linuxOS - syscall.Trap = unix.SYS_GETRANDOM syscall.Ptr0, syscall.Int0 = unsafe.SliceData(buf), uintptr(len(buf)) syscall.Int1 = uintptr(flags) linuxOS.dispatchSyscall(syscall) @@ -731,13 +521,21 @@ func SyscallSysGetrandom(buf []byte, flags int) (n int, err error) { return } +//go:norace +func trampolineSysGetrandom(syscall *syscallabi.Syscall) { + buf := syscallabi.NewSliceView(syscall.Ptr0.(*byte), syscall.Int0) + flags := int(syscall.Int1) + n, err := syscall.OS.(*LinuxOS).SysGetrandom(buf, flags) + syscall.R0 = uintptr(n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysGetsockname(fd int, rsa *RawSockaddrAny, addrlen *Socklen) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysGetsockname syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysGetsockname syscall.OS = linuxOS - syscall.Trap = unix.SYS_GETSOCKNAME syscall.Int0 = uintptr(fd) syscall.Ptr1 = rsa syscall.Ptr2 = addrlen @@ -748,13 +546,21 @@ func SyscallSysGetsockname(fd int, rsa *RawSockaddrAny, addrlen *Socklen) (err e return } +//go:norace +func trampolineSysGetsockname(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + rsa := syscallabi.NewValueView(syscall.Ptr1.(*RawSockaddrAny)) + addrlen := syscallabi.NewValueView(syscall.Ptr2.(*Socklen)) + err := syscall.OS.(*LinuxOS).SysGetsockname(fd, rsa, addrlen) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysGetsockopt(s int, level int, name int, val unsafe.Pointer, vallen *Socklen) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysGetsockopt syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysGetsockopt syscall.OS = linuxOS - syscall.Trap = unix.SYS_GETSOCKOPT syscall.Int0 = uintptr(s) syscall.Int1 = uintptr(level) syscall.Int2 = uintptr(name) @@ -767,13 +573,23 @@ func SyscallSysGetsockopt(s int, level int, name int, val unsafe.Pointer, vallen return } +//go:norace +func trampolineSysGetsockopt(syscall *syscallabi.Syscall) { + s := int(syscall.Int0) + level := int(syscall.Int1) + name := int(syscall.Int2) + val := syscall.Ptr3.(unsafe.Pointer) + vallen := syscallabi.NewValueView(syscall.Ptr4.(*Socklen)) + err := syscall.OS.(*LinuxOS).SysGetsockopt(s, level, name, val, vallen) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysListen(s int, n int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysListen syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysListen syscall.OS = linuxOS - syscall.Trap = unix.SYS_LISTEN syscall.Int0 = uintptr(s) syscall.Int1 = uintptr(n) linuxOS.dispatchSyscall(syscall) @@ -781,13 +597,20 @@ func SyscallSysListen(s int, n int) (err error) { return } +//go:norace +func trampolineSysListen(syscall *syscallabi.Syscall) { + s := int(syscall.Int0) + n := int(syscall.Int1) + err := syscall.OS.(*LinuxOS).SysListen(s, n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysLseek(fd int, offset int64, whence int) (off int64, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysLseek syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysLseek syscall.OS = linuxOS - syscall.Trap = unix.SYS_LSEEK syscall.Int0 = uintptr(fd) syscall.Int1 = uintptr(offset) syscall.Int2 = uintptr(whence) @@ -797,13 +620,22 @@ func SyscallSysLseek(fd int, offset int64, whence int) (off int64, err error) { return } +//go:norace +func trampolineSysLseek(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + offset := int64(syscall.Int1) + whence := int(syscall.Int2) + off, err := syscall.OS.(*LinuxOS).SysLseek(fd, offset, whence) + syscall.R0 = uintptr(off) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysMadvise(b []byte, advice int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysMadvise syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysMadvise syscall.OS = linuxOS - syscall.Trap = unix.SYS_MADVISE syscall.Ptr0, syscall.Int0 = unsafe.SliceData(b), uintptr(len(b)) syscall.Int1 = uintptr(advice) linuxOS.dispatchSyscall(syscall) @@ -812,13 +644,20 @@ func SyscallSysMadvise(b []byte, advice int) (err error) { return } +//go:norace +func trampolineSysMadvise(syscall *syscallabi.Syscall) { + b := syscallabi.NewSliceView(syscall.Ptr0.(*byte), syscall.Int0) + advice := int(syscall.Int1) + err := syscall.OS.(*LinuxOS).SysMadvise(b, advice) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysMkdirat(dirfd int, path string, mode uint32) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysMkdirat syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysMkdirat syscall.OS = linuxOS - syscall.Trap = unix.SYS_MKDIRAT syscall.Int0 = uintptr(dirfd) syscall.Ptr1 = path syscall.Int2 = uintptr(mode) @@ -828,13 +667,21 @@ func SyscallSysMkdirat(dirfd int, path string, mode uint32) (err error) { return } +//go:norace +func trampolineSysMkdirat(syscall *syscallabi.Syscall) { + dirfd := int(syscall.Int0) + path := syscall.Ptr1.(string) + mode := uint32(syscall.Int2) + err := syscall.OS.(*LinuxOS).SysMkdirat(dirfd, path, mode) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysMmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysMmap syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysMmap syscall.OS = linuxOS - syscall.Trap = unix.SYS_MMAP syscall.Int0 = uintptr(addr) syscall.Int1 = uintptr(length) syscall.Int2 = uintptr(prot) @@ -847,13 +694,25 @@ func SyscallSysMmap(addr uintptr, length uintptr, prot int, flags int, fd int, o return } +//go:norace +func trampolineSysMmap(syscall *syscallabi.Syscall) { + addr := uintptr(syscall.Int0) + length := uintptr(syscall.Int1) + prot := int(syscall.Int2) + flags := int(syscall.Int3) + fd := int(syscall.Int4) + offset := int64(syscall.Int5) + xaddr, err := syscall.OS.(*LinuxOS).SysMmap(addr, length, prot, flags, fd, offset) + syscall.R0 = uintptr(xaddr) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysMunmap(addr uintptr, length uintptr) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysMunmap syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysMunmap syscall.OS = linuxOS - syscall.Trap = unix.SYS_MUNMAP syscall.Int0 = uintptr(addr) syscall.Int1 = uintptr(length) linuxOS.dispatchSyscall(syscall) @@ -861,13 +720,20 @@ func SyscallSysMunmap(addr uintptr, length uintptr) (err error) { return } +//go:norace +func trampolineSysMunmap(syscall *syscallabi.Syscall) { + addr := uintptr(syscall.Int0) + length := uintptr(syscall.Int1) + err := syscall.OS.(*LinuxOS).SysMunmap(addr, length) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysOpenat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysOpenat syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysOpenat syscall.OS = linuxOS - syscall.Trap = unix.SYS_OPENAT syscall.Int0 = uintptr(dirfd) syscall.Ptr1 = path syscall.Int2 = uintptr(flags) @@ -879,13 +745,23 @@ func SyscallSysOpenat(dirfd int, path string, flags int, mode uint32) (fd int, e return } +//go:norace +func trampolineSysOpenat(syscall *syscallabi.Syscall) { + dirfd := int(syscall.Int0) + path := syscall.Ptr1.(string) + flags := int(syscall.Int2) + mode := uint32(syscall.Int3) + fd, err := syscall.OS.(*LinuxOS).SysOpenat(dirfd, path, flags, mode) + syscall.R0 = uintptr(fd) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysPread64(fd int, p []byte, offset int64) (n int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysPread64 syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysPread64 syscall.OS = linuxOS - syscall.Trap = unix.SYS_PREAD64 syscall.Int0 = uintptr(fd) syscall.Ptr1, syscall.Int1 = unsafe.SliceData(p), uintptr(len(p)) syscall.Int2 = uintptr(offset) @@ -896,13 +772,22 @@ func SyscallSysPread64(fd int, p []byte, offset int64) (n int, err error) { return } +//go:norace +func trampolineSysPread64(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) + offset := int64(syscall.Int2) + n, err := syscall.OS.(*LinuxOS).SysPread64(fd, p, offset) + syscall.R0 = uintptr(n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysPwrite64(fd int, p []byte, offset int64) (n int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysPwrite64 syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysPwrite64 syscall.OS = linuxOS - syscall.Trap = unix.SYS_PWRITE64 syscall.Int0 = uintptr(fd) syscall.Ptr1, syscall.Int1 = unsafe.SliceData(p), uintptr(len(p)) syscall.Int2 = uintptr(offset) @@ -913,13 +798,22 @@ func SyscallSysPwrite64(fd int, p []byte, offset int64) (n int, err error) { return } +//go:norace +func trampolineSysPwrite64(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) + offset := int64(syscall.Int2) + n, err := syscall.OS.(*LinuxOS).SysPwrite64(fd, p, offset) + syscall.R0 = uintptr(n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysRead(fd int, p []byte) (n int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysRead syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysRead syscall.OS = linuxOS - syscall.Trap = unix.SYS_READ syscall.Int0 = uintptr(fd) syscall.Ptr1, syscall.Int1 = unsafe.SliceData(p), uintptr(len(p)) linuxOS.dispatchSyscall(syscall) @@ -929,13 +823,21 @@ func SyscallSysRead(fd int, p []byte) (n int, err error) { return } +//go:norace +func trampolineSysRead(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) + n, err := syscall.OS.(*LinuxOS).SysRead(fd, p) + syscall.R0 = uintptr(n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysRenameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysRenameat syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysRenameat syscall.OS = linuxOS - syscall.Trap = unix.SYS_RENAMEAT syscall.Int0 = uintptr(olddirfd) syscall.Ptr1 = oldpath syscall.Int2 = uintptr(newdirfd) @@ -947,13 +849,22 @@ func SyscallSysRenameat(olddirfd int, oldpath string, newdirfd int, newpath stri return } +//go:norace +func trampolineSysRenameat(syscall *syscallabi.Syscall) { + olddirfd := int(syscall.Int0) + oldpath := syscall.Ptr1.(string) + newdirfd := int(syscall.Int2) + newpath := syscall.Ptr3.(string) + err := syscall.OS.(*LinuxOS).SysRenameat(olddirfd, oldpath, newdirfd, newpath) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysSetsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysSetsockopt syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysSetsockopt syscall.OS = linuxOS - syscall.Trap = unix.SYS_SETSOCKOPT syscall.Int0 = uintptr(s) syscall.Int1 = uintptr(level) syscall.Int2 = uintptr(name) @@ -965,13 +876,23 @@ func SyscallSysSetsockopt(s int, level int, name int, val unsafe.Pointer, vallen return } +//go:norace +func trampolineSysSetsockopt(syscall *syscallabi.Syscall) { + s := int(syscall.Int0) + level := int(syscall.Int1) + name := int(syscall.Int2) + val := syscall.Ptr3.(unsafe.Pointer) + vallen := uintptr(syscall.Int4) + err := syscall.OS.(*LinuxOS).SysSetsockopt(s, level, name, val, vallen) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysSocket(domain int, typ int, proto int) (fd int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysSocket syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysSocket syscall.OS = linuxOS - syscall.Trap = unix.SYS_SOCKET syscall.Int0 = uintptr(domain) syscall.Int1 = uintptr(typ) syscall.Int2 = uintptr(proto) @@ -981,13 +902,22 @@ func SyscallSysSocket(domain int, typ int, proto int) (fd int, err error) { return } +//go:norace +func trampolineSysSocket(syscall *syscallabi.Syscall) { + domain := int(syscall.Int0) + typ := int(syscall.Int1) + proto := int(syscall.Int2) + fd, err := syscall.OS.(*LinuxOS).SysSocket(domain, typ, proto) + syscall.R0 = uintptr(fd) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysUname(buf *Utsname) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysUname syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysUname syscall.OS = linuxOS - syscall.Trap = unix.SYS_UNAME syscall.Ptr0 = buf linuxOS.dispatchSyscall(syscall) err = syscallabi.ErrnoErr(syscall.Errno) @@ -995,13 +925,19 @@ func SyscallSysUname(buf *Utsname) (err error) { return } +//go:norace +func trampolineSysUname(syscall *syscallabi.Syscall) { + buf := syscallabi.NewValueView(syscall.Ptr0.(*Utsname)) + err := syscall.OS.(*LinuxOS).SysUname(buf) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysUnlinkat(dirfd int, path string, flags int) (err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysUnlinkat syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysUnlinkat syscall.OS = linuxOS - syscall.Trap = unix.SYS_UNLINKAT syscall.Int0 = uintptr(dirfd) syscall.Ptr1 = path syscall.Int2 = uintptr(flags) @@ -1011,13 +947,21 @@ func SyscallSysUnlinkat(dirfd int, path string, flags int) (err error) { return } +//go:norace +func trampolineSysUnlinkat(syscall *syscallabi.Syscall) { + dirfd := int(syscall.Int0) + path := syscall.Ptr1.(string) + flags := int(syscall.Int2) + err := syscall.OS.(*LinuxOS).SysUnlinkat(dirfd, path, flags) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + //go:norace func SyscallSysWrite(fd int, p []byte) (n int, err error) { - // invokes (for go to definition): - _ = (*LinuxOS).SysWrite syscall := syscallabi.GetGoroutineLocalSyscall() + syscall.Trampoline = trampolineSysWrite syscall.OS = linuxOS - syscall.Trap = unix.SYS_WRITE syscall.Int0 = uintptr(fd) syscall.Ptr1, syscall.Int1 = unsafe.SliceData(p), uintptr(len(p)) linuxOS.dispatchSyscall(syscall) @@ -1027,6 +971,16 @@ func SyscallSysWrite(fd int, p []byte) (n int, err error) { return } +//go:norace +func trampolineSysWrite(syscall *syscallabi.Syscall) { + fd := int(syscall.Int0) + p := syscallabi.NewSliceView(syscall.Ptr1.(*byte), syscall.Int1) + n, err := syscall.OS.(*LinuxOS).SysWrite(fd, p) + syscall.R0 = uintptr(n) + syscall.Errno = syscallabi.ErrErrno(err) + syscall.Complete() +} + func IsHandledSyscall(trap uintptr) bool { switch trap { case unix.SYS_ACCEPT4: diff --git a/internal/simulation/syscallabi/syscall.go b/internal/simulation/syscallabi/syscall.go index 44c4510..9c2a6fc 100644 --- a/internal/simulation/syscallabi/syscall.go +++ b/internal/simulation/syscallabi/syscall.go @@ -35,9 +35,9 @@ func GetGoroutineLocalSyscall() *Syscall { // Syscalls are different from upcalls, which calls in this package from user // goroutines that execute code on the scheduler goroutine. type Syscall struct { - OS OS + Trampoline func(*Syscall) + OS any - Trap uintptr Int0, Int1, Int2, Int3, Int4, Int5 uintptr Ptr0, Ptr1, Ptr2, Ptr3, Ptr4 any R0, R1 uintptr @@ -47,13 +47,6 @@ type Syscall struct { Sema uint32 } -// OS is the interface for types that implement the syscall logic. -// -// Implementations of this interface are generated by gensyscall. -type OS interface { - HandleSyscall(*Syscall) -} - // Wait waits for the system call to be completed. func (u *Syscall) Wait() { gosimruntime.Semacquire(&u.Sema, false) @@ -65,8 +58,8 @@ func (u *Syscall) Complete() { } // The Dispatcher is the bridge between user space code and OS code. User space -// goroutines call Dispatcher.Dispatch and the dispatcher runs OS.HandleSyscall -// on the OS goroutine. +// goroutines call Dispatcher.Dispatch and the dispatcher runs Syscall.Trap on +// the OS goroutine. type Dispatcher struct { syscalls chan *Syscall } @@ -83,7 +76,7 @@ func NewDispatcher() Dispatcher { // //go:norace func handleSyscall(syscall *Syscall) { - syscall.OS.HandleSyscall(syscall) + syscall.Trampoline(syscall) } func (b Dispatcher) Run() {