Re: Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-08 Thread Rolf Sommerhalder
On Sat, Aug 8, 2015 at 12:22 AM, Ted Unangst t...@tedunangst.com wrote:
Thanks everyone to your follow-ups.

 talk to upstream? this sounds like a bug if the runtime detection is
 insufficient.

From what I gathered about Go so far, upstream had already fixed that
(see references in my previous posts). The problem might be more
subtle, as I am cross-building the Go package on a SSE machine, but
then install and run it on a non-SSE machine. At build time, the Go
system will correctly detect my build host's capabilities, which
results in Go system binaries that include SSE instructions. However,
these system binaries fail with SIGILL on my non-SSE target as the
initial Go loader, linker and other Go system libraries (try to) use
SSE instructions at startup time of the Go system, before it actually
detects the less capable CPU of my run-time target host.

Thus my hypothesis is that the Go package would run fine if I would
build it directly on the non-SSE target. But currently, I have no
build environment on a ALIX host. Still, I will dig a bit further into
the implementation of the Go system while learning it, and while
experimenting with gopacket and its sub-libraries such as the recent
bsdbpf.

 unconditionally disabling sse would be a pessimization for most
 users.

As I share your concern, I thought that a separate flavour might be a
solution. Another much more pragmatic and lighther solutions would be
to just add a short note (in the Makefile or package info?) that shows
how to rebuild the package for those who want to run Go on non-SSE CPU
like Geode LX on ALIX.



Re: Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-08 Thread Stuart Henderson
On 2015/08/07 18:22, Ted Unangst wrote:
 Stuart Henderson wrote:
  
  I don't think a flavour is warranted, i386 packages are meant to run
  on all supported CPUs so if the runtime detection is insufficient
  we should just always set this variable.
 
 talk to upstream? this sounds like a bug if the runtime detection is
 insufficient. unconditionally disabling sse would be a pessimization for most
 users.

Won't most users be running amd64 anyway?



