kawasin73 / bitset

Bi-Endian Bit Vector (Array) in Golang
MIT License
8 stars 4 forks source link

TravisCI の QEMU 利用のリファクタリング #14

Open kawasin73 opened 5 years ago

kawasin73 commented 5 years ago

Little Endian と Big Endian のエミュレート #5 を github.com/multiarch/qemu-user-static からダウンロードした qemu-ppc64-static バイナリを利用することによって行った。

ただし、このリポジトリ自体の信頼性の問題もあるため、パッケージマネージャーによってダウンロードする方法を検討する。

kawasin73 commented 5 years ago

Travis CI でのパッケージのインストールは apt-get を利用する

qemu-user-static は以下のようにインストールする

sudo apt-get update
sudo apt-get install -y qemu-user-static

Go 言語がサポートしている GOARCH は以下の通り

# go tool dist list | grep linux
linux/386
linux/amd64
linux/arm
linux/arm64
linux/mips
linux/mips64
linux/mips64le
linux/mipsle
linux/ppc64
linux/ppc64le
linux/s390x

このうち Big Endian なのは、ppc64mipsmips64s390x のみ。

memory ordering is big-endian and wrong typecasting between pointers to integers of different size can cause fatal errors https://fedoraproject.org/wiki/Architectures/s390x

kawasin73 commented 5 years ago

ppc64 で行った場合以下のエラーが発生したため、ppc64 は断念。

$ qemu-ppc64-static ./bitset.test
Invalid instruction
NIP 000000000004a1f4   LR 000000000004a1b0 CTR 0000000000063c20 XER 0000000000000000
MSR 8000000002006000 HID0 0000000060000000  HF 0000000002006000 idx 0
TB 00000000 00000000
GPR00 0000000000000000 00000040008005d8 0000000000000000 0000000000000001
GPR04 0000004000800621 fffffffffffffff0 0000000000000001 0000000000000001
GPR08 0000000000000001 0000000000000000 0000000000000000 0000000000000000
GPR12 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR16 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR24 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR28 0000000000000000 0000000000000000 00000000001f8da0 000000000004a1b0
CR 20000000  [ E  -  -  -  -  -  -  -  ]             RES ffffffffffffffff
FPR00 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR04 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR08 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR12 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR16 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR20 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR24 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR28 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPSCR 0000000000000000
qemu: uncaught target signal 4 (Illegal instruction) - core dumped
Illegal instruction (core dumped)

mips64 の場合 Go 1.10 では成功する。

しかし、Go 1.9 の場合以下のエラーが発生する

$ qemu-mips64-static ./bitset.test -test.v
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
/home/travis/.travis/job_stages: line 104:  5910 Segmentation fault      (core dumped) qemu-mips64-static ./bitset.test -test.v
The command "qemu-mips64-static ./bitset.test -test.v" exited with 139.

Go 1.11 の場合以下のエラーが発生する

0.02s$ qemu-mips64-static ./bitset.test -test.v
fatal error: sigaction failed
runtime stack:
runtime.throw(0x179647, 0x10)
    /home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/panic.go:608 +0x6c
runtime.sysSigaction.func1()
    /home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/os_linux.go:432 +0x4c
runtime.sysSigaction(0x4100000041, 0x40007ff478, 0x0)
    /home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/os_linux.go:431 +0x98
runtime.sigaction(0x4100074be0, 0x40007ff478, 0x0)
    /home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/sigaction.go:15 +0x28
runtime.setsig(0x4100000000, 0x59f90)
    /home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/os_linux.go:382 +0xe8
runtime.initsig(0x183b00047a8c)
    /home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/signal_unix.go:113 +0x268
runtime.mstartm0()
    /home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/proc.go:1309 +0x60
runtime.mstart1()
    /home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/proc.go:1278 +0x13c
runtime.mstart()
    /home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/proc.go:1248 +0x68
goroutine 1 [runnable]:
runtime.main()
    /home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/proc.go:110
runtime.goexit()
    /home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/asm_mips64x.s:649 +0x4
The command "qemu-mips64-static ./bitset.test -test.v" exited with 2.