From 5d890b35a6ab734393d0286a834d6d8c6d9dd31e Mon Sep 17 00:00:00 2001 From: Joel Stanley Date: Thu, 4 Jul 2019 11:05:14 +0930 Subject: [PATCH 1/9] configs: aspeed: Unset CONFIG_MMC The aspeed board does not have an upstream MMC driver. As CONFIG_MMC defaults on, the board would fail to build due to the CONFIG_DM_MMC migration: ===================== WARNING ====================== This board does not use CONFIG_DM_MMC. Please update the board to use CONFIG_DM_MMC before the v2019.04 release. Failure to update by the deadline may result in board removal. See doc/driver-model/MIGRATION.txt for more info. ==================================================== Change the defconfig to disable MMC until a driver is submitted. Signed-off-by: Joel Stanley --- configs/evb-ast2500_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/evb-ast2500_defconfig b/configs/evb-ast2500_defconfig index b73da72b16..245c73ee9b 100644 --- a/configs/evb-ast2500_defconfig +++ b/configs/evb-ast2500_defconfig @@ -21,6 +21,7 @@ CONFIG_REGMAP=y CONFIG_CLK=y CONFIG_DM_I2C=y CONFIG_SYS_I2C_ASPEED=y +# CONFIG_MMC is not set CONFIG_PHY_REALTEK=y CONFIG_DM_ETH=y CONFIG_FTGMAC100=y From bfb372b83f4908b8fb5907d9cda10c7da1996966 Mon Sep 17 00:00:00 2001 From: Joel Stanley Date: Thu, 4 Jul 2019 11:05:15 +0930 Subject: [PATCH 2/9] configs: aspeed: Add HUSH and random ethernet addr Tests in test/py/tests/test_env.py like this fail without CONFIG_HUSH_PARSER: => => printenv test_env_0 ## Error: "test_env_0" not defined => .=> setenv test_env_0 => => echo $test_env_0 $test_env_0 => F We also want a mac address so the ethernet device works in qemu. Signed-off-by: Joel Stanley --- configs/evb-ast2500_defconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configs/evb-ast2500_defconfig b/configs/evb-ast2500_defconfig index 245c73ee9b..59d41cb568 100644 --- a/configs/evb-ast2500_defconfig +++ b/configs/evb-ast2500_defconfig @@ -11,12 +11,14 @@ CONFIG_BOOTARGS="console=ttyS4,115200n8 root=/dev/ram rw" CONFIG_PRE_CONSOLE_BUFFER=y CONFIG_PRE_CON_BUF_ADDR=0x1e720000 # CONFIG_DISPLAY_CPUINFO is not set +CONFIG_HUSH_PARSER=y # CONFIG_AUTO_COMPLETE is not set CONFIG_CMD_I2C=y CONFIG_CMD_DHCP=y CONFIG_CMD_MII=y CONFIG_CMD_PING=y CONFIG_DEFAULT_DEVICE_TREE="ast2500-evb" +CONFIG_NET_RANDOM_ETHADDR=y CONFIG_REGMAP=y CONFIG_CLK=y CONFIG_DM_I2C=y From 998dc83adbf608fded340c38fcde7987177649e4 Mon Sep 17 00:00:00 2001 From: Joel Stanley Date: Thu, 4 Jul 2019 11:05:17 +0930 Subject: [PATCH 3/9] travis: Add ASPEED ast2500 to qemu tests Signed-off-by: Joel Stanley --- .travis.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.travis.yml b/.travis.yml index c21bbbbca4..6abfa5d7fc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -387,6 +387,13 @@ matrix: TEST_PY_TEST_SPEC="not pci" BUILDMAN="^sandbox_flattree$" TOOLCHAIN="i386" + - name: "test/py evb-ast2500" + env: + - TEST_PY_BD="evb-ast2500" + TEST_PY_ID="--id qemu" + QEMU_TARGET="arm-softmmu" + QEMU_VERSION="v4.0.0" + BUILDMAN="^evb-ast2500$" - name: "test/py vexpress_ca15_tc2" env: - TEST_PY_BD="vexpress_ca15_tc2" From 51085bdb24528015f42983d9c9cd1a25f1fff94b Mon Sep 17 00:00:00 2001 From: Joel Stanley Date: Thu, 4 Jul 2019 11:05:18 +0930 Subject: [PATCH 4/9] travis: Build aspeed board with qemu HEAD In order to boot u-boot in the aspeed machine we need to run at least qemu 3059c2f5a813 (v4.0.0-1592-g3059c2f5a813), which is not in a released tag. This should be changed to v4.1.0 when it is released. Signed-off-by: Joel Stanley --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6abfa5d7fc..d5866443b7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -392,7 +392,7 @@ matrix: - TEST_PY_BD="evb-ast2500" TEST_PY_ID="--id qemu" QEMU_TARGET="arm-softmmu" - QEMU_VERSION="v4.0.0" + QEMU_VERSION="506179e42112be77bfd071f050b15762d3b2cd43" BUILDMAN="^evb-ast2500$" - name: "test/py vexpress_ca15_tc2" env: From 1a62a722186ba5159813a5737de9894364ceede7 Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Wed, 19 Jun 2019 09:25:17 -0400 Subject: [PATCH 5/9] gitlab-ci: Initial conversion of Travis CI build to GitLab CI Migrate all of the logic in our current .travis.yml file to a GitLab CI config file. Notable changes are that this will run the jobs on runners with the "all" tag. The timeout for a job needs to be configured higher than normal as we no longer split building the world up into a large number of small jobs but instead perform one big build job. We make use of stages so that we build and run all of the QEMU + test.py tests first in order to increase the chance that any problems will be found before starting the final big build. Signed-off-by: Tom Rini --- .gitlab-ci.yml | 315 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000..3ddd5ad99a --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,315 @@ +# SPDX-License-Identifier: GPL-2.0+ + +# Grab our configured image. The source for this is found at: +# https://gitlab.denx.de/u-boot/gitlab-ci-runner +image: trini/u-boot-gitlab-ci-runner:xenial-20190222-24April2019 + +# We run some tests in different order, to catch some failures quicker. +stages: + - test.py + - testsuites + - world build + +.buildman_and_testpy_template: &buildman_and_testpy_dfn + tags: [ 'all' ] + stage: test.py + before_script: + # Clone uboot-test-hooks + - git clone --depth=1 git://github.com/swarren/uboot-test-hooks.git /tmp/uboot-test-hooks + - ln -s travis-ci /tmp/uboot-test-hooks/bin/`hostname` + - ln -s travis-ci /tmp/uboot-test-hooks/py/`hostname` + - virtualenv /tmp/venv + - . /tmp/venv/bin/activate + - pip install pytest==2.8.7 + - pip install python-subunit + - grub-mkimage -o ~/grub_x86.efi -O i386-efi normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd + - grub-mkimage -o ~/grub_x64.efi -O x86_64-efi normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd + - mkdir ~/grub2-arm + - ( cd ~/grub2-arm; wget -O - http://download.opensuse.org/ports/armv7hl/distribution/leap/42.2/repo/oss/suse/armv7hl/grub2-arm-efi-2.02~beta2-87.1.armv7hl.rpm | rpm2cpio | cpio -di ) + - mkdir ~/grub2-arm64 + - ( cd ~/grub2-arm64; wget -O - http://download.opensuse.org/ports/aarch64/distribution/leap/42.2/repo/oss/suse/aarch64/grub2-arm64-efi-2.02~beta2-87.1.aarch64.rpm | rpm2cpio | cpio -di ) + - if [[ "${QEMU_TARGET}" != "" ]]; then + git clone git://git.qemu.org/qemu.git /tmp/qemu; + pushd /tmp/qemu; + git submodule update --init dtc && + git checkout ${QEMU_VERSION} && + ./configure --prefix=/tmp/qemu-install --target-list=${QEMU_TARGET} && + make -j$(nproc) all install; + popd; + fi + after_script: + - rm -rf ~/grub2* /tmp/uboot-test-hooks /tmp/qemu /tmp/venv + script: + # From buildman, exit code 129 means warnings only. If we've been asked to + # use clang only do one configuration. + - if [[ "${BUILDMAN}" != "" ]]; then + ret=0; + tools/buildman/buildman -P -E ${BUILDMAN} ${OVERRIDE}|| ret=$?; + if [[ $ret -ne 0 && $ret -ne 129 ]]; then + tools/buildman/buildman -sdeP ${BUILDMAN}; + exit $ret; + fi; + fi + # "not a_test_which_does_not_exist" is a dummy -k parameter which will + # never prevent any test from running. That way, we can always pass + # "-k something" even when $TEST_PY_TEST_SPEC doesnt need a custom + # value. + - export UBOOT_TRAVIS_BUILD_DIR=`cd .. && pwd`/.bm-work/${TEST_PY_BD}; + export PATH=/tmp/qemu-install/bin:/tmp/uboot-test-hooks/bin:/usr/bin:/bin; + export PYTHONPATH=/tmp/uboot-test-hooks/py/travis-ci; + if [[ "${TEST_PY_BD}" != "" ]]; then + ./test/py/test.py --bd ${TEST_PY_BD} ${TEST_PY_ID} + -k "${TEST_PY_TEST_SPEC:-not a_test_which_does_not_exist}" + --build-dir "$UBOOT_TRAVIS_BUILD_DIR"; + ret=$?; + if [[ $ret -ne 0 ]]; then + exit $ret; + fi; + fi; + +build all plaforms: + tags: [ 'all' ] + stage: world build + script: + - ret=0; + ./tools/buildman/buildman -P -E || ret=$?; + if [[ $ret -ne 0 && $ret -ne 129 ]]; then + ./tools/buildman/buildman -sdeP; + exit $ret; + fi; + +# QA jobs for code analytics +# static code analysis with cppcheck (we can add --enable=all later) +cppcheck: + tags: [ 'all' ] + stage: testsuites + script: + - cppcheck --force --quiet --inline-suppr . + +# search for TODO within source tree +grep TODO/FIXME/HACK: + tags: [ 'all' ] + stage: testsuites + script: + - grep -r TODO . + - grep -r FIXME . + # search for HACK within source tree and ignore HACKKIT board + - grep -r HACK . | grep -v HACKKIT + +# some statistics about the code base +sloccount: + tags: [ 'all' ] + stage: testsuites + script: + - sloccount . + +# ensure all configs have MAINTAINERS entries +Check for configs without MAINTAINERS entry: + tags: [ 'all' ] + stage: testsuites + script: + - if [ `./tools/genboardscfg.py -f 2>&1 | wc -l` -ne 0 ]; then exit 1; fi + +# Ensure host tools build +Build tools-only: + tags: [ 'all' ] + stage: testsuites + script: + - make tools-only_config tools-only -j$(nproc) + +# Run various tool tests +Run patman testsuite: + tags: [ 'all' ] + stage: testsuites + script: + - git config --global user.name "GitLab CI Runner" + - git config --global user.email trini@konsulko.com + - ./tools/patman/patman --test + +Run buildman testsuite: + tags: [ 'all' ] + stage: testsuites + script: + - ./tools/buildman/buildman -t + +Run binman and dtoc testsuite: + tags: [ 'all' ] + stage: testsuites + script: + - export UBOOT_TRAVIS_BUILD_DIR=`cd .. && pwd`/.bm-work/sandbox_spl; + ./tools/buildman/buildman -P sandbox_spl && + export PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt"; + export PATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}"; + ./tools/binman/binman -t && + ./tools/dtoc/dtoc -t + +# Test sandbox with test.py +sandbox test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "sandbox" + BUILDMAN: "^sandbox$" + <<: *buildman_and_testpy_dfn + +sandbox_spl test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "sandbox_spl" + BUILDMAN: "^sandbox_spl$" + TEST_PY_TEST_SPEC: "test_ofplatdata" + <<: *buildman_and_testpy_dfn + +sandbox_flattree test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "sandbox_flattree" + BUILDMAN: "^sandbox_flattree$" + <<: *buildman_and_testpy_dfn + +vexpress_ca15_tc2 test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "vexpress_ca15_tc2" + TEST_PY_ID: "--id qemu" + QEMU_TARGET: "arm-softmmu" + QEMU_VERSION: "v3.0.0" + BUILDMAN: "^vexpress_ca15_tc2$" + <<: *buildman_and_testpy_dfn + +vexpress_ca9x4 test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "vexpress_ca9x4" + TEST_PY_ID: "--id qemu" + QEMU_TARGET: "arm-softmmu" + BUILDMAN: "^vexpress_ca9x4$" + <<: *buildman_and_testpy_dfn + +integratorcp_cm926ejs test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "integratorcp_cm926ejs" + TEST_PY_TEST_SPEC: "not sleep" + TEST_PY_ID: "--id qemu" + QEMU_TARGET: "arm-softmmu" + BUILDMAN: "^integratorcp_cm926ejs$" + <<: *buildman_and_testpy_dfn + +qemu_arm test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "qemu_arm" + TEST_PY_TEST_SPEC: "not sleep" + QEMU_TARGET: "arm-softmmu" + BUILDMAN: "^qemu_arm$" + <<: *buildman_and_testpy_dfn + +qemu_arm64 test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "qemu_arm64" + TEST_PY_TEST_SPEC: "not sleep" + QEMU_TARGET: "aarch64-softmmu" + BUILDMAN: "^qemu_arm64$" + <<: *buildman_and_testpy_dfn + +qemu_mips test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "qemu_mips" + TEST_PY_TEST_SPEC: "not sleep" + QEMU_TARGET: "mips-softmmu" + BUILDMAN: "^qemu_mips$" + TOOLCHAIN: "mips" + <<: *buildman_and_testpy_dfn + +qemu_mipsel test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "qemu_mipsel" + TEST_PY_TEST_SPEC: "not sleep" + QEMU_TARGET: "mipsel-softmmu" + BUILDMAN: "^qemu_mipsel$" + TOOLCHAIN: "mips" + <<: *buildman_and_testpy_dfn + +qemu_mips64 test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "qemu_mips64" + TEST_PY_TEST_SPEC: "not sleep" + QEMU_TARGET: "mips64-softmmu" + BUILDMAN: "^qemu_mips64$" + TOOLCHAIN: "mips" + <<: *buildman_and_testpy_dfn + +qemu_mips64el test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "qemu_mips64el" + TEST_PY_TEST_SPEC: "not sleep" + QEMU_TARGET: "mips64el-softmmu" + BUILDMAN: "^qemu_mips64el$" + TOOLCHAIN: "mips" + <<: *buildman_and_testpy_dfn + +qemu-ppce500 test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "qemu-ppce500" + TEST_PY_TEST_SPEC: "not sleep" + QEMU_TARGET: "ppc-softmmu" + BUILDMAN: "^qemu-ppce500$" + TOOLCHAIN: "powerpc" + <<: *buildman_and_testpy_dfn + +qemu-x86 test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "qemu-x86" + TEST_PY_TEST_SPEC: "not sleep" + QEMU_TARGET: "i386-softmmu" + BUILDMAN: "^qemu-x86$" + TOOLCHAIN: "i386" + <<: *buildman_and_testpy_dfn + +qemu-x86_64 test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "qemu-x86_64" + TEST_PY_TEST_SPEC: "not sleep" + QEMU_TARGET: "x86_64-softmmu" + BUILDMAN: "^qemu-x86_64$" + TOOLCHAIN: "i386" + <<: *buildman_and_testpy_dfn + +zynq_zc702 test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "zynq_zc702" + TEST_PY_TEST_SPEC: "not sleep" + QEMU_TARGET: "arm-softmmu" + TEST_PY_ID: "--id qemu" + BUILDMAN: "^zynq_zc702$" + <<: *buildman_and_testpy_dfn + +xilinx_versal_virt test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "xilinx_versal_virt" + TEST_PY_TEST_SPEC: "not sleep" + QEMU_TARGET: "aarch64-softmmu" + TEST_PY_ID: "--id qemu" + BUILDMAN: "^xilinx_versal_virt$" + <<: *buildman_and_testpy_dfn + +xtfpga test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "xtfpga" + TEST_PY_TEST_SPEC: "not sleep" + QEMU_TARGET: "xtensa-softmmu" + TEST_PY_ID: "--id qemu" + BUILDMAN: "^xtfpga$" + TOOLCHAIN: "xtensa-dc233c-elf" + <<: *buildman_and_testpy_dfn From 699c0b93dce75f2d6d9bd2a127a335fed100b1d3 Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Wed, 17 Jul 2019 16:06:57 -0400 Subject: [PATCH 6/9] gitlab-ci: Add evb-ast2500 test.py test Bring us back into line with current Travis tests. Signed-off-by: Tom Rini --- .gitlab-ci.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3ddd5ad99a..cb636b25a6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -159,6 +159,16 @@ sandbox_spl test.py: TEST_PY_TEST_SPEC: "test_ofplatdata" <<: *buildman_and_testpy_dfn +evb-ast2500 test.py: + tags: [ 'all' ] + variables: + TEST_PY_BD: "evb-ast2500" + TEST_PY_ID: "--id qemu" + QEMU_TARGET: "arm-softmmu" + QEMU_VERSION: "506179e42112be77bfd071f050b15762d3b2cd43" + BUILDMAN: "^evb-ast2500$" + <<: *buildman_and_testpy_dfn + sandbox_flattree test.py: tags: [ 'all' ] variables: From 7fd0ea2b634ce0d7ecf3a2bdba45d34fdd7ab392 Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Wed, 17 Jul 2019 22:51:31 -0400 Subject: [PATCH 7/9] gitlab-ci: Add pyelftools when needed In order to mirror current Travis CI support we need to install this package via pip. Signed-off-by: Tom Rini --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cb636b25a6..da27caeef6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -22,6 +22,7 @@ stages: - . /tmp/venv/bin/activate - pip install pytest==2.8.7 - pip install python-subunit + - pip install pyelftools - grub-mkimage -o ~/grub_x86.efi -O i386-efi normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd - grub-mkimage -o ~/grub_x64.efi -O x86_64-efi normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd - mkdir ~/grub2-arm From 9f7bda104384465f8d63f39cab732ed28d8463cc Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Wed, 17 Jul 2019 17:51:28 -0400 Subject: [PATCH 8/9] gitlab-ci: Split the world build into 4 jobs To better allow for parallelization of the world build job split things into 32bit ARM (687 boards), 64bit ARM (215), PowerPC (311 boards) and everything else (167 boards). While the 32bit ARM job is heavier than I would like, there is not a natural split that would reduce it in half or so without requiring the sort of hard to maintain splits we have to do in Travis CI. Signed-off-by: Tom Rini --- .gitlab-ci.yml | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index da27caeef6..c24a7eaa62 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -68,12 +68,45 @@ stages: fi; fi; -build all plaforms: +build all 32bit ARM plaforms: tags: [ 'all' ] stage: world build script: - ret=0; - ./tools/buildman/buildman -P -E || ret=$?; + ./tools/buildman/buildman -P -E arm -x aarch64 || ret=$?; + if [[ $ret -ne 0 && $ret -ne 129 ]]; then + ./tools/buildman/buildman -sdeP; + exit $ret; + fi; + +build all 64bit ARM plaforms: + tags: [ 'all' ] + stage: world build + script: + - ret=0; + ./tools/buildman/buildman -P -E aarch64 || ret=$?; + if [[ $ret -ne 0 && $ret -ne 129 ]]; then + ./tools/buildman/buildman -sdeP; + exit $ret; + fi; + +build all PowerPC plaforms: + tags: [ 'all' ] + stage: world build + script: + - ret=0; + ./tools/buildman/buildman -P -E powerpc || ret=$?; + if [[ $ret -ne 0 && $ret -ne 129 ]]; then + ./tools/buildman/buildman -sdeP; + exit $ret; + fi; + +build all other plaforms: + tags: [ 'all' ] + stage: world build + script: + - ret=0; + ./tools/buildman/buildman -P -E -x arm,powerpc || ret=$?; if [[ $ret -ne 0 && $ret -ne 129 ]]; then ./tools/buildman/buildman -sdeP; exit $ret; From f0db8395b4dcd415288c8035bc71bbf1b44e0346 Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Thu, 18 Jul 2019 07:28:36 -0400 Subject: [PATCH 9/9] gitlab-ci: Move the pyelfutils section We need this for building some 64bit ARM platforms, not for test.py runs. Signed-off-by: Tom Rini --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c24a7eaa62..e27d86f962 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -22,7 +22,6 @@ stages: - . /tmp/venv/bin/activate - pip install pytest==2.8.7 - pip install python-subunit - - pip install pyelftools - grub-mkimage -o ~/grub_x86.efi -O i386-efi normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd - grub-mkimage -o ~/grub_x64.efi -O x86_64-efi normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd - mkdir ~/grub2-arm @@ -83,6 +82,9 @@ build all 64bit ARM plaforms: tags: [ 'all' ] stage: world build script: + - virtualenv /tmp/venv + - . /tmp/venv/bin/activate + - pip install pyelftools - ret=0; ./tools/buildman/buildman -P -E aarch64 || ret=$?; if [[ $ret -ne 0 && $ret -ne 129 ]]; then