blob: 05f7789e927f05186507c6e66ccffb11f054ab5e [file] [log] [blame]
#!/bin/sh -ue
# Copyright (c) 2010 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.
#
# A script to mark the current kernel partition as successfully booted.
# If we're not running as root, restart as root.
if [ $(id -u) -ne 0 ]; then
exec sudo "$0" "$@"
fi
# Load functions and constants for chromeos-install.
. /usr/share/misc/chromeos-common.sh || exit 1
get_dev_by_part_uuid() {
local dev guid="$1"
# Look through the root device, the most likely place to find the partition.
dev="$(cgpt find -1 -u "${guid}" "$(rootdev -d -s)")"
if [ -z "${dev}" ]; then
# Look through all the known devices to find that one partition.
dev="$(cgpt find -1 -u "${guid}")"
fi
echo "${dev}"
}
FAFT_LOCKFILE="/var/tmp/faft/lock"
if [ -f "$FAFT_LOCKFILE" ]; then
echo "FAFT lockfile exists, skipping chromeos-setgoodkernel actions"
exit
fi
if grep -q 'cros_efi' /proc/cmdline ; then
is_efi=1
else
is_efi=0
fi
# Extract the kernel partition's UniqueGuid from the command line.
if [ $is_efi -eq 1 ]; then
guid=$(sed -n 's/.*root=PARTUUID=\([0-9a-fA-F-]\+\).*/\1/p' /proc/cmdline)
if [ -n "${guid}" ]; then
root_dev=$(get_dev_by_part_uuid "${guid}")
fi
else
guid=$(sed -n 's/.*kern_guid=\([0-9a-fA-F-]\+\).*/\1/p' /proc/cmdline)
if [ -n "${guid}" ]; then
kern_dev=$(get_dev_by_part_uuid "${guid}")
fi
fi
# If no Guid extracted from cmdline, get the root partition.
if [ -z "${guid}" ]; then
root_dev=$(rootdev -s)
fi
# Split the kernel device into the base device and paritition number.
if [ -n "${kern_dev:+x}" ]; then
base_dev=$(get_block_dev_from_partition_dev "${kern_dev}")
kern_num=$(get_partition_number "${kern_dev}")
else
base_dev=$(get_block_dev_from_partition_dev "${root_dev}")
# EFI and legacy BIOSes boot the ROOT-x partition which is KERN-x + 1
kern_num=$(($(get_partition_number "${root_dev}") - 1))
fi
# kern_dev would be /dev/mtd2 or /dev/mtd4 on NAND, base_dev will be /dev/mtd.
# But that's wrong, it should be /dev/mtd0 because there is no /dev/mtd device.
# ChromeOS only supports one NAND device, we use /dev/mtd0 for that.
if [ "${base_dev}" = "/dev/mtd" ]; then
base_dev="/dev/mtd0"
fi
# Mark the kernel as successfully booted (success=1, tries=0).
cgpt add "${base_dev}" -i $kern_num -S1 -T0
# Mark the kernel as highest priority
cgpt prioritize "${base_dev}" -i $kern_num
# Collect any startup time firmware updater logs (see chromeos_startup)
FIRMWARE_UPDATE_LOG='/mnt/stateful_partition/update_firmware.log'
if [ -f "${FIRMWARE_UPDATE_LOG}" ]; then
echo "Found startup-time firmware updating logs:"
stat -c "%y" "${FIRMWARE_UPDATE_LOG}"
echo "------------------------------------------"
cat "${FIRMWARE_UPDATE_LOG}" && rm -f "${FIRMWARE_UPDATE_LOG}"
echo "------------------------------------------"
fi
# Set firmware as 'good' if possible.
SET_GOOD_FIRMWARE_SCRIPT='/usr/sbin/chromeos-setgoodfirmware'
if [ -x "${SET_GOOD_FIRMWARE_SCRIPT}" ]; then
"${SET_GOOD_FIRMWARE_SCRIPT}"
fi
# Run the verified boot debugging tool now, because we won't be able to run it
# manually if there's a problem (no root shell). It leaves a log file that we
# can look at.
dev_debug_vboot --cleanup > /dev/null 2>&1 &