Re: Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-07 Thread Matthew Dempsky
I seem to recall a bug where some CPU models don't properly set
registers after a CPUID instruction (e.g.,
http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/sys/arch/i386/i386/locore.s#rev1.150).
Is it possible this CPU is one of those?  Maybe Go needs similar
workarounds?

A way to test that hypothesis would be to add

MOVL $0, BX
MOVL $0, CX
MOVL $0, DX

before each of these CPUID instructions:

src/cmd/dist/cpuid_386.s:9: CPUID
src/runtime/asm_386.s:30: CPUID
src/runtime/asm_386.s:47: CPUID

On Fri, Aug 7, 2015 at 3:22 PM, Ted Unangst t...@tedunangst.com wrote:
 Stuart Henderson wrote:

 I don't think a flavour is warranted, i386 packages are meant to run
 on all supported CPUs so if the runtime detection is insufficient
 we should just always set this variable.

 talk to upstream? this sounds like a bug if the runtime detection is
 insufficient. unconditionally disabling sse would be a pessimization for most
 users.




Re: Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-07 Thread Ted Unangst
Stuart Henderson wrote:
 
 I don't think a flavour is warranted, i386 packages are meant to run
 on all supported CPUs so if the runtime detection is insufficient
 we should just always set this variable.

talk to upstream? this sounds like a bug if the runtime detection is
insufficient. unconditionally disabling sse would be a pessimization for most
users.



Re: Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-07 Thread Rolf Sommerhalder
On Thu, Aug 6, 2015 at 5:54 PM, Stuart Henderson st...@openbsd.org wrote:
 I'll see if I can figure something out.

I could get go-1.4.1 and also a backport of -1.4.2 which got just
tagged for OpenBSD 5.8 to work with the patches to Makefile below.
Note that no MAKE_ENV is set. though.

 I would expect some, as there's definitely code to do runtime detection.

Indeed, the go binary still includes some SSE instructions that uses
XMM registers, as you indicated probably for detection at run-time.

Today, I want to do more testing using the gopacket library and its
new bsdbpf extension on the PC Engines ALIX, and on APU too.

Regarding the Go port, I am unsure what would be the best way to
proceed, e.g. if a flavor with GO386=387 for i386 without SSE would be
justified for example.


diff for Makefile go-1.4.1 :

@@ -64,7 +67,8 @@
CXX=${CXX} \
GOROOT=${WRKDIST} \
GOBIN=${WRKDIST}/bin \
-   GOROOT_FINAL=${GOROOT} ./make.bash --no-banner
+   GOROOT_FINAL=${GOROOT} \
+   GO386=387 ./make.bash --no-banner

 do-test:
@cd ${WRKSRC}  \


diff for Makefile go-1.4.2 :

@@ -1,6 +1,7 @@
 # $OpenBSD: Makefile,v 1.25 2015/05/06 08:28:26 jasper Exp $

-ONLY_FOR_ARCHS =   ${GO_ARCHS}
+#ONLY_FOR_ARCHS =  ${GO_ARCHS}
+ONLY_FOR_ARCHS =amd64 i386

 COMMENT =  Go programming language

@@ -64,7 +67,8 @@
CXX=${CXX} \
GOROOT=${WRKDIST} \
GOBIN=${WRKDIST}/bin \
-   GOROOT_FINAL=${GOROOT} ./make.bash --no-banner
+   GOROOT_FINAL=${GOROOT} \
+   GO386=387 ./make.bash --no-banner

 do-test:
@cd ${WRKSRC}  \



Re: Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-07 Thread Stuart Henderson
On 2015/08/07 08:38, Rolf Sommerhalder wrote:
 On Thu, Aug 6, 2015 at 5:54 PM, Stuart Henderson st...@openbsd.org wrote:
  I'll see if I can figure something out.
 
 I could get go-1.4.1 and also a backport of -1.4.2 which got just
 tagged for OpenBSD 5.8 to work with the patches to Makefile below.
 Note that no MAKE_ENV is set. though.

Ah good, that method looks reasonable.

  I would expect some, as there's definitely code to do runtime detection.
 
 Indeed, the go binary still includes some SSE instructions that uses
 XMM registers, as you indicated probably for detection at run-time.
 
 Today, I want to do more testing using the gopacket library and its
 new bsdbpf extension on the PC Engines ALIX, and on APU too.
 
 Regarding the Go port, I am unsure what would be the best way to
 proceed, e.g. if a flavor with GO386=387 for i386 without SSE would be
 justified for example.

I don't think a flavour is warranted, i386 packages are meant to run
on all supported CPUs so if the runtime detection is insufficient
we should just always set this variable.



Re: Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-06 Thread Stuart Henderson
On 2015/08/06 11:54, Rolf Sommerhalder wrote:
 On Thu, Aug 6, 2015 at 10:49 AM, Rolf Sommerhalder  Thus, I will now
 re-build the entire package with this option, re-try,
  and report the outcome...
 
 Being ecouraged by [1] too, I re-build go-1.4.1 package with an
 additional line in its Makefile:
 .elif ${MACHINE_ARCH} == i386
 GOARCH =386
 GO386 = 387
 EXEPREFIX = 8
 
 Unfortunately, the resulting package still aborts with SIGILL on ALIX
 with AMD Geode LX.
 
 Thus, I will dig into the package build in oder to verify that the
 GO386 parameter is indeed taking effect throughout the build
 process...
 
 [1] Golang on the Geode processor
  http://blog.nella.org/golang-on-the-geode-processor/
 

That's a makefile variable only, not passed to the build. Try this?

Index: Makefile
===
RCS file: /cvs/ports/lang/go/Makefile,v
retrieving revision 1.25
diff -u -p -r1.25 Makefile
--- Makefile6 May 2015 08:28:26 -   1.25
+++ Makefile6 Aug 2015 10:06:49 -
@@ -44,6 +44,8 @@ GOARCH =  386
 EXEPREFIX =8
 PKG_ARGS +=-Damd64=0
 PKG_ARGS +=-Di386=1
+# avoid SSE
+MAKE_ENV +=GO386=387
 .else
 PKG_ARGS +=-Damd64=0 -Di386=0
 .endif



Re: Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-06 Thread Rolf Sommerhalder
On Thu, Aug 6, 2015 at 10:49 AM, Rolf Sommerhalder  Thus, I will now
re-build the entire package with this option, re-try,
 and report the outcome...

Being ecouraged by [1] too, I re-build go-1.4.1 package with an
additional line in its Makefile:
.elif ${MACHINE_ARCH} == i386
GOARCH =386
GO386 = 387
EXEPREFIX = 8

Unfortunately, the resulting package still aborts with SIGILL on ALIX
with AMD Geode LX.

Thus, I will dig into the package build in oder to verify that the
GO386 parameter is indeed taking effect throughout the build
process...

[1] Golang on the Geode processor
 http://blog.nella.org/golang-on-the-geode-processor/



Re: Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-06 Thread Rolf Sommerhalder
On Thu, Aug 6, 2015 at 12:07 PM, Stuart Henderson st...@openbsd.org wrote:
 That's a makefile variable only, not passed to the build. Try this?

Thanks for your diff. Unfortunately, it still does not solve the problem.

Is there any way I can check that the environment variable is indeed
applied to all steps while (cross-)building the package on my Acer
laptop which has SSE2/SSE3 for my ALIX which has only MMX?



Re: Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-06 Thread Rolf Sommerhalder
 I'll try to build go manually as per [1] now, just to compare its
 binary output with the package build process, and see if GO386=387 has
 an effect.

 [1] https://golang.org/doc/install/source

The resulting binary of this manual build still has some SSE2 code
with XMM registers, though much less than with the package build with
'MAKE_ENV += GO386=387' :

git clone https://go.googlesource.com/go
cd go
git checkout go1.4.1
cd src
GO386=387 GOARCH=386 ./make.bash
objdump -d /home/rs/goFromSource/go/bin/go | grep xmm

So 'GO386=387' appears to have an impact in the manual build, and most
checks still pass ok.

The good news is, that simply scp /home/rs/goFromSource/go/bin/go from
the i386 build host with SSE2/3 over to the ALIX, the go binary works
without SIGILL :-)

