blob: f4b09db6b0a9d7dc6ed46ba9064fcb2b59bf9c1b [file] [log] [blame]
#!/bin/bash
# Copyright 2020 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.
# Loads script libraries.
CONTRIB_DIR=$(dirname "$(readlink -f "$0")")
. "${CONTRIB_DIR}/common.sh" || exit 1
FLAGS_HELP="
Decode kernel stack trace from kernel logs.
Read kernel logs from stdin, and print the decoded stack trace to stdout.
Usage:
kernel_decode_stack -b <board>
"
# Flags
DEFINE_string board "${DEFAULT_BOARD}" "Which board to decode stack trace" b
# Parse command line.
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
set -e
# Script must be run inside the chroot.
assert_inside_chroot
decode_stacktrace() {
local board="$1"
shift
local CHOST
CHOST=$("portageq-${board}" envvar CHOST)
local ARCH
ARCH=$("portageq-${board}" envvar ARCH)
# cros-kernel2.eclass falls back to tc-arch-kernel when CHROMEOS_KERNEL_ARCH
# is not set, but since tc-arch-kernel parse the arch from CHOST, we can just
# ignnore kernel_arch and use the original CHOST as CROSS_COMPILE in this
# case.
local kernel_arch
kernel_arch=$("portageq-${board}" envvar CHROMEOS_KERNEL_ARCH || true)
# This part is from cros-kernel2.eclass
# Support 64bit kernels w/32bit userlands.
local cross=${CHOST}
if [[ "${ARCH}:${kernel_arch}" == "arm:arm64" ]]; then
cross="aarch64-cros-linux-gnu"
fi
# Note: This would point to some temporary path if the kernel is not worked
# on, but it's ok since the decode_stacktrace.sh only use this path to strip
# the output.
#
# This is also why we always use the decode_stacktrace.sh from
# kernel/upstream instead of using the one in kernel_source_path.
local kernel_source_path
kernel_source_path=$(
objdump -WL "/build/${board}/usr/lib/debug/boot/vmlinux" |
grep 'include/linux/compiler.h:$' |
head -1 |
sed 's|\(.*\)/include/linux/compiler.h:$|\1|')
ARCH=${kernel_arch} CROSS_COMPILE="${cross}-" \
"${SRC_ROOT}/third_party/kernel/upstream/scripts/decode_stacktrace.sh" \
"/build/${board}/usr/lib/debug/boot/vmlinux" \
"${kernel_source_path}" \
"/build/${board}/usr/lib/debug/lib/modules/"*/
}
main() {
if [[ -z "${FLAGS_board}" ]]; then
die "-b or --board required."
fi
decode_stacktrace "${FLAGS_board}" "$@"
}
main "$@"