105 lines
3.0 KiB
Bash
Executable File
105 lines
3.0 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Boot script for Chrome OS devices attached to a servo debug connector, using
|
|
# NFS and TFTP to boot.
|
|
|
|
# We're run from the root of the repo, make a helper var for our paths
|
|
BM=$CI_PROJECT_DIR/install/bare-metal
|
|
|
|
# Runner config checks
|
|
if [ -z "$BM_SERIAL" ]; then
|
|
echo "Must set BM_SERIAL in your gitlab-runner config.toml [[runners]] environment"
|
|
echo "This is the CPU serial device."
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$BM_SERIAL_EC" ]; then
|
|
echo "Must set BM_SERIAL in your gitlab-runner config.toml [[runners]] environment"
|
|
echo "This is the EC serial device for controlling board power"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -d /nfs ]; then
|
|
echo "NFS rootfs directory needs to be mounted at /nfs by the gitlab runner"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -d /tftp ]; then
|
|
echo "TFTP directory for this board needs to be mounted at /tftp by the gitlab runner"
|
|
exit 1
|
|
fi
|
|
|
|
# job config checks
|
|
if [ -z "$BM_KERNEL" ]; then
|
|
echo "Must set BM_KERNEL to your board's kernel FIT image"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$BM_ROOTFS" ]; then
|
|
echo "Must set BM_ROOTFS to your board's rootfs directory in the job's variables"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$BM_CMDLINE" ]; then
|
|
echo "Must set BM_CMDLINE to your board's kernel command line arguments"
|
|
exit 1
|
|
fi
|
|
|
|
set -ex
|
|
|
|
# Clear out any previous run's artifacts.
|
|
rm -rf results/
|
|
mkdir -p results
|
|
find artifacts/ -name serial\*.txt | xargs rm -f
|
|
|
|
# Create the rootfs in the NFS directory. rm to make sure it's in a pristine
|
|
# state, since it's volume-mounted on the host.
|
|
rsync -a --delete $BM_ROOTFS/ /nfs/
|
|
mkdir -p /nfs/results
|
|
. $BM/rootfs-setup.sh /nfs
|
|
|
|
# Set up the TFTP kernel/cmdline. When we support more than one board with
|
|
# this method, we'll need to do some check on the runner name or something.
|
|
rm -rf /tftp/*
|
|
cp $BM_KERNEL /tftp/vmlinuz
|
|
echo "$BM_CMDLINE" > /tftp/cmdline
|
|
|
|
# Start watching serials, and power up the device.
|
|
$BM/serial-buffer.py $BM_SERIAL_EC | tee serial-ec-output.txt | sed -u 's|^|SERIAL-EC> |g' &
|
|
$BM/serial-buffer.py $BM_SERIAL | tee serial-output.txt | sed -u 's|^|SERIAL-CPU> |g' &
|
|
while [ ! -e serial-output.txt ]; do
|
|
sleep 1
|
|
done
|
|
# Flush any partial commands in the EC's prompt, then ask for a reboot.
|
|
$BM/write-serial.py $BM_SERIAL_EC ""
|
|
$BM/write-serial.py $BM_SERIAL_EC reboot
|
|
|
|
# This is emitted right when the bootloader pauses to check for input. Emit a
|
|
# ^N character to request network boot, because we don't have a
|
|
# direct-to-netboot firmware on cheza.
|
|
$BM/expect-output.sh serial-output.txt -f "load_archive: loading locale_en.bin"
|
|
$BM/write-serial.py $BM_SERIAL `printf '\016'`
|
|
|
|
# Wait for the device to complete the deqp run
|
|
$BM/expect-output.sh serial-output.txt \
|
|
-f "bare-metal result" \
|
|
-e "---. end Kernel panic"
|
|
|
|
# power down the CPU on the device
|
|
$BM/write-serial.py $BM_SERIAL_EC 'power off'
|
|
|
|
set -ex
|
|
|
|
# Bring artifacts back from the NFS dir to the build dir where gitlab-runner
|
|
# will look for them. Note that results/ may already exist, so be careful
|
|
# with cp.
|
|
mkdir -p results
|
|
cp -Rp /nfs/results/. results/
|
|
|
|
set +e
|
|
if grep -q "bare-metal result: pass" serial-output.txt; then
|
|
exit 0
|
|
else
|
|
exit 1
|
|
fi
|