github.com/hbdrawn/golang@v0.0.0-20141214014649-6b835209aba2/src/syscall/syscall_linux_arm.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package syscall
     6  
     7  import "unsafe"
     8  
     9  func Getpagesize() int { return 4096 }
    10  
    11  func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
    12  
    13  func NsecToTimespec(nsec int64) (ts Timespec) {
    14  	ts.Sec = int32(nsec / 1e9)
    15  	ts.Nsec = int32(nsec % 1e9)
    16  	return
    17  }
    18  
    19  func NsecToTimeval(nsec int64) (tv Timeval) {
    20  	nsec += 999 // round up to microsecond
    21  	tv.Sec = int32(nsec / 1e9)
    22  	tv.Usec = int32(nsec % 1e9 / 1e3)
    23  	return
    24  }
    25  
    26  // Underlying system call writes to newoffset via pointer.
    27  // Implemented in assembly to avoid allocation.
    28  func seek(fd int, offset int64, whence int) (newoffset int64, err Errno)
    29  
    30  func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
    31  	newoffset, errno := seek(fd, offset, whence)
    32  	if errno != 0 {
    33  		return 0, errno
    34  	}
    35  	return newoffset, nil
    36  }
    37  
    38  //sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
    39  //sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
    40  //sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
    41  //sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
    42  //sysnb	getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32
    43  //sysnb	setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32
    44  //sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
    45  //sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
    46  //sysnb	socket(domain int, typ int, proto int) (fd int, err error)
    47  //sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
    48  //sysnb	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
    49  //sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
    50  //sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
    51  //sysnb	socketpair(domain int, typ int, flags int, fd *[2]int32) (err error)
    52  //sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
    53  //sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
    54  
    55  // 64-bit file system and 32-bit uid calls
    56  // (16-bit uid calls are not always supported in newer kernels)
    57  //sys	Chown(path string, uid int, gid int) (err error) = SYS_CHOWN32
    58  //sys	Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
    59  //sys	Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
    60  //sysnb	Getegid() (egid int) = SYS_GETEGID32
    61  //sysnb	Geteuid() (euid int) = SYS_GETEUID32
    62  //sysnb	Getgid() (gid int) = SYS_GETGID32
    63  //sysnb	Getuid() (uid int) = SYS_GETUID32
    64  //sys	Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32
    65  //sys	Listen(s int, n int) (err error)
    66  //sys	Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
    67  //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
    68  //sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
    69  //sys	Setfsgid(gid int) (err error) = SYS_SETFSGID32
    70  //sys	Setfsuid(uid int) (err error) = SYS_SETFSUID32
    71  //sysnb	Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
    72  //sysnb	Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
    73  //sysnb	Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
    74  //sysnb	Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32
    75  //sys	Shutdown(fd int, how int) (err error)
    76  //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
    77  //sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
    78  
    79  // Vsyscalls on amd64.
    80  //sysnb	Gettimeofday(tv *Timeval) (err error)
    81  //sysnb	Time(t *Time_t) (tt Time_t, err error)
    82  
    83  //sys   Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
    84  //sys   Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
    85  //sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
    86  //sys	Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
    87  
    88  //sys	mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
    89  
    90  func Fstatfs(fd int, buf *Statfs_t) (err error) {
    91  	_, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
    92  	if e != 0 {
    93  		err = e
    94  	}
    95  	return
    96  }
    97  
    98  func Statfs(path string, buf *Statfs_t) (err error) {
    99  	pathp, err := BytePtrFromString(path)
   100  	if err != nil {
   101  		return err
   102  	}
   103  	_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
   104  	use(unsafe.Pointer(pathp))
   105  	if e != 0 {
   106  		err = e
   107  	}
   108  	return
   109  }
   110  
   111  func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
   112  	page := uintptr(offset / 4096)
   113  	if offset != int64(page)*4096 {
   114  		return 0, EINVAL
   115  	}
   116  	return mmap2(addr, length, prot, flags, fd, page)
   117  }
   118  
   119  type rlimit32 struct {
   120  	Cur uint32
   121  	Max uint32
   122  }
   123  
   124  //sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT
   125  
   126  const rlimInf32 = ^uint32(0)
   127  const rlimInf64 = ^uint64(0)
   128  
   129  func Getrlimit(resource int, rlim *Rlimit) (err error) {
   130  	err = prlimit(0, resource, nil, rlim)
   131  	if err != ENOSYS {
   132  		return err
   133  	}
   134  
   135  	rl := rlimit32{}
   136  	err = getrlimit(resource, &rl)
   137  	if err != nil {
   138  		return
   139  	}
   140  
   141  	if rl.Cur == rlimInf32 {
   142  		rlim.Cur = rlimInf64
   143  	} else {
   144  		rlim.Cur = uint64(rl.Cur)
   145  	}
   146  
   147  	if rl.Max == rlimInf32 {
   148  		rlim.Max = rlimInf64
   149  	} else {
   150  		rlim.Max = uint64(rl.Max)
   151  	}
   152  	return
   153  }
   154  
   155  //sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
   156  
   157  func Setrlimit(resource int, rlim *Rlimit) (err error) {
   158  	err = prlimit(0, resource, rlim, nil)
   159  	if err != ENOSYS {
   160  		return err
   161  	}
   162  
   163  	rl := rlimit32{}
   164  	if rlim.Cur == rlimInf64 {
   165  		rl.Cur = rlimInf32
   166  	} else if rlim.Cur < uint64(rlimInf32) {
   167  		rl.Cur = uint32(rlim.Cur)
   168  	} else {
   169  		return EINVAL
   170  	}
   171  	if rlim.Max == rlimInf64 {
   172  		rl.Max = rlimInf32
   173  	} else if rlim.Max < uint64(rlimInf32) {
   174  		rl.Max = uint32(rlim.Max)
   175  	} else {
   176  		return EINVAL
   177  	}
   178  
   179  	return setrlimit(resource, &rl)
   180  }
   181  
   182  func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) }
   183  
   184  func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) }
   185  
   186  func (iov *Iovec) SetLen(length int) {
   187  	iov.Len = uint32(length)
   188  }
   189  
   190  func (msghdr *Msghdr) SetControllen(length int) {
   191  	msghdr.Controllen = uint32(length)
   192  }
   193  
   194  func (cmsg *Cmsghdr) SetLen(length int) {
   195  	cmsg.Len = uint32(length)
   196  }