Will need to figure out what I still miss in the package build (I had
done 'make clean=all' before 'make package') ...



Re: Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-06 Thread Rolf Sommerhalder
Despite the make_env, the go binary still has a ton of SSE2 code using
XMM registers:
  objdump -d /usr/obj/ports/go-1.4.1/fake-i386/usr/local/bin/go | grep xmm
 808a559:   f2 0f 10 05 e8 3e 45movsd  0x8453ee8,%xmm0
 808a561:   f2 0f 11 44 24 38   movsd  %xmm0,0x38(%esp)
 808a61a:   f2 0f 10 44 24 60   movsd  0x60(%esp),%xmm0
 808a620:   f2 0f 11 44 24 60   movsd  %xmm0,0x60(%esp)
 808a62e:   f2 0f 10 44 24 58   movsd  0x58(%esp),%xmm0
 808a634:   f2 0f 11 44 24 58   movsd  %xmm0,0x58(%esp)
 808a63a:   f2 0f 10 44 24 58   movsd  0x58(%esp),%xmm0
 808a640:   f2 0f 59 05 00 3f 45mulsd  0x8453f00,%xmm0
 808a648:   f2 0f 11 44 24 58   movsd  %xmm0,0x58(%esp)
 808a64e:   f2 0f 10 44 24 58   movsd  0x58(%esp),%xmm0
 808a654:   f2 0f 10 4c 24 60   movsd  0x60(%esp),%xmm1
 808a65a:   f2 0f 58 c8 addsd  %xmm0,%xmm1
 ...

I'll try to build go manually as per [1] now, just to compare its
binary output with the package build process, and see if GO386=387 has
an effect.

[1] https://golang.org/doc/install/source



Re: Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-06 Thread Rolf Sommerhalder
Stuart, many thanks for your reply, assertions and suggestions!

On Wed, Aug 5, 2015 at 4:04 PM, Stuart Henderson st...@openbsd.org wrote:
 ... can you try setting
 GO386=387 in your environment to disable the cpuid autodetection and see
 if it still does the same?

The problem persists even after adding this environment variable.
However, from [1, 2, 3] I understand, that I need to rebuild the
entire tool-chain, not only re-run the binary from the existing
package.
Thus, I will now re-build the entire package with this option, re-try,
and report the outcome...

 I occasionally run the regression test suite on i386 and amd64 and those
 usually come up OK, however I wouldn't normally do that on a non-SSE2
 machine.

