diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index f6b5361a004..cca4a16e7ec 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -5fb74cd7192123a9ea06dcae0d5d8d0b3538db8f +90fe3da36d904b62d47c00ee40eef4fd2693a5da The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/libgo/go/cmd/go/internal/base/signal_unix.go b/libgo/go/cmd/go/internal/base/signal_unix.go index 4ca3da99226..b90f3a2f191 100644 --- a/libgo/go/cmd/go/internal/base/signal_unix.go +++ b/libgo/go/cmd/go/internal/base/signal_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris +// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris package base diff --git a/libgo/go/internal/poll/export_posix_test.go b/libgo/go/internal/poll/export_posix_test.go index 73b2c11e1e0..6b9bb8b7d0d 100644 --- a/libgo/go/internal/poll/export_posix_test.go +++ b/libgo/go/internal/poll/export_posix_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows +// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows // Export guts for testing on posix. // Since testing imports os and os imports internal/poll, diff --git a/libgo/go/internal/poll/fd_poll_runtime.go b/libgo/go/internal/poll/fd_poll_runtime.go index bfbe3c7de46..9de8af1598d 100644 --- a/libgo/go/internal/poll/fd_poll_runtime.go +++ b/libgo/go/internal/poll/fd_poll_runtime.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux netbsd openbsd windows solaris +// +build aix darwin dragonfly freebsd linux netbsd openbsd windows solaris package poll diff --git a/libgo/go/internal/poll/fd_posix.go b/libgo/go/internal/poll/fd_posix.go index e0e634cdb29..4e6e355728d 100644 --- a/libgo/go/internal/poll/fd_posix.go +++ b/libgo/go/internal/poll/fd_posix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows +// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows package poll diff --git a/libgo/go/internal/poll/fd_posix_test.go b/libgo/go/internal/poll/fd_posix_test.go index cbe015edbd1..246d4989e1c 100644 --- a/libgo/go/internal/poll/fd_posix_test.go +++ b/libgo/go/internal/poll/fd_posix_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows +// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows package poll_test diff --git a/libgo/go/internal/poll/fd_unix.go b/libgo/go/internal/poll/fd_unix.go index c40c701f59c..0b43a19590b 100644 --- a/libgo/go/internal/poll/fd_unix.go +++ b/libgo/go/internal/poll/fd_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris +// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris package poll diff --git a/libgo/go/internal/poll/hook_unix.go b/libgo/go/internal/poll/hook_unix.go index 85e102dd73e..4cf36cc6c09 100644 --- a/libgo/go/internal/poll/hook_unix.go +++ b/libgo/go/internal/poll/hook_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris +// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris package poll diff --git a/libgo/go/internal/poll/sockopt.go b/libgo/go/internal/poll/sockopt.go index f86ce707a12..bb5ea02c0a6 100644 --- a/libgo/go/internal/poll/sockopt.go +++ b/libgo/go/internal/poll/sockopt.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows package poll diff --git a/libgo/go/internal/poll/sockoptip.go b/libgo/go/internal/poll/sockoptip.go index 5d5dff6ebc9..ae59b0c7627 100644 --- a/libgo/go/internal/poll/sockoptip.go +++ b/libgo/go/internal/poll/sockoptip.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux netbsd openbsd windows +// +build aix darwin dragonfly freebsd linux netbsd openbsd windows package poll diff --git a/libgo/go/internal/poll/sys_cloexec.go b/libgo/go/internal/poll/sys_cloexec.go index 9ed35bdaf41..fb5f2bcd32a 100644 --- a/libgo/go/internal/poll/sys_cloexec.go +++ b/libgo/go/internal/poll/sys_cloexec.go @@ -5,7 +5,7 @@ // This file implements sysSocket and accept for platforms that do not // provide a fast path for setting SetNonblock and CloseOnExec. -// +build darwin nacl netbsd openbsd solaris +// +build aix darwin nacl netbsd openbsd solaris package poll diff --git a/libgo/go/net/error_posix.go b/libgo/go/net/error_posix.go index dd9754c841a..d0ffaaeba70 100644 --- a/libgo/go/net/error_posix.go +++ b/libgo/go/net/error_posix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows +// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows package net diff --git a/libgo/go/os/user/cgo_lookup_unix.go b/libgo/go/os/user/cgo_lookup_unix.go index 8881366cf9f..9670ada4942 100644 --- a/libgo/go/os/user/cgo_lookup_unix.go +++ b/libgo/go/os/user/cgo_lookup_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd !android,linux netbsd openbsd solaris +// +build aix darwin dragonfly freebsd !android,linux netbsd openbsd solaris // +build cgo package user diff --git a/libgo/go/runtime/export_unix_test.go b/libgo/go/runtime/export_unix_test.go index 54d577072ec..eecdfb7eb22 100644 --- a/libgo/go/runtime/export_unix_test.go +++ b/libgo/go/runtime/export_unix_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package runtime diff --git a/libgo/go/runtime/netpoll_aix.go b/libgo/go/runtime/netpoll_aix.go index 8c8e1882219..b4962cc6590 100644 --- a/libgo/go/runtime/netpoll_aix.go +++ b/libgo/go/runtime/netpoll_aix.go @@ -64,14 +64,14 @@ func netpollinit() { var p [2]int32 if ps = pollset_create(-1); ps < 0 { - throw("netpollinit: failed to create pollset") + throw("runtime: netpollinit failed to create pollset") } // It is not possible to add or remove descriptors from // the pollset while pollset_poll is active. // We use a pipe to wakeup pollset_poll when the pollset // needs to be updated. if err := libc_pipe(&p[0]); err < 0 { - throw("netpollinit: failed to create pipe") + throw("runtime: netpollinit failed to create pipe") } rdwake = p[0] wrwake = p[1] @@ -90,12 +90,17 @@ func netpollinit() { pctl.fd = rdwake pctl.events = _POLLIN if pollset_ctl(ps, &pctl, 1) != 0 { - throw("netpollinit: failed to register pipe") + throw("runtime: netpollinit failed to register pipe") } mpfds = make(map[int32]*pollDesc) } +func netpolldescriptor() uintptr { + // ps is not a real file descriptor. + return ^uintptr(0) +} + func netpollopen(fd uintptr, pd *pollDesc) int32 { // pollset_ctl will block if pollset_poll is active // so wakeup pollset_poll first. @@ -144,7 +149,7 @@ func netpollclose(fd uintptr) int32 { } func netpollarm(pd *pollDesc, mode int) { - throw("unused") + throw("runtime: unused") } func netpoll(block bool) *g { @@ -168,7 +173,7 @@ retry: if nfound < 0 { e := errno() if e != _EINTR { - throw("pollset_poll failed") + throw("runtime: pollset_poll failed") } goto retry } diff --git a/libgo/go/syscall/forkpipe_bsd.go b/libgo/go/syscall/forkpipe_bsd.go index 28897bfd790..d4792843407 100644 --- a/libgo/go/syscall/forkpipe_bsd.go +++ b/libgo/go/syscall/forkpipe_bsd.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly netbsd openbsd solaris +// +build aix darwin dragonfly netbsd openbsd solaris package syscall diff --git a/libgo/go/syscall/libcall_aix.go b/libgo/go/syscall/libcall_aix.go index 992eeb4d46f..072f92a8151 100644 --- a/libgo/go/syscall/libcall_aix.go +++ b/libgo/go/syscall/libcall_aix.go @@ -6,6 +6,136 @@ package syscall +import ( + "unsafe" +) + +//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) +//open64at(dirfd _C_int, path *byte, flags _C_int, mode Mode_t) _C_int + +//sys ptrace(request int, id int, addr uintptr, data int, buff uintptr) (val int) +//ptrace(request _C_int, id int, addr uintptr, data _C_int, buff *byte) _C_int + +//sys ptrace64(request int, id int64, addr int64, data int, buff uintptr) (err error) +//ptrace64(request _C_int, id int64, addr int64, data _C_int, buff *byte) _C_int + func raw_ptrace(request int, pid int, addr *byte, data *byte) Errno { + if request == _PTRACE_TRACEME { + // Convert to AIX ptrace call. + err := ptrace64(_PT_TRACE_ME, 0, 0, 0, 0) + if err != nil { + return err.(Errno) + } + return 0 + } return ENOSYS } + +func ptracePeek(pid int, addr uintptr, out []byte) (count int, err error) { + n := 0 + for len(out) > 0 { + bsize := len(out) + if bsize > 1024 { + bsize = 1024 + } + err = ptrace64(_PT_READ_BLOCK, int64(pid), int64(addr), bsize, uintptr(unsafe.Pointer(&out[0]))) + if err != nil { + return 0, err + } + addr += uintptr(bsize) + n += bsize + out = out[n:] + } + return n, nil +} + +func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(pid, addr, out) +} + +func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(pid, addr, out) +} + +func ptracePoke(pid int, addr uintptr, data []byte) (count int, err error) { + n := 0 + for len(data) > 0 { + bsize := len(data) + if bsize > 1024 { + bsize = 1024 + } + err = ptrace64(_PT_WRITE_BLOCK, int64(pid), int64(addr), bsize, uintptr(unsafe.Pointer(&data[0]))) + if err != nil { + return 0, err + } + addr += uintptr(bsize) + n += bsize + data = data[n:] + } + return n, nil +} + +func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(pid, addr, data) +} + +func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(pid, addr, data) +} + +func PtraceCont(pid int, signal int) (err error) { + return ptrace64(_PT_CONTINUE, int64(pid), 1, signal, 0) +} + +func PtraceSingleStep(pid int) (err error) { return ptrace64(_PT_STEP, int64(pid), 1, 0, 0) } + +func PtraceAttach(pid int) (err error) { return ptrace64(_PT_ATTACH, int64(pid), 0, 0, 0) } + +func PtraceDetach(pid int) (err error) { return ptrace64(_PT_DETACH, int64(pid), 0, 0, 0) } + +//sys reboot(how int) (err error) +//__linux_reboot(how _C_int) _C_int +func Reboot(how int) (err error) { + return reboot(how) +} + +//sys Acct(path string) (err error) +//acct(path *byte) _C_int + +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//faccessat(dirfd _C_int, pathname *byte, mode _C_int, flags _C_int) _C_int + +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//fchmodat(dirfd _C_int, pathname *byte, mode Mode_t, flags _C_int) _C_int + +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//fchownat(dirfd _C_int, path *byte, owner Uid_t, group Gid_t, flags _C_int) _C_int + +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//fstatfs64(fd _C_int, buf *Statfs_t) _C_int + +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//mkdirat(dirfd _C_int, path *byte, mode Mode_t) _C_int + +//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//mknodat(dirfd _C_int, path *byte, mode Mode_t, dev _dev_t) _C_int + +//sys getdirent(fd int, buf []byte) (n int, err error) +//getdirent64(fd _C_int, buf *byte, nbyte Size_t) _C_int + +func ReadDirent(fd int, buf []byte) (n int, err error) { + return getdirent(fd, buf) +} + +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) +//renameat(olddirfd _C_int, oldpath *byte, newdirfd _C_int, newpath *byte) _C_int + +//sys Statfs(path string, buf *Statfs_t) (err error) +//statfs64(path *byte, buf *Statfs_t) _C_int + +//sys unlinkat(dirfd int, path string, flags int) (err error) +//unlinkat(dirfd _C_int, path *byte, flags _C_int) _C_int + +func Unlinkat(dirfd int, path string) (err error) { + return unlinkat(dirfd, path, 0) +}