161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin#!/bin/sh 261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# 361603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 461603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# Use of this source code is governed by a BSD-style license that can be 561603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# found in the LICENSE file. 661603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# 761603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# This script can change GBB flags in system live firmware or a given image 861603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# file. 961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 1061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinSCRIPT_BASE="$(dirname "$0")" 1161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin. "$SCRIPT_BASE/common_minimal.sh" 1261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Linload_shflags || exit 1 1361603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 1461603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# DEFINE_string name default_value description flag 1561603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinDEFINE_string file "" "Path to firmware image. Default to system firmware." "f" 16e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te LinDEFINE_boolean check_wp $FLAGS_TRUE "Check write protection states first." "" 1761603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 1861603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# Globals 1961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# ---------------------------------------------------------------------------- 2061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Linset -e 2161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 2261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# Values from vboot_reference/firmware/include/gbb_header.h 2361603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinGBBFLAGS_DESCRIPTION=" 2461603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin Defined flags (some values may be not supported by all systems): 2561603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 2661603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin GBB_FLAG_DEV_SCREEN_SHORT_DELAY 0x00000001 2761603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin GBB_FLAG_LOAD_OPTION_ROMS 0x00000002 2861603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin GBB_FLAG_ENABLE_ALTERNATE_OS 0x00000004 2961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin GBB_FLAG_FORCE_DEV_SWITCH_ON 0x00000008 3061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin GBB_FLAG_FORCE_DEV_BOOT_USB 0x00000010 3161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin GBB_FLAG_DISABLE_FW_ROLLBACK_CHECK 0x00000020 3246c01a2d2bceaf6948c53ca8946ed19b900190b3Tom Wai-Hong Tam GBB_FLAG_ENTER_TRIGGERS_TONORM 0x00000040 33a2326ee152ab5b8aee924ccf794cee38d54909bdStefan Reinauer GBB_FLAG_FORCE_DEV_BOOT_LEGACY 0x00000080 349754cae1c1c4b267f228ee65df410e4115dc3d17Marc Jones GBB_FLAG_FAFT_KEY_OVERIDE 0x00000100 35f2a1dc0a54ec542dd4be7b634483de317c89a2a2Randall Spangler GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC 0x00000200 36f2a1dc0a54ec542dd4be7b634483de317c89a2a2Randall Spangler GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY 0x00000400 37277dc5274c5c906c8d80d2ae4cc7679d234e8408Duncan Laurie GBB_FLAG_DISABLE_PD_SOFTWARE_SYNC 0x00000800 3861603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 3961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin To get a developer-friendly device, try 0x11 (short_delay + boot_usb). 4061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin For factory-related tests (always DEV), try 0x39. 4161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin" 4261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 4361603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinFLAGS_HELP="Changes ChromeOS Firmware GBB Flags value. 4461603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 4561603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin Usage: $0 [option_flags] GBB_FLAGS_VALUE 4661603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin $GBBFLAGS_DESCRIPTION" 4761603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 48798cc91de11d5a78e379c67731dcafaf2aae01e1Hung-Te LinFLASHROM_COMMON_OPT="-p host" 4961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinFLASHROM_READ_OPT="$FLASHROM_COMMON_OPT -i GBB -r" 5061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinFLASHROM_WRITE_OPT="$FLASHROM_COMMON_OPT -i GBB --fast-verify -w" 5161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 52e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin# Check write protection 53e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin# ---------------------------------------------------------------------------- 54e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lincheck_write_protection() { 554ff446b493e8a74804fd00082119681f768d366aHung-Te Lin local hw_wp="" sw_wp="" 56e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin if ! crossystem "wpsw_boot?0"; then 574ff446b493e8a74804fd00082119681f768d366aHung-Te Lin hw_wp="on" 58e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin fi 59e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin local wp_states="$(flashrom --wp-status 2>/dev/null | grep WP)" 60e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin local wp_disabled="$(echo "$wp_states" | grep "WP:.*is disabled.")" 61e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin local wp_zero_len="$(echo "$wp_states" | grep "WP:.*, len=0x00000000")" 62e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin if [ -z "$wp_disabled" -a -z "$wp_zero_len" ]; then 634ff446b493e8a74804fd00082119681f768d366aHung-Te Lin sw_wp="on" 64e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin fi 654ff446b493e8a74804fd00082119681f768d366aHung-Te Lin if [ -n "$hw_wp" -a -n "$sw_wp" ]; then 664ff446b493e8a74804fd00082119681f768d366aHung-Te Lin return $FLAGS_FALSE 674ff446b493e8a74804fd00082119681f768d366aHung-Te Lin fi 684ff446b493e8a74804fd00082119681f768d366aHung-Te Lin return $FLAGS_TRUE 69e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin} 70e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin 7161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# Main 7261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# ---------------------------------------------------------------------------- 7361603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Linmain() { 7461603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin if [ "$#" != "1" ]; then 7561603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin flags_help 7661603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin exit 1 7761603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin fi 7861603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 7961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin local value="$(($1))" 8061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin local image_file="$FLAGS_file" 8161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 8261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin if [ -z "$FLAGS_file" ]; then 8361603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin image_file="$(make_temp_file)" 8461603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin flashrom $FLASHROM_READ_OPT "$image_file" 8561603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin fi 8661603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 8761603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin # Process file 8861603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin local old_value="$(gbb_utility -g --flags "$image_file")" 8961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin printf "Setting GBB flags from %s to 0x%x.." "$old_value" "$value" >&2 9061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin gbb_utility -s --flags="$value" "$image_file" 9161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 9261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin if [ -z "$FLAGS_file" ]; then 93e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin if [ "$FLAGS_check_wp" = "$FLAGS_TRUE" ]; then 94e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin if ! check_write_protection; then 95e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin echo "" 96e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin echo "WARNING: System GBB Flags are NOT changed!!!" 97e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin echo "ERROR: You must disable write protection before setting flags." 98e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin exit 1 99e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin fi 100e8117120b677937902fc3c75ba3cee97e1fa0dc1Hung-Te Lin fi 10161603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin flashrom $FLASHROM_WRITE_OPT "$image_file" 10261603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin fi 10361603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin} 10461603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 10561603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin# Parse command line 10661603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinFLAGS "$@" || exit 1 10761603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te LinORIGINAL_PARAMS="$@" 10861603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lineval set -- "$FLAGS_ARGV" 10961603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Lin 11061603e2d6128d6fadd2fd8b1f16d60c5df8c00bdHung-Te Linmain "$@" 111