Indeed, it works fine on another i386 machine that has SSE2/3 :-)
$ dmesg
OpenBSD 5.7 (GENERIC) #738: Sun Mar  8 10:59:31 MDT 2015
dera...@i386.openbsd.org:/usr/src/sys/arch/i386/compile/GENERIC
RTC BIOS diagnostic error 80clock_battery
cpu0: Intel(R) Core(TM)2 Solo CPU U3500 @ 1.40GHz (GenuineIntel
686-class) 1.40 GHz
cpu0: 
FPU,V86,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,TM,PBE,NXE,LONG,SSE3,DTES64,MWAIT,DS-CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,XSAVE,LAHF,PERF
real mem  = 3147714560 (3001MB)
avail mem = 3083931648 (2941MB)
mpath0 at root
scsibus0 at mpath0: 256 targets
mainbus0 at root
bios0 at mainbus0: date 08/10/10, SMBIOS rev. 2.6 @ 0xe8180 (28 entries)
bios0: vendor Acer version V1.28 date 08/10/2010
bios0: Acer Aspire 3810T
...


$ go env
GOARCH=386
GOBIN=
GOCHAR=8
GOEXE=
GOHOSTARCH=386
GOHOSTOS=openbsd
GOOS=openbsd
GOPATH=/home/rs/go
GORACE=
GOROOT=/usr/local/go
GOTOOLDIR=/usr/local/go/pkg/tool/openbsd_386
CC=cc
GOGCCFLAGS=-fPIC -m32 -pthread -fmessage-length=0
CXX=c++
CGO_ENABLED=1


[1]  go1.1beta2 app - illegal instruction on LX800 processor Alix Board
 https://groups.google.com/forum/#!msg/golang-nuts/v4MYW6sDrRo/nLP8YpiObLUJ

[2] code.google.com go 386 binaries now requiring SSE2?
 https://groups.google.com/forum/#!topic/golang-nuts/NsROxh3Dc6M

[3] 386 woes
 https://groups.google.com/forum/#!msg/golang-dev/oPOvRr7JU2Y/DAn2jwS38E8J



Re: Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-06 Thread Stuart Henderson
On 2015/08/06 13:58, Rolf Sommerhalder wrote:
  I'll try to build go manually as per [1] now, just to compare its
  binary output with the package build process, and see if GO386=387 has
  an effect.
 
  [1] https://golang.org/doc/install/source
 
 The resulting binary of this manual build still has some SSE2 code
 with XMM registers, though much less than with the package build with
 'MAKE_ENV += GO386=387' :

I would expect some, as there's definitely code to do runtime detection.

 git clone https://go.googlesource.com/go
 cd go
 git checkout go1.4.1
 cd src
 GO386=387 GOARCH=386 ./make.bash
 objdump -d /home/rs/goFromSource/go/bin/go | grep xmm
 
 So 'GO386=387' appears to have an impact in the manual build, and most
 checks still pass ok.
 
 The good news is, that simply scp /home/rs/goFromSource/go/bin/go from
 the i386 build host with SSE2/3 over to the ALIX, the go binary works
 without SIGILL :-)
 
 Will need to figure out what I still miss in the package build (I had
 done 'make clean=all' before 'make package') ...

I'll see if I can figure something out.



Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-05 Thread Rolf Sommerhalder
Hello list

While the Go 1.4.1 package works fine on OpenBSD 5.7 amd64 (Lenovo
X230 laptop), it fails with i386 (PCengines ALIX with Geode
processor), see output below.

I have put my user into the staff login class, and increased ulimits,
as hinted in
 https://github.com/golang/go/wiki/OpenBSD
and
 http://homing-on-code.blogspot.ch/2015/03/go-development-on-openbsd.html

Googling reveals some PRs regarding run-time error at Go load-time due
to missing instructions on some i386 processors:
  https://code.google.com/p/go/issues/detail?id=4798
  https://github.com/golang/go/issues/4798

Fixes #4798, 14 Feb 2013
cmd/8c: disable use of prefetch with GO386=387
 https://github.com/golang/go/commit/594360cb1b31a99a349ba03294f5459aff0bc33d

