Blame vendor/golang.org/x/sys/unix/syscall_linux_arm.go

Packit 63bb0d
// Copyright 2009 The Go Authors. All rights reserved.
Packit 63bb0d
// Use of this source code is governed by a BSD-style
Packit 63bb0d
// license that can be found in the LICENSE file.
Packit 63bb0d
Packit 63bb0d
// +build arm,linux
Packit 63bb0d
Packit 63bb0d
package unix
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"syscall"
Packit 63bb0d
	"unsafe"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
func setTimespec(sec, nsec int64) Timespec {
Packit 63bb0d
	return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func setTimeval(sec, usec int64) Timeval {
Packit 63bb0d
	return Timeval{Sec: int32(sec), Usec: int32(usec)}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
//sysnb	pipe(p *[2]_C_int) (err error)
Packit 63bb0d
Packit 63bb0d
func Pipe(p []int) (err error) {
Packit 63bb0d
	if len(p) != 2 {
Packit 63bb0d
		return EINVAL
Packit 63bb0d
	}
Packit 63bb0d
	var pp [2]_C_int
Packit 63bb0d
	// Try pipe2 first for Android O, then try pipe for kernel 2.6.23.
Packit 63bb0d
	err = pipe2(&pp, 0)
Packit 63bb0d
	if err == ENOSYS {
Packit 63bb0d
		err = pipe(&pp)
Packit 63bb0d
	}
Packit 63bb0d
	p[0] = int(pp[0])
Packit 63bb0d
	p[1] = int(pp[1])
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
//sysnb pipe2(p *[2]_C_int, flags int) (err error)
Packit 63bb0d
Packit 63bb0d
func Pipe2(p []int, flags int) (err error) {
Packit 63bb0d
	if len(p) != 2 {
Packit 63bb0d
		return EINVAL
Packit 63bb0d
	}
Packit 63bb0d
	var pp [2]_C_int
Packit 63bb0d
	err = pipe2(&pp, flags)
Packit 63bb0d
	p[0] = int(pp[0])
Packit 63bb0d
	p[1] = int(pp[1])
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Underlying system call writes to newoffset via pointer.
Packit 63bb0d
// Implemented in assembly to avoid allocation.
Packit 63bb0d
func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno)
Packit 63bb0d
Packit 63bb0d
func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
Packit 63bb0d
	newoffset, errno := seek(fd, offset, whence)
Packit 63bb0d
	if errno != 0 {
Packit 63bb0d
		return 0, errno
Packit 63bb0d
	}
Packit 63bb0d
	return newoffset, nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
Packit 63bb0d
//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
Packit 63bb0d
//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
Packit 63bb0d
//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
Packit 63bb0d
//sysnb	getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32
Packit 63bb0d
//sysnb	setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32
Packit 63bb0d
//sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
Packit 63bb0d
//sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
Packit 63bb0d
//sysnb	socket(domain int, typ int, proto int) (fd int, err error)
Packit 63bb0d
//sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
Packit 63bb0d
//sysnb	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
Packit 63bb0d
//sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
Packit 63bb0d
//sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
Packit 63bb0d
//sysnb	socketpair(domain int, typ int, flags int, fd *[2]int32) (err error)
Packit 63bb0d
//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
Packit 63bb0d
//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
Packit 63bb0d
Packit 63bb0d
// 64-bit file system and 32-bit uid calls
Packit 63bb0d
// (16-bit uid calls are not always supported in newer kernels)
Packit 63bb0d
//sys	Dup2(oldfd int, newfd int) (err error)
Packit 63bb0d
//sysnb	EpollCreate(size int) (fd int, err error)
Packit 63bb0d
//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
Packit 63bb0d
//sys	Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
Packit 63bb0d
//sys	Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
Packit 63bb0d
//sys	Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
Packit 63bb0d
//sysnb	Getegid() (egid int) = SYS_GETEGID32
Packit 63bb0d
//sysnb	Geteuid() (euid int) = SYS_GETEUID32
Packit 63bb0d
//sysnb	Getgid() (gid int) = SYS_GETGID32
Packit 63bb0d
//sysnb	Getuid() (uid int) = SYS_GETUID32
Packit 63bb0d
//sysnb	InotifyInit() (fd int, err error)
Packit 63bb0d
//sys	Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32
Packit 63bb0d
//sys	Listen(s int, n int) (err error)
Packit 63bb0d
//sys	Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
Packit 63bb0d
//sys	Pause() (err error)
Packit 63bb0d
//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
Packit 63bb0d
//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
Packit 63bb0d
//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
Packit 63bb0d
//sys	setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32
Packit 63bb0d
//sys	setfsuid(uid int) (prev int, err error) = SYS_SETFSUID32
Packit 63bb0d
//sysnb	Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
Packit 63bb0d
//sysnb	Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
Packit 63bb0d
//sysnb	Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
Packit 63bb0d
//sysnb	Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32
Packit 63bb0d
//sys	Shutdown(fd int, how int) (err error)
Packit 63bb0d
//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
Packit 63bb0d
//sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
Packit 63bb0d
//sys	Ustat(dev int, ubuf *Ustat_t) (err error)
Packit 63bb0d
Packit 63bb0d
//sys	futimesat(dirfd int, path string, times *[2]Timeval) (err error)
Packit 63bb0d
//sysnb	Gettimeofday(tv *Timeval) (err error)
Packit 63bb0d
Packit 63bb0d
func Time(t *Time_t) (Time_t, error) {
Packit 63bb0d
	var tv Timeval
Packit 63bb0d
	err := Gettimeofday(&tv)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return 0, err
Packit 63bb0d
	}
Packit 63bb0d
	if t != nil {
Packit 63bb0d
		*t = Time_t(tv.Sec)
Packit 63bb0d
	}
Packit 63bb0d
	return Time_t(tv.Sec), nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func Utime(path string, buf *Utimbuf) error {
Packit 63bb0d
	tv := []Timeval{
Packit 63bb0d
		{Sec: buf.Actime},
Packit 63bb0d
		{Sec: buf.Modtime},
Packit 63bb0d
	}
Packit 63bb0d
	return Utimes(path, tv)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
//sys	utimes(path string, times *[2]Timeval) (err error)
Packit 63bb0d
Packit 63bb0d
//sys   Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
Packit 63bb0d
//sys   Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
Packit 63bb0d
//sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
Packit 63bb0d
//sys	Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
Packit 63bb0d
Packit 63bb0d
func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
Packit 63bb0d
	_, _, e1 := Syscall6(SYS_ARM_FADVISE64_64, uintptr(fd), uintptr(advice), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32))
Packit 63bb0d
	if e1 != 0 {
Packit 63bb0d
		err = errnoErr(e1)
Packit 63bb0d
	}
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
//sys	mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
Packit 63bb0d
Packit 63bb0d
func Fstatfs(fd int, buf *Statfs_t) (err error) {
Packit 63bb0d
	_, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
Packit 63bb0d
	if e != 0 {
Packit 63bb0d
		err = e
Packit 63bb0d
	}
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func Statfs(path string, buf *Statfs_t) (err error) {
Packit 63bb0d
	pathp, err := BytePtrFromString(path)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
	_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
Packit 63bb0d
	if e != 0 {
Packit 63bb0d
		err = e
Packit 63bb0d
	}
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
Packit 63bb0d
	page := uintptr(offset / 4096)
Packit 63bb0d
	if offset != int64(page)*4096 {
Packit 63bb0d
		return 0, EINVAL
Packit 63bb0d
	}
Packit 63bb0d
	return mmap2(addr, length, prot, flags, fd, page)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type rlimit32 struct {
Packit 63bb0d
	Cur uint32
Packit 63bb0d
	Max uint32
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_UGETRLIMIT
Packit 63bb0d
Packit 63bb0d
const rlimInf32 = ^uint32(0)
Packit 63bb0d
const rlimInf64 = ^uint64(0)
Packit 63bb0d
Packit 63bb0d
func Getrlimit(resource int, rlim *Rlimit) (err error) {
Packit 63bb0d
	err = prlimit(0, resource, nil, rlim)
Packit 63bb0d
	if err != ENOSYS {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	rl := rlimit32{}
Packit 63bb0d
	err = getrlimit(resource, &rl)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	if rl.Cur == rlimInf32 {
Packit 63bb0d
		rlim.Cur = rlimInf64
Packit 63bb0d
	} else {
Packit 63bb0d
		rlim.Cur = uint64(rl.Cur)
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	if rl.Max == rlimInf32 {
Packit 63bb0d
		rlim.Max = rlimInf64
Packit 63bb0d
	} else {
Packit 63bb0d
		rlim.Max = uint64(rl.Max)
Packit 63bb0d
	}
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
Packit 63bb0d
Packit 63bb0d
func Setrlimit(resource int, rlim *Rlimit) (err error) {
Packit 63bb0d
	err = prlimit(0, resource, rlim, nil)
Packit 63bb0d
	if err != ENOSYS {
Packit 63bb0d
		return err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	rl := rlimit32{}
Packit 63bb0d
	if rlim.Cur == rlimInf64 {
Packit 63bb0d
		rl.Cur = rlimInf32
Packit 63bb0d
	} else if rlim.Cur < uint64(rlimInf32) {
Packit 63bb0d
		rl.Cur = uint32(rlim.Cur)
Packit 63bb0d
	} else {
Packit 63bb0d
		return EINVAL
Packit 63bb0d
	}
Packit 63bb0d
	if rlim.Max == rlimInf64 {
Packit 63bb0d
		rl.Max = rlimInf32
Packit 63bb0d
	} else if rlim.Max < uint64(rlimInf32) {
Packit 63bb0d
		rl.Max = uint32(rlim.Max)
Packit 63bb0d
	} else {
Packit 63bb0d
		return EINVAL
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return setrlimit(resource, &rl)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) }
Packit 63bb0d
Packit 63bb0d
func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) }
Packit 63bb0d
Packit 63bb0d
func (iov *Iovec) SetLen(length int) {
Packit 63bb0d
	iov.Len = uint32(length)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (msghdr *Msghdr) SetControllen(length int) {
Packit 63bb0d
	msghdr.Controllen = uint32(length)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (msghdr *Msghdr) SetIovlen(length int) {
Packit 63bb0d
	msghdr.Iovlen = uint32(length)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (cmsg *Cmsghdr) SetLen(length int) {
Packit 63bb0d
	cmsg.Len = uint32(length)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
//sys	poll(fds *PollFd, nfds int, timeout int) (n int, err error)
Packit 63bb0d
Packit 63bb0d
func Poll(fds []PollFd, timeout int) (n int, err error) {
Packit 63bb0d
	if len(fds) == 0 {
Packit 63bb0d
		return poll(nil, 0, timeout)
Packit 63bb0d
	}
Packit 63bb0d
	return poll(&fds[0], len(fds), timeout)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
//sys	armSyncFileRange(fd int, flags int, off int64, n int64) (err error) = SYS_ARM_SYNC_FILE_RANGE
Packit 63bb0d
Packit 63bb0d
func SyncFileRange(fd int, off int64, n int64, flags int) error {
Packit 63bb0d
	// The sync_file_range and arm_sync_file_range syscalls differ only in the
Packit 63bb0d
	// order of their arguments.
Packit 63bb0d
	return armSyncFileRange(fd, flags, off, n)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
//sys	kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error)
Packit 63bb0d
Packit 63bb0d
func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error {
Packit 63bb0d
	cmdlineLen := len(cmdline)
Packit 63bb0d
	if cmdlineLen > 0 {
Packit 63bb0d
		// Account for the additional NULL byte added by
Packit 63bb0d
		// BytePtrFromString in kexecFileLoad. The kexec_file_load
Packit 63bb0d
		// syscall expects a NULL-terminated string.
Packit 63bb0d
		cmdlineLen++
Packit 63bb0d
	}
Packit 63bb0d
	return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags)
Packit 63bb0d
}