* [9fans] Golang support for Plan 9 @ 2010-12-26 15:54 Pavel Zholkover 2010-12-27 20:08 ` Skip Tavakkolian 0 siblings, 1 reply; 5+ messages in thread From: Pavel Zholkover @ 2010-12-26 15:54 UTC (permalink / raw) To: 9fans Hi all! I've pushed syscall and os package support for Plan 9 on x86 at http://codereview.appspot.com/3816043/ (pending a review). I had to make changes to the core go files, so keep your fingers crossed I didn't break anything along the way and get committed. If you have access to a real Plan 9 machine or inside qemu) please test (9vx does not seem to work, confirmed by Andrey Mirtchovski for early versions of code). (Reminder: -s needs to be passed to 8l, otherwise the binaries fail to run). Thanks, Pavel ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [9fans] Golang support for Plan 9 2010-12-26 15:54 [9fans] Golang support for Plan 9 Pavel Zholkover @ 2010-12-27 20:08 ` Skip Tavakkolian 2010-12-28 6:49 ` Pavel Zholkover 0 siblings, 1 reply; 5+ messages in thread From: Skip Tavakkolian @ 2010-12-27 20:08 UTC (permalink / raw) To: Fans of the OS Plan 9 from Bell Labs my hg-fu isn't very good; i'm not sure if this is the right way of applying the patch. using patch, one operation fails (it looks like the copy isn't done) fst@hpamd:~/go$ patch -p1 < ../issue3816043_9001.diff patching file src/pkg/os/Makefile patching file src/pkg/os/dir_plan9.go patching file src/pkg/os/env_plan9.go patching file src/pkg/os/error.go patching file src/pkg/os/error_plan9.go patching file src/pkg/os/error_posix.go patching file src/pkg/os/exec.go patching file src/pkg/os/exec.go Hunk #1 FAILED at 146. 1 out of 1 hunk FAILED -- saving rejects to file src/pkg/os/exec.go.rej patching file src/pkg/os/file.go patching file src/pkg/os/file_plan9.go patching file src/pkg/os/file_posix.go patching file src/pkg/os/proc.go patching file src/pkg/os/stat_plan9.go patching file src/pkg/os/sys_plan9.go patching file src/pkg/os/time.go patching file src/pkg/runtime/plan9/386/rt0.s patching file src/pkg/syscall/Makefile patching file src/pkg/syscall/asm_plan9_386.s patching file src/pkg/syscall/mkall.sh patching file src/pkg/syscall/mksyscall_plan9.awk patching file src/pkg/syscall/mksyscall_plan9.sh patching file src/pkg/syscall/mksysnum_plan9.sh patching file src/pkg/syscall/syscall.go patching file src/pkg/syscall/syscall_plan9.go patching file src/pkg/syscall/syscall_plan9_386.go patching file src/pkg/syscall/syscall_unix.go patching file src/pkg/syscall/types_plan9.c patching file src/pkg/syscall/zerrors_plan9_386.go patching file src/pkg/syscall/zsyscall_plan9_386.go patching file src/pkg/syscall/zsysnum_plan9_386.go patching file src/pkg/syscall/ztypes_plan9_386.go at any rate building on linux targeting plan9 and 386 arch (some tests fail), i can generate an output. running it on plan9 causes a protection violation: cpue% pwd /mnt/term/home/fst/test cpue% cat hell-o.go package main func main() { println("Hello, 世界") } cpue% ./8.hell-o 8.hell-o 19698: suicide: sys: trap: general protection violation pc=0x00007047 -Skip On Sun, Dec 26, 2010 at 7:54 AM, Pavel Zholkover <paulzhol@gmail.com> wrote: > Hi all! > > I've pushed syscall and os package support for Plan 9 on x86 at > http://codereview.appspot.com/3816043/ (pending a review). > I had to make changes to the core go files, so keep your fingers > crossed I didn't break anything along the way and get committed. > > If you have access to a real Plan 9 machine or inside qemu) please > test (9vx does not seem to work, confirmed by Andrey Mirtchovski for > early versions of code). > > (Reminder: -s needs to be passed to 8l, otherwise the binaries fail to run). > > Thanks, > Pavel > > ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [9fans] Golang support for Plan 9 2010-12-27 20:08 ` Skip Tavakkolian @ 2010-12-28 6:49 ` Pavel Zholkover 2010-12-28 7:24 ` Skip Tavakkolian 0 siblings, 1 reply; 5+ messages in thread From: Pavel Zholkover @ 2010-12-28 6:49 UTC (permalink / raw) To: Fans of the OS Plan 9 from Bell Labs The patch is against mainline tip, it also applies cleanly against release.2010-12-22 (and probably a few earlier ones). What version/release are you patching ? Did you link with -s (stripped symbols) when compiling on linux ? On Mon, Dec 27, 2010 at 10:08 PM, Skip Tavakkolian <skip.tavakkolian@gmail.com> wrote: > my hg-fu isn't very good; i'm not sure if this is the right way of > applying the patch. using patch, one operation fails (it looks like > the copy isn't done) > > fst@hpamd:~/go$ patch -p1 < ../issue3816043_9001.diff > patching file src/pkg/os/Makefile > patching file src/pkg/os/dir_plan9.go > patching file src/pkg/os/env_plan9.go > patching file src/pkg/os/error.go > patching file src/pkg/os/error_plan9.go > patching file src/pkg/os/error_posix.go > patching file src/pkg/os/exec.go > patching file src/pkg/os/exec.go > Hunk #1 FAILED at 146. > 1 out of 1 hunk FAILED -- saving rejects to file src/pkg/os/exec.go.rej > patching file src/pkg/os/file.go > patching file src/pkg/os/file_plan9.go > patching file src/pkg/os/file_posix.go > patching file src/pkg/os/proc.go > patching file src/pkg/os/stat_plan9.go > patching file src/pkg/os/sys_plan9.go > patching file src/pkg/os/time.go > patching file src/pkg/runtime/plan9/386/rt0.s > patching file src/pkg/syscall/Makefile > patching file src/pkg/syscall/asm_plan9_386.s > patching file src/pkg/syscall/mkall.sh > patching file src/pkg/syscall/mksyscall_plan9.awk > patching file src/pkg/syscall/mksyscall_plan9.sh > patching file src/pkg/syscall/mksysnum_plan9.sh > patching file src/pkg/syscall/syscall.go > patching file src/pkg/syscall/syscall_plan9.go > patching file src/pkg/syscall/syscall_plan9_386.go > patching file src/pkg/syscall/syscall_unix.go > patching file src/pkg/syscall/types_plan9.c > patching file src/pkg/syscall/zerrors_plan9_386.go > patching file src/pkg/syscall/zsyscall_plan9_386.go > patching file src/pkg/syscall/zsysnum_plan9_386.go > patching file src/pkg/syscall/ztypes_plan9_386.go > > at any rate building on linux targeting plan9 and 386 arch (some tests > fail), i can generate an output. running it on plan9 causes a > protection violation: > > cpue% pwd > /mnt/term/home/fst/test > cpue% cat hell-o.go > package main > > func main() { > println("Hello, 世界") > } > cpue% ./8.hell-o > 8.hell-o 19698: suicide: sys: trap: general protection violation pc=0x00007047 > > -Skip > > On Sun, Dec 26, 2010 at 7:54 AM, Pavel Zholkover <paulzhol@gmail.com> wrote: >> Hi all! >> >> I've pushed syscall and os package support for Plan 9 on x86 at >> http://codereview.appspot.com/3816043/ (pending a review). >> I had to make changes to the core go files, so keep your fingers >> crossed I didn't break anything along the way and get committed. >> >> If you have access to a real Plan 9 machine or inside qemu) please >> test (9vx does not seem to work, confirmed by Andrey Mirtchovski for >> early versions of code). >> >> (Reminder: -s needs to be passed to 8l, otherwise the binaries fail to run). >> >> Thanks, >> Pavel >> >> > > ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [9fans] Golang support for Plan 9 2010-12-28 6:49 ` Pavel Zholkover @ 2010-12-28 7:24 ` Skip Tavakkolian 2010-12-28 21:06 ` Pavel Zholkover 0 siblings, 1 reply; 5+ messages in thread From: Skip Tavakkolian @ 2010-12-28 7:24 UTC (permalink / raw) To: Fans of the OS Plan 9 from Bell Labs sorry for the noise; the -s was mentioned in your original post and i missed it. now hell-o example works. i'll try out a few more things. i checked out a complete release (fresh copy) earlier today before applying the patch; it had the same results (one patch failed to apply). $ hg identify 51c777dbccb9+ tip On Mon, Dec 27, 2010 at 10:49 PM, Pavel Zholkover <paulzhol@gmail.com> wrote: > The patch is against mainline tip, it also applies cleanly against > release.2010-12-22 (and probably a few earlier ones). > What version/release are you patching ? > > Did you link with -s (stripped symbols) when compiling on linux ? > > On Mon, Dec 27, 2010 at 10:08 PM, Skip Tavakkolian > <skip.tavakkolian@gmail.com> wrote: >> my hg-fu isn't very good; i'm not sure if this is the right way of >> applying the patch. using patch, one operation fails (it looks like >> the copy isn't done) >> >> fst@hpamd:~/go$ patch -p1 < ../issue3816043_9001.diff >> patching file src/pkg/os/Makefile >> patching file src/pkg/os/dir_plan9.go >> patching file src/pkg/os/env_plan9.go >> patching file src/pkg/os/error.go >> patching file src/pkg/os/error_plan9.go >> patching file src/pkg/os/error_posix.go >> patching file src/pkg/os/exec.go >> patching file src/pkg/os/exec.go >> Hunk #1 FAILED at 146. >> 1 out of 1 hunk FAILED -- saving rejects to file src/pkg/os/exec.go.rej >> patching file src/pkg/os/file.go >> patching file src/pkg/os/file_plan9.go >> patching file src/pkg/os/file_posix.go >> patching file src/pkg/os/proc.go >> patching file src/pkg/os/stat_plan9.go >> patching file src/pkg/os/sys_plan9.go >> patching file src/pkg/os/time.go >> patching file src/pkg/runtime/plan9/386/rt0.s >> patching file src/pkg/syscall/Makefile >> patching file src/pkg/syscall/asm_plan9_386.s >> patching file src/pkg/syscall/mkall.sh >> patching file src/pkg/syscall/mksyscall_plan9.awk >> patching file src/pkg/syscall/mksyscall_plan9.sh >> patching file src/pkg/syscall/mksysnum_plan9.sh >> patching file src/pkg/syscall/syscall.go >> patching file src/pkg/syscall/syscall_plan9.go >> patching file src/pkg/syscall/syscall_plan9_386.go >> patching file src/pkg/syscall/syscall_unix.go >> patching file src/pkg/syscall/types_plan9.c >> patching file src/pkg/syscall/zerrors_plan9_386.go >> patching file src/pkg/syscall/zsyscall_plan9_386.go >> patching file src/pkg/syscall/zsysnum_plan9_386.go >> patching file src/pkg/syscall/ztypes_plan9_386.go >> >> at any rate building on linux targeting plan9 and 386 arch (some tests >> fail), i can generate an output. running it on plan9 causes a >> protection violation: >> >> cpue% pwd >> /mnt/term/home/fst/test >> cpue% cat hell-o.go >> package main >> >> func main() { >> println("Hello, 世界") >> } >> cpue% ./8.hell-o >> 8.hell-o 19698: suicide: sys: trap: general protection violation pc=0x00007047 >> >> -Skip >> >> On Sun, Dec 26, 2010 at 7:54 AM, Pavel Zholkover <paulzhol@gmail.com> wrote: >>> Hi all! >>> >>> I've pushed syscall and os package support for Plan 9 on x86 at >>> http://codereview.appspot.com/3816043/ (pending a review). >>> I had to make changes to the core go files, so keep your fingers >>> crossed I didn't break anything along the way and get committed. >>> >>> If you have access to a real Plan 9 machine or inside qemu) please >>> test (9vx does not seem to work, confirmed by Andrey Mirtchovski for >>> early versions of code). >>> >>> (Reminder: -s needs to be passed to 8l, otherwise the binaries fail to run). >>> >>> Thanks, >>> Pavel >>> >>> >> >> > > ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [9fans] Golang support for Plan 9 2010-12-28 7:24 ` Skip Tavakkolian @ 2010-12-28 21:06 ` Pavel Zholkover 0 siblings, 0 replies; 5+ messages in thread From: Pavel Zholkover @ 2010-12-28 21:06 UTC (permalink / raw) To: Fans of the OS Plan 9 from Bell Labs On Tue, Dec 28, 2010 at 9:24 AM, Skip Tavakkolian <skip.tavakkolian@gmail.com> wrote: > sorry for the noise; the -s was mentioned in your original post and i > missed it. now hell-o example works. i'll try out a few more things. > > i checked out a complete release (fresh copy) earlier today before > applying the patch; it had the same results (one patch failed to > apply). > $ hg identify > 51c777dbccb9+ tip > You were right, I did a clean pull and then tried applying to patch - it fails on exec.go (not sure what is the cause though). I'm attaching a diff for the missing file exec_unix.go (it is not needed for plan9 but all the other os's break without it). Also if you are brave enough to run "cd src/pkg; make clean; GOOS=plan9 make -k install" after building the 8g toolchain you could import "fmt" and friends... fmt.Println should even work :) diff -r 51c777dbccb9 src/pkg/os/exec_unix.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pkg/os/exec_unix.go Tue Dec 28 22:53:30 2010 +0200 @@ -0,0 +1,148 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package os + +import ( + "syscall" +) + +// ForkExec forks the current process and invokes Exec with the program, arguments, +// and environment specified by name, argv, and envv. It returns the process +// id of the forked process and an Error, if any. The fd array specifies the +// file descriptors to be set up in the new process: fd[0] will be Unix file +// descriptor 0 (standard input), fd[1] descriptor 1, and so on. A nil entry +// will cause the child to have no open file descriptor with that index. +// If dir is not empty, the child chdirs into the directory before execing the program. +func ForkExec(name string, argv []string, envv []string, dir string, fd []*File) (pid int, err Error) { + if envv == nil { + envv = Environ() + } + // Create array of integer (system) fds. + intfd := make([]int, len(fd)) + for i, f := range fd { + if f == nil { + intfd[i] = -1 + } else { + intfd[i] = f.Fd() + } + } + + p, e := syscall.ForkExec(name, argv, envv, dir, intfd) + if e != 0 { + return 0, &PathError{"fork/exec", name, Errno(e)} + } + return p, nil +} + +// Exec replaces the current process with an execution of the +// named binary, with arguments argv and environment envv. +// If successful, Exec never returns. If it fails, it returns an Error. +// ForkExec is almost always a better way to execute a program. +func Exec(name string, argv []string, envv []string) Error { + if envv == nil { + envv = Environ() + } + e := syscall.Exec(name, argv, envv) + if e != 0 { + return &PathError{"exec", name, Errno(e)} + } + return nil +} + +// TODO(rsc): Should os implement its own syscall.WaitStatus +// wrapper with the methods, or is exposing the underlying one enough? +// +// TODO(rsc): Certainly need to have Rusage struct, +// since syscall one might have different field types across +// different OS. + +// Waitmsg stores the information about an exited process as reported by Wait. +type Waitmsg struct { + Pid int // The process's id. + syscall.WaitStatus // System-dependent status info. + Rusage *syscall.Rusage // System-dependent resource usage info. +} + +// Options for Wait. +const ( + WNOHANG = syscall.WNOHANG // Don't wait if no process has exited. + WSTOPPED = syscall.WSTOPPED // If set, status of stopped subprocesses is also reported. + WUNTRACED = WSTOPPED + WRUSAGE = 1 << 20 // Record resource usage. +) + +// WRUSAGE must not be too high a bit, to avoid clashing with Linux's +// WCLONE, WALL, and WNOTHREAD flags, which sit in the top few bits of +// the options + +// Wait waits for process pid to exit or stop, and then returns a +// Waitmsg describing its status and an Error, if any. The options +// (WNOHANG etc.) affect the behavior of the Wait call. +func Wait(pid int, options int) (w *Waitmsg, err Error) { + var status syscall.WaitStatus + var rusage *syscall.Rusage + if options&WRUSAGE != 0 { + rusage = new(syscall.Rusage) + options ^= WRUSAGE + } + pid1, e := syscall.Wait4(pid, &status, options, rusage) + if e != 0 { + return nil, NewSyscallError("wait", e) + } + w = new(Waitmsg) + w.Pid = pid1 + w.WaitStatus = status + w.Rusage = rusage + return w, nil +} + +// Convert i to decimal string. +func itod(i int) string { + if i == 0 { + return "0" + } + + u := uint64(i) + if i < 0 { + u = -u + } + + // Assemble decimal in reverse order. + var b [32]byte + bp := len(b) + for ; u > 0; u /= 10 { + bp-- + b[bp] = byte(u%10) + '0' + } + + if i < 0 { + bp-- + b[bp] = '-' + } + + return string(b[bp:]) +} + +func (w Waitmsg) String() string { + // TODO(austin) Use signal names when possible? + res := "" + switch { + case w.Exited(): + res = "exit status " + itod(w.ExitStatus()) + case w.Signaled(): + res = "signal " + itod(w.Signal()) + case w.Stopped(): + res = "stop signal " + itod(w.StopSignal()) + if w.StopSignal() == syscall.SIGTRAP && w.TrapCause() != 0 { + res += " (trap " + itod(w.TrapCause()) + ")" + } + case w.Continued(): + res = "continued" + } + if w.CoreDump() { + res += " (core dumped)" + } + return res +} ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2010-12-28 21:06 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2010-12-26 15:54 [9fans] Golang support for Plan 9 Pavel Zholkover 2010-12-27 20:08 ` Skip Tavakkolian 2010-12-28 6:49 ` Pavel Zholkover 2010-12-28 7:24 ` Skip Tavakkolian 2010-12-28 21:06 ` Pavel Zholkover
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).