blob: ca95ec11f0f8883e5ab2fbe81dd73282501f1d9a [file] [log] [blame]
#!/bin/bash
# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# This opens various servo consoles using cu, from outside the chroot,
# automatically getting the correct console from dut-control. This
# also tees the output to a secondary logfile.
#
# The recommended way to use this is to setup an alias, e.g. add this in
# your .bashrc (outside the chroot):
# alias dut-console="~/chromiumos/src/platform/dev/contrib/dut-console"
# And then simply run:
# dut-console -c ec
#
# The script also allows to connect to different servod port, e.g.
# dut-console -c cpu -p 9998
CONTRIB_DIR="$(dirname "$(readlink -f "$0")")"
# Script is stored in $CROS_SDK/src/platform/dev/contrib
CROS_SDK="${CONTRIB_DIR}/../../../.."
kdmx_pid=
# Loads script libraries.
. "${CONTRIB_DIR}/common.sh" || exit 1
FLAGS_HELP='dut-control [flags]
Opens CPU/EC servo console using "cu", outputs to both terminal, and an output
file named "log-${type}[-${port}].log" in the current directory.
The recommended way to use this is to setup an alias, e.g. add this in your
.bashrc (outside the chroot):
# alias dut-console="~/chromiumos/src/platform/dev/contrib/dut-console"
And then simply run:
# dut-console -c ec
'
DEFINE_string console "cpu" \
"Opens a console, one of cpu, ec, cr50, fpmcu, servo_micro, servo_v4" c
DEFINE_integer port "" "Servod port" p
DEFINE_boolean kdmx "${FLAGS_FALSE}" \
"Start kdmx proxy for kgdb (only makes sense for cpu console)" k
# Parse command line.
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
if [[ "$#" -ne 0 ]]; then
echo "Extraneous arguments on command line: $@"
flags_help
exit 2
fi
# Only now can we die on error. shflags functions leak non-zero error codes,
# so will die prematurely if 'set -e' is specified before now.
set -e
cleanup() {
trap - INT TERM ERR EXIT
if [[ -n "${kdmx_pid}" ]]; then
kill "${kdmx_pid}" 2>/dev/null
fi
}
get_pty() {
local pty_name="$1"
local port="${2:-9999}"
local args=()
python3 -c \
"import xmlrpc.client;
servo = xmlrpc.client.ServerProxy('http://localhost:${port}');
print('%s' % servo.get('${pty_name}'))"
}
find_cu() {
if ! hash cu; then
echo "Please install cu first:" >&2
echo "sudo apt-get install cu" >&2
exit 1
fi
}
main() {
local kdmx
local pty
local pty_name
local outlog
find_cu
trap cleanup INT TERM ERR EXIT
pty_name="${FLAGS_console}_uart_pty"
pty="$(get_pty "${pty_name}" "${FLAGS_port}")"
if [[ ! -e "${pty}" ]]; then
echo "Cannot find pty ${pty_name}." >&2
exit 1
fi
outlog="log-${FLAGS_console}"
if [[ -n "${FLAGS_port}" ]]; then
outlog="${outlog}-${FLAGS_port}"
fi
outlog="${outlog}.log"
if [[ "${FLAGS_kdmx}" -eq "${FLAGS_TRUE}" ]]; then
if ! hash kdmx; then
echo "Please build and put kdmx in your PATH first." >&2
echo "See https://www.chromium.org/chromium-os/how-tos-and-troubleshooting/kernel-faq" >&2
exit 1
fi
# Note that we hardcode kdmx pty file location in the /tmp directory of the
# chroot. This should be ok as there is normally only one user, and only
# a single instance of dut-console/kdmx can run per console/servod instance.
local spath_in="/tmp/kdmx_${FLAGS_console}"
if [[ -n "${FLAGS_port}" ]]; then
spath_in="${spath_in}_${FLAGS_port}"
fi
local spath="${CROS_SDK}/chroot${spath_in}"
local spath_pty="${spath}_trm"
local spath_log="${spath}_log"
# Make sure we do not use a stale pty file
rm -f "${spath_pty}"
echo "Muxing ${pty_name}:${pty} with kdmx..."
kdmx -n -p "${pty}" -s "${spath}" > "${spath_log}" 2>&1 &
kdmx_pid="$!"
# Give kdmx enough time to start and create pty file
sleep 0.5
pty="$(cat "${spath_pty}" 2>/dev/null || true)"
if [[ -z "${pty}" ]]; then
echo "kdmx failed to start:" >&2
cat "${spath_log}" >&2
exit 1
fi
echo "You can now use kdbg inside the chroot with a command like:"
echo '${CROSS_ARCH}-gdb \
/build/${BOARD}/usr/lib/debug/boot/vmlinux \
-iex "add-auto-load-safe-path /build/${BOARD}/usr/lib/debug/boot/vmlinux-gdb.py" \
-ex "target remote $(cat '"${spath_in}"'_gdb)"'
fi
echo "Opening ${pty_name}:${pty}..."
echo "Log in ${outlog}, type <enter>~. to exit."
stdbuf -oL cu --nostop -l "${pty}" | tee "${outlog}"
}
main