Can anyone confirm that this package should indeed work on i386 as
well, or if there is some more knobs to turn (dis-/enable options in
the BIOS or kernel, etc) that I have missed?

Thanks,
Rolf


$ dmesg
OpenBSD 5.7 (GENERIC) #738: Sun Mar  8 10:59:31 MDT 2015
dera...@i386.openbsd.org:/usr/src/sys/arch/i386/compile/GENERIC
RTC BIOS diagnostic error 80clock_battery
cpu0: Geode(TM) Integrated Processor by AMD PCS (AuthenticAMD
586-class) 499 MHz
cpu0: FPU,DE,PSE,TSC,MSR,CX8,SEP,PGE,CMOV,CFLUSH,MMX,MMXX,3DNOW2,3DNOW
real mem  = 267931648 (255MB)
avail mem = 251179008 (239MB)
...


$ pkg_info | grep go
go-1.4.1Go
programming language


$ go version
SIGILL: illegal instruction
PC=0x80a58bf

goroutine 1 [running, locked to thread]:
runtime.mapassign1(0x82f5f80, 0x18738020, 0x1872ff60, 0x1872ff5c)
/usr/local/go/src/runtime/hashmap.go:455 +0x23f fp=0x1872ff4c
sp=0x1872fef0
unicode.init()
/usr/local/go/src/unicode/tables.go:52 +0xaf fp=0x1872ff6c sp=0x1872ff4c
go/parser.init()
/usr/local/go/src/go/parser/parser.go:2462 +0x3f fp=0x1872ff78
sp=0x1872ff6c
main.init()
/usr/local/go/src/cmd/go/zdefaultcc.go:6 +0x3f fp=0x1872ffcc
sp=0x1872ff78
runtime.main()
/usr/local/go/src/runtime/proc.go:58 +0xb7 fp=0x1872fff0 sp=0x1872ffcc
runtime.goexit()
/usr/local/go/src/runtime/asm_386.s:2287 +0x1 fp=0x1872fff4
sp=0x1872fff0

goroutine 2 [runnable]:
runtime.forcegchelper()
/usr/local/go/src/runtime/proc.go:90
runtime.goexit()
/usr/local/go/src/runtime/asm_386.s:2287 +0x1

goroutine 3 [runnable]:
runtime.bgsweep()
/usr/local/go/src/runtime/mgc0.go:82
runtime.goexit()
/usr/local/go/src/runtime/asm_386.s:2287 +0x1

eax 0x0
ebx 0x0
ecx 0x1870c070
edx 0x18738020
edi 0x1b
esi 0x1870c077
ebp 0x0
esp 0x1872fef0
eip 0x80a58bf
eflags  0x10246
cs  0x2b
fs  0x5b
gs  0x63



Re: Go-1.4.1 on OpenBSD 5.7 i386 fails with SIGILL: illegal instruction

2015-08-05 Thread Stuart Henderson
On 2015/08/05 13:41, Rolf Sommerhalder wrote:
 While the Go 1.4.1 package works fine on OpenBSD 5.7 amd64 (Lenovo
 X230 laptop), it fails with i386 (PCengines ALIX with Geode
 processor), see output below.

Go has cpuid autodetection at runtime which seems to be correct to
me, but just in case there's a problem with that, can you try setting
GO386=387 in your environment to disable the cpuid autodetection and see
if it still does the same?

 I have put my user into the staff login class, and increased ulimits,

These won't affect illegal instruction.

 Googling reveals some PRs regarding run-time error at Go load-time due
 to missing instructions on some i386 processors:
   https://code.google.com/p/go/issues/detail?id=4798
   https://github.com/golang/go/issues/4798
 
 Fixes #4798, 14 Feb 2013
 cmd/8c: disable use of prefetch with GO386=387
  https://github.com/golang/go/commit/594360cb1b31a99a349ba03294f5459aff0bc33d
 
 Can anyone confirm that this package should indeed work on i386 as
 well, or if there is some more knobs to turn (dis-/enable options in
 the BIOS or kernel, etc) that I have missed?

I occasionally run the regression test suite on i386 and amd64 and those
usually come up OK, however I wouldn't normally do that on a non-SSE2
machine.