506 lines
19 KiB
Bash
Executable File
506 lines
19 KiB
Bash
Executable File
#!/bin/bash -eux
|
|
# 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.
|
|
|
|
me=${0##*/}
|
|
TMP="$me.tmp"
|
|
|
|
# Test --sys_props (primitive test needed for future updating tests).
|
|
test_sys_props() {
|
|
! "${FUTILITY}" --debug update --sys_props "$*" 2>&1 |
|
|
sed -n 's/.*property\[\(.*\)].value = \(.*\)/\1,\2,/p' |
|
|
tr '\n' ' '
|
|
}
|
|
|
|
test "$(test_sys_props "1,2,3")" = "0,1, 1,2, 2,3, "
|
|
test "$(test_sys_props "1 2 3")" = "0,1, 1,2, 2,3, "
|
|
test "$(test_sys_props "1, 2,3 ")" = "0,1, 1,2, 2,3, "
|
|
test "$(test_sys_props " 1,, 2")" = "0,1, 2,2, "
|
|
test "$(test_sys_props " , 4,")" = "1,4, "
|
|
|
|
test_quirks() {
|
|
! "${FUTILITY}" --debug update --quirks "$*" 2>&1 |
|
|
sed -n 's/.*Set quirk \(.*\) to \(.*\)./\1,\2/p' |
|
|
tr '\n' ' '
|
|
}
|
|
|
|
test "$(test_quirks "enlarge_image")" = "enlarge_image,1 "
|
|
test "$(test_quirks "enlarge_image=2")" = "enlarge_image,2 "
|
|
test "$(test_quirks " enlarge_image, enlarge_image=2")" = \
|
|
"enlarge_image,1 enlarge_image,2 "
|
|
|
|
# Test data files
|
|
LINK_BIOS="${SCRIPT_DIR}/futility/data/bios_link_mp.bin"
|
|
PEPPY_BIOS="${SCRIPT_DIR}/futility/data/bios_peppy_mp.bin"
|
|
RO_VPD_BLOB="${SCRIPT_DIR}/futility/data/ro_vpd.bin"
|
|
|
|
# Work in scratch directory
|
|
cd "$OUTDIR"
|
|
set -o pipefail
|
|
|
|
# In all the test scenario, we want to test "updating from PEPPY to LINK".
|
|
TO_IMAGE=${TMP}.src.link
|
|
FROM_IMAGE=${TMP}.src.peppy
|
|
TO_HWID="X86 LINK TEST 6638"
|
|
FROM_HWID="X86 PEPPY TEST 4211"
|
|
cp -f ${LINK_BIOS} ${TO_IMAGE}
|
|
cp -f ${PEPPY_BIOS} ${FROM_IMAGE}
|
|
"${FUTILITY}" load_fmap "${FROM_IMAGE}" \
|
|
RO_VPD:"${RO_VPD_BLOB}" RW_VPD:"${RO_VPD_BLOB}"
|
|
cp -f "${FROM_IMAGE}" "${FROM_IMAGE}".unpatched
|
|
|
|
patch_file() {
|
|
local file="$1"
|
|
local section="$2"
|
|
local section_offset="$3"
|
|
local data="$4"
|
|
|
|
# NAME OFFSET SIZE
|
|
local fmap_info="$(${FUTILITY} dump_fmap -p ${file} ${section})"
|
|
local base="$(echo "${fmap_info}" | sed 's/^[^ ]* //; s/ [^ ]*$//')"
|
|
local offset=$((base + section_offset))
|
|
echo "offset: ${offset}"
|
|
printf "${data}" | dd of="${file}" bs=1 seek="${offset}" conv=notrunc
|
|
}
|
|
|
|
# PEPPY and LINK have different platform element ("Google_Link" and
|
|
# "Google_Peppy") in firmware ID so we want to hack them by changing
|
|
# "Google_" to "Google.".
|
|
patch_file ${TO_IMAGE} RW_FWID_A 0 Google.
|
|
patch_file ${TO_IMAGE} RW_FWID_B 0 Google.
|
|
patch_file ${TO_IMAGE} RO_FRID 0 Google.
|
|
patch_file ${FROM_IMAGE} RW_FWID_A 0 Google.
|
|
patch_file ${FROM_IMAGE} RW_FWID_B 0 Google.
|
|
patch_file ${FROM_IMAGE} RO_FRID 0 Google.
|
|
|
|
unpack_image() {
|
|
local folder="${TMP}.$1"
|
|
local image="$2"
|
|
mkdir -p "${folder}"
|
|
(cd "${folder}" && ${FUTILITY} dump_fmap -x "../${image}")
|
|
${FUTILITY} gbb -g --rootkey="${folder}/rootkey" "${image}"
|
|
}
|
|
|
|
# Unpack images so we can prepare expected results by individual sections.
|
|
unpack_image "to" "${TO_IMAGE}"
|
|
unpack_image "from" "${FROM_IMAGE}"
|
|
|
|
# Hack FROM_IMAGE so it has same root key as TO_IMAGE (for RW update).
|
|
FROM_DIFFERENT_ROOTKEY_IMAGE="${FROM_IMAGE}2"
|
|
cp -f "${FROM_IMAGE}" "${FROM_DIFFERENT_ROOTKEY_IMAGE}"
|
|
"${FUTILITY}" gbb -s --rootkey="${TMP}.to/rootkey" "${FROM_IMAGE}"
|
|
|
|
# Hack for quirks
|
|
cp -f "${FROM_IMAGE}" "${FROM_IMAGE}.large"
|
|
truncate -s $((8388608 * 2)) "${FROM_IMAGE}.large"
|
|
|
|
# Create GBB v1.2 images (for checking digest)
|
|
GBB_OUTPUT="$("${FUTILITY}" gbb --digest "${TO_IMAGE}")"
|
|
[ "${GBB_OUTPUT}" = "digest: <none>" ]
|
|
TO_IMAGE_GBB12="${TO_IMAGE}.gbb12"
|
|
HWID_DIGEST="adf64d2a434b610506153da42440b0b498d7369c0e98b629ede65eb59f4784fa"
|
|
cp -f "${TO_IMAGE}" "${TO_IMAGE_GBB12}"
|
|
patch_file "${TO_IMAGE_GBB12}" GBB 6 "\x02"
|
|
"${FUTILITY}" gbb -s --hwid="${TO_HWID}" "${TO_IMAGE_GBB12}"
|
|
GBB_OUTPUT="$("${FUTILITY}" gbb --digest "${TO_IMAGE_GBB12}")"
|
|
[ "${GBB_OUTPUT}" = "digest: ${HWID_DIGEST} valid" ]
|
|
|
|
# Generate expected results.
|
|
cp -f "${TO_IMAGE}" "${TMP}.expected.full"
|
|
cp -f "${FROM_IMAGE}" "${TMP}.expected.rw"
|
|
cp -f "${FROM_IMAGE}" "${TMP}.expected.a"
|
|
cp -f "${FROM_IMAGE}" "${TMP}.expected.b"
|
|
cp -f "${FROM_IMAGE}" "${TMP}.expected.legacy"
|
|
"${FUTILITY}" gbb -s --hwid="${FROM_HWID}" "${TMP}.expected.full"
|
|
"${FUTILITY}" load_fmap "${TMP}.expected.full" \
|
|
RW_VPD:${TMP}.from/RW_VPD \
|
|
RO_VPD:${TMP}.from/RO_VPD
|
|
"${FUTILITY}" load_fmap "${TMP}.expected.rw" \
|
|
RW_SECTION_A:${TMP}.to/RW_SECTION_A \
|
|
RW_SECTION_B:${TMP}.to/RW_SECTION_B \
|
|
RW_SHARED:${TMP}.to/RW_SHARED \
|
|
RW_LEGACY:${TMP}.to/RW_LEGACY
|
|
"${FUTILITY}" load_fmap "${TMP}.expected.a" \
|
|
RW_SECTION_A:${TMP}.to/RW_SECTION_A
|
|
"${FUTILITY}" load_fmap "${TMP}.expected.b" \
|
|
RW_SECTION_B:${TMP}.to/RW_SECTION_B
|
|
"${FUTILITY}" load_fmap "${TMP}.expected.legacy" \
|
|
RW_LEGACY:${TMP}.to/RW_LEGACY
|
|
cp -f "${TMP}.expected.full" "${TMP}.expected.full.gbb12"
|
|
patch_file "${TMP}.expected.full.gbb12" GBB 6 "\x02"
|
|
"${FUTILITY}" gbb -s --hwid="${FROM_HWID}" "${TMP}.expected.full.gbb12"
|
|
cp -f "${TMP}.expected.full" "${TMP}.expected.full.gbb0"
|
|
"${FUTILITY}" gbb -s --flags=0 "${TMP}.expected.full.gbb0"
|
|
cp -f "${FROM_IMAGE}" "${FROM_IMAGE}.gbb0"
|
|
"${FUTILITY}" gbb -s --flags=0 "${FROM_IMAGE}.gbb0"
|
|
cp -f "${TMP}.expected.full" "${TMP}.expected.full.gbb0x27"
|
|
"${FUTILITY}" gbb -s --flags=0x27 "${TMP}.expected.full.gbb0x27"
|
|
cp -f "${TMP}.expected.full" "${TMP}.expected.large"
|
|
dd if=/dev/zero bs=8388608 count=1 | tr '\000' '\377' >>"${TMP}.expected.large"
|
|
cp -f "${TMP}.expected.full" "${TMP}.expected.me_unlocked"
|
|
patch_file "${TMP}.expected.me_unlocked" SI_DESC 128 \
|
|
"\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff"
|
|
|
|
# A special set of images that only RO_VPD is preserved (RW_VPD is wiped) using
|
|
# FMAP_AREA_PRESERVE (\010=0x08).
|
|
TO_IMAGE_WIPE_RW_VPD="${TO_IMAGE}.wipe_rw_vpd"
|
|
cp -f "${TO_IMAGE}" "${TO_IMAGE_WIPE_RW_VPD}"
|
|
patch_file ${TO_IMAGE_WIPE_RW_VPD} FMAP 0x3fc "$(printf '\010')"
|
|
cp -f "${TMP}.expected.full" "${TMP}.expected.full.empty_rw_vpd"
|
|
"${FUTILITY}" load_fmap "${TMP}.expected.full.empty_rw_vpd" \
|
|
RW_VPD:"${TMP}.to/RW_VPD"
|
|
patch_file "${TMP}.expected.full.empty_rw_vpd" FMAP 0x3fc "$(printf '\010')"
|
|
|
|
test_update() {
|
|
local test_name="$1"
|
|
local emu_src="$2"
|
|
local expected="$3"
|
|
local error_msg="${expected#!}"
|
|
local msg
|
|
|
|
shift 3
|
|
cp -f "${emu_src}" "${TMP}.emu"
|
|
echo "*** Test Item: ${test_name}"
|
|
if [ "${error_msg}" != "${expected}" ] && [ -n "${error_msg}" ]; then
|
|
msg="$(! "${FUTILITY}" update --emulate "${TMP}.emu" "$@" 2>&1)"
|
|
grep -qF -- "${error_msg}" <<<"${msg}"
|
|
else
|
|
"${FUTILITY}" update --emulate "${TMP}.emu" "$@"
|
|
cmp "${TMP}.emu" "${expected}"
|
|
fi
|
|
}
|
|
|
|
# --sys_props: mainfw_act, tpm_fwver, is_vboot2, platform_ver, [wp_hw, wp_sw]
|
|
# tpm_fwver = <data key version:16><firmware version:16>.
|
|
# TO_IMAGE is signed with data key version = 1, firmware version = 4 => 0x10004.
|
|
|
|
# Test Full update.
|
|
test_update "Full update" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.full" \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1
|
|
|
|
test_update "Full update (incompatible platform)" \
|
|
"${FROM_IMAGE}" "!platform is not compatible" \
|
|
-i "${LINK_BIOS}" --wp=0 --sys_props 0,0x10001,1
|
|
|
|
test_update "Full update (TPM Anti-rollback: data key)" \
|
|
"${FROM_IMAGE}" "!Data key version rollback detected (2->1)" \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 1,0x20001,1
|
|
|
|
test_update "Full update (TPM Anti-rollback: kernel key)" \
|
|
"${FROM_IMAGE}" "!Firmware version rollback detected (5->4)" \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 1,0x10005,1
|
|
|
|
test_update "Full update (TPM Anti-rollback: 0 as tpm_fwver)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.full" \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x0,1
|
|
|
|
test_update "Full update (TPM check failure due to invalid tpm_fwver)" \
|
|
"${FROM_IMAGE}" "!Invalid tpm_fwver: -1" \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,-1,1
|
|
|
|
test_update "Full update (Skip TPM check with --force)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.full" \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,-1,1 --force
|
|
|
|
test_update "Full update (from stdin)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.full" \
|
|
-i - --wp=0 --sys_props 0,-1,1 --force <"${TO_IMAGE}"
|
|
|
|
test_update "Full update (GBB=0 -> 0)" \
|
|
"${FROM_IMAGE}.gbb0" "${TMP}.expected.full.gbb0" \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1
|
|
|
|
test_update "Full update (GBB flags -> 0x27)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.full.gbb0x27" \
|
|
-i "${TO_IMAGE}" --gbb_flags=0x27 --wp=0 --sys_props 0,0x10001,1
|
|
|
|
test_update "Full update (--host_only)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.full" \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1 \
|
|
--host_only --ec_image non-exist.bin --pd_image non_exist.bin
|
|
|
|
test_update "Full update (GBB1.2 hwid digest)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.full.gbb12" \
|
|
-i "${TO_IMAGE_GBB12}" --wp=0 --sys_props 0,0x10001,1
|
|
|
|
test_update "Full update (Preserve VPD using FMAP_AREA_PRESERVE)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.full.empty_rw_vpd" \
|
|
-i "${TO_IMAGE_WIPE_RW_VPD}" --wp=0 --sys_props 0,0x10001,1
|
|
|
|
|
|
# Test RW-only update.
|
|
test_update "RW update" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.rw" \
|
|
-i "${TO_IMAGE}" --wp=1 --sys_props 0,0x10001,1
|
|
|
|
test_update "RW update (incompatible platform)" \
|
|
"${FROM_IMAGE}" "!platform is not compatible" \
|
|
-i "${LINK_BIOS}" --wp=1 --sys_props 0,0x10001,1
|
|
|
|
test_update "RW update (incompatible rootkey)" \
|
|
"${FROM_DIFFERENT_ROOTKEY_IMAGE}" "!RW signed by incompatible root key" \
|
|
-i "${TO_IMAGE}" --wp=1 --sys_props 0,0x10001,1
|
|
|
|
test_update "RW update (TPM Anti-rollback: data key)" \
|
|
"${FROM_IMAGE}" "!Data key version rollback detected (2->1)" \
|
|
-i "${TO_IMAGE}" --wp=1 --sys_props 1,0x20001,1
|
|
|
|
test_update "RW update (TPM Anti-rollback: kernel key)" \
|
|
"${FROM_IMAGE}" "!Firmware version rollback detected (5->4)" \
|
|
-i "${TO_IMAGE}" --wp=1 --sys_props 1,0x10005,1
|
|
|
|
# Test Try-RW update (vboot2).
|
|
test_update "RW update (A->B)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.b" \
|
|
-i "${TO_IMAGE}" -t --wp=1 --sys_props 0,0x10001,1
|
|
|
|
test_update "RW update (B->A)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.a" \
|
|
-i "${TO_IMAGE}" -t --wp=1 --sys_props 1,0x10001,1
|
|
|
|
test_update "RW update -> fallback to RO+RW Full update" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.full" \
|
|
-i "${TO_IMAGE}" -t --wp=0 --sys_props 1,0x10002,1
|
|
test_update "RW update (incompatible platform)" \
|
|
"${FROM_IMAGE}" "!platform is not compatible" \
|
|
-i "${LINK_BIOS}" -t --wp=1 --sys_props 0x10001,1
|
|
|
|
test_update "RW update (incompatible rootkey)" \
|
|
"${FROM_DIFFERENT_ROOTKEY_IMAGE}" "!RW signed by incompatible root key" \
|
|
-i "${TO_IMAGE}" -t --wp=1 --sys_props 0,0x10001,1
|
|
|
|
test_update "RW update (TPM Anti-rollback: data key)" \
|
|
"${FROM_IMAGE}" "!Data key version rollback detected (2->1)" \
|
|
-i "${TO_IMAGE}" -t --wp=1 --sys_props 1,0x20001,1
|
|
|
|
test_update "RW update (TPM Anti-rollback: kernel key)" \
|
|
"${FROM_IMAGE}" "!Firmware version rollback detected (5->4)" \
|
|
-i "${TO_IMAGE}" -t --wp=1 --sys_props 1,0x10005,1
|
|
|
|
test_update "RW update -> fallback to RO+RW Full update (TPM Anti-rollback)" \
|
|
"${FROM_IMAGE}" "!Firmware version rollback detected (6->4)" \
|
|
-i "${TO_IMAGE}" -t --wp=0 --sys_props 1,0x10006,1
|
|
|
|
# Test Try-RW update (vboot1).
|
|
test_update "RW update (vboot1, A->B)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.b" \
|
|
-i "${TO_IMAGE}" -t --wp=1 --sys_props 0,0 --sys_props 0,0x10001,0
|
|
|
|
test_update "RW update (vboot1, B->B)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.b" \
|
|
-i "${TO_IMAGE}" -t --wp=1 --sys_props 1,0 --sys_props 0,0x10001,0
|
|
|
|
# Test 'factory mode'
|
|
test_update "Factory mode update (WP=0)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.full" \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1 --mode=factory
|
|
|
|
test_update "Factory mode update (WP=0)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.full" \
|
|
--factory -i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1
|
|
|
|
test_update "Factory mode update (WP=1)" \
|
|
"${FROM_IMAGE}" "!remove write protection for factory mode" \
|
|
-i "${TO_IMAGE}" --wp=1 --sys_props 0,0x10001,1 --mode=factory
|
|
|
|
test_update "Factory mode update (WP=1)" \
|
|
"${FROM_IMAGE}" "!remove write protection for factory mode" \
|
|
--factory -i "${TO_IMAGE}" --wp=1 --sys_props 0,0x10001,1
|
|
|
|
test_update "Factory mode update (GBB=0 -> 0x39)" \
|
|
"${FROM_IMAGE}.gbb0" "${TMP}.expected.full" \
|
|
--factory -i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1
|
|
|
|
# Test legacy update
|
|
test_update "Legacy update" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.legacy" \
|
|
-i "${TO_IMAGE}" --mode=legacy
|
|
|
|
# Test quirks
|
|
test_update "Full update (wrong size)" \
|
|
"${FROM_IMAGE}.large" "!Image size is different" \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1 \
|
|
--quirks unlock_me_for_update,eve_smm_store
|
|
|
|
test_update "Full update (--quirks enlarge_image)" \
|
|
"${FROM_IMAGE}.large" "${TMP}.expected.large" --quirks enlarge_image \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1
|
|
|
|
test_update "Full update (multi-line --quirks enlarge_image)" \
|
|
"${FROM_IMAGE}.large" "${TMP}.expected.large" --quirks '
|
|
enlarge_image
|
|
' -i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1
|
|
|
|
test_update "Full update (--quirks unlock_me_for_update)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.me_unlocked" \
|
|
--quirks unlock_me_for_update \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1
|
|
|
|
test_update "Full update (failure by --quirks min_platform_version)" \
|
|
"${FROM_IMAGE}" "!Need platform version >= 3 (current is 2)" \
|
|
--quirks min_platform_version=3 \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1,2
|
|
|
|
test_update "Full update (--quirks min_platform_version)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.full" \
|
|
--quirks min_platform_version=3 \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1,3
|
|
|
|
test_update "Full update (incompatible platform)" \
|
|
"${FROM_IMAGE}".unpatched "!platform is not compatible" \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1
|
|
|
|
test_update "Full update (--quirks no_check_platform)" \
|
|
"${FROM_IMAGE}".unpatched "${TMP}.expected.full" \
|
|
--quirks no_check_platform \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1
|
|
|
|
# Test archive and manifest.
|
|
A="${TMP}.archive"
|
|
mkdir -p "${A}/bin"
|
|
echo 'echo "${WL_TAG}"' >"${A}/bin/vpd"
|
|
chmod +x "${A}/bin/vpd"
|
|
|
|
cp -f "${LINK_BIOS}" "${A}/bios.bin"
|
|
echo "TEST: Manifest (--manifest, bios.bin)"
|
|
${FUTILITY} update -a "${A}" --manifest >"${TMP}.json.out"
|
|
cmp "${TMP}.json.out" "${SCRIPT_DIR}/futility/link_bios.manifest.json"
|
|
|
|
mv -f "${A}/bios.bin" "${A}/image.bin"
|
|
echo "TEST: Manifest (--manifest, image.bin)"
|
|
${FUTILITY} update -a "${A}" --manifest >"${TMP}.json.out"
|
|
cmp "${TMP}.json.out" "${SCRIPT_DIR}/futility/link_image.manifest.json"
|
|
|
|
|
|
cp -f "${TO_IMAGE}" "${A}/image.bin"
|
|
test_update "Full update (--archive, single package)" \
|
|
"${FROM_IMAGE}" "${TMP}.expected.full" \
|
|
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3
|
|
|
|
echo "TEST: Output (--mode=output)"
|
|
mkdir -p "${TMP}.output"
|
|
${FUTILITY} update -i "${LINK_BIOS}" --mode=output --output_dir="${TMP}.output"
|
|
cmp "${LINK_BIOS}" "${TMP}.output/image.bin"
|
|
|
|
mkdir -p "${A}/keyset"
|
|
cp -f "${LINK_BIOS}" "${A}/image.bin"
|
|
cp -f "${TMP}.to/rootkey" "${A}/keyset/rootkey.WL"
|
|
cp -f "${TMP}.to/VBLOCK_A" "${A}/keyset/vblock_A.WL"
|
|
cp -f "${TMP}.to/VBLOCK_B" "${A}/keyset/vblock_B.WL"
|
|
${FUTILITY} gbb -s --rootkey="${TMP}.from/rootkey" "${A}/image.bin"
|
|
${FUTILITY} load_fmap "${A}/image.bin" VBLOCK_A:"${TMP}.from/VBLOCK_A"
|
|
${FUTILITY} load_fmap "${A}/image.bin" VBLOCK_B:"${TMP}.from/VBLOCK_B"
|
|
|
|
test_update "Full update (--archive, whitelabel, no VPD)" \
|
|
"${A}/image.bin" "!Need VPD set for white" \
|
|
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3
|
|
|
|
test_update "Full update (--archive, whitelabel, no VPD - factory mode)" \
|
|
"${LINK_BIOS}" "${A}/image.bin" \
|
|
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3 --mode=factory
|
|
|
|
test_update "Full update (--archive, whitelabel, no VPD - quirk mode)" \
|
|
"${LINK_BIOS}" "${A}/image.bin" \
|
|
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3 --quirks=allow_empty_wltag
|
|
|
|
test_update "Full update (--archive, WL, single package)" \
|
|
"${A}/image.bin" "${LINK_BIOS}" \
|
|
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3 --signature_id=WL
|
|
|
|
WL_TAG="WL" PATH="${A}/bin:${PATH}" \
|
|
test_update "Full update (--archive, WL, fake vpd)" \
|
|
"${A}/image.bin" "${LINK_BIOS}" \
|
|
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3
|
|
|
|
echo "TEST: Output (-a, --mode=output)"
|
|
mkdir -p "${TMP}.outa"
|
|
cp -f "${A}/image.bin" "${TMP}.emu"
|
|
WL_TAG="WL" PATH="${A}/bin:${PATH}" \
|
|
${FUTILITY} update -a "${A}" --mode=output --emu="${TMP}.emu" \
|
|
--output_dir="${TMP}.outa"
|
|
cmp "${LINK_BIOS}" "${TMP}.outa/image.bin"
|
|
|
|
# Test archive with Unified Build contents.
|
|
cp -r "${SCRIPT_DIR}/futility/models" "${A}/"
|
|
mkdir -p "${A}/images"
|
|
mv "${A}/image.bin" "${A}/images/bios_coral.bin"
|
|
cp -f "${PEPPY_BIOS}" "${A}/images/bios_peppy.bin"
|
|
cp -f "${LINK_BIOS}" "${A}/images/bios_link.bin"
|
|
cp -f "${TMP}.to/rootkey" "${A}/keyset/rootkey.whitetip-wl"
|
|
cp -f "${TMP}.to/VBLOCK_A" "${A}/keyset/vblock_A.whitetip-wl"
|
|
cp -f "${TMP}.to/VBLOCK_B" "${A}/keyset/vblock_B.whitetip-wl"
|
|
cp -f "${PEPPY_BIOS}" "${FROM_IMAGE}.ap"
|
|
cp -f "${LINK_BIOS}" "${FROM_IMAGE}.al"
|
|
patch_file ${FROM_IMAGE}.ap FW_MAIN_A 0 "corrupted"
|
|
patch_file ${FROM_IMAGE}.al FW_MAIN_A 0 "corrupted"
|
|
test_update "Full update (--archive, model=link)" \
|
|
"${FROM_IMAGE}.al" "${LINK_BIOS}" \
|
|
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3 --model=link
|
|
test_update "Full update (--archive, model=peppy)" \
|
|
"${FROM_IMAGE}.ap" "${PEPPY_BIOS}" \
|
|
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3 --model=peppy
|
|
test_update "Full update (--archive, model=unknown)" \
|
|
"${FROM_IMAGE}.ap" "!Unsupported model: 'unknown'" \
|
|
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3 --model=unknown
|
|
test_update "Full update (--archive, model=whitetip, signature_id=WL)" \
|
|
"${FROM_IMAGE}.al" "${LINK_BIOS}" \
|
|
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3 --model=whitetip \
|
|
--signature_id=whitetip-wl
|
|
|
|
WL_TAG="wl" PATH="${A}/bin:${PATH}" \
|
|
test_update "Full update (-a, model=WL, fake VPD)" \
|
|
"${FROM_IMAGE}.al" "${LINK_BIOS}" \
|
|
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3 --model=whitetip
|
|
|
|
# WL-Unibuild without default keys
|
|
test_update "Full update (--a, model=WL, no VPD, no default keys)" \
|
|
"${FROM_IMAGE}.al" "!Need VPD set for white" \
|
|
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3 --model=whitetip
|
|
|
|
# WL-Unibuild with default keys as model name
|
|
cp -f "${TMP}.to/rootkey" "${A}/keyset/rootkey.whitetip"
|
|
cp -f "${TMP}.to/VBLOCK_A" "${A}/keyset/vblock_A.whitetip"
|
|
cp -f "${TMP}.to/VBLOCK_B" "${A}/keyset/vblock_B.whitetip"
|
|
test_update "Full update (-a, model=WL, no VPD, default keys)" \
|
|
"${FROM_IMAGE}.al" "${LINK_BIOS}" \
|
|
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3 --model=whitetip
|
|
|
|
# Test special programmer
|
|
if type flashrom >/dev/null 2>&1; then
|
|
echo "TEST: Full update (dummy programmer)"
|
|
cp -f "${FROM_IMAGE}" "${TMP}.emu"
|
|
sudo "${FUTILITY}" update --programmer \
|
|
dummy:emulate=VARIABLE_SIZE,image=${TMP}.emu,size=8388608 \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1,3 >&2
|
|
cmp "${TMP}.emu" "${TMP}.expected.full"
|
|
fi
|
|
|
|
if type cbfstool >/dev/null 2>&1; then
|
|
echo "SMM STORE" >"${TMP}.smm"
|
|
truncate -s 262144 "${TMP}.smm"
|
|
cp -f "${FROM_IMAGE}" "${TMP}.from.smm"
|
|
cp -f "${TMP}.expected.full" "${TMP}.expected.full_smm"
|
|
cbfstool "${TMP}.from.smm" add -r RW_LEGACY -n "smm_store" \
|
|
-f "${TMP}.smm" -t raw
|
|
cbfstool "${TMP}.expected.full_smm" add -r RW_LEGACY -n "smm_store" \
|
|
-f "${TMP}.smm" -t raw -b 0x1bf000
|
|
test_update "Legacy update (--quirks eve_smm_store)" \
|
|
"${TMP}.from.smm" "${TMP}.expected.full_smm" \
|
|
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1 \
|
|
--quirks eve_smm_store
|
|
|
|
echo "min_platform_version=3" >"${TMP}.quirk"
|
|
cp -f "${TO_IMAGE}" "${TO_IMAGE}.quirk"
|
|
${FUTILITY} dump_fmap -x "${TO_IMAGE}" "BOOT_STUB:${TMP}.cbfs"
|
|
# Create a fake CBFS using FW_MAIN_A size.
|
|
truncate -s $((0x000dffc0)) "${TMP}.cbfs"
|
|
${FUTILITY} load_fmap "${TO_IMAGE}.quirk" "FW_MAIN_A:${TMP}.cbfs"
|
|
cbfstool "${TO_IMAGE}.quirk" add -r FW_MAIN_A -n updater_quirks \
|
|
-f "${TMP}.quirk" -t raw
|
|
test_update "Full update (failure by CBFS quirks)" \
|
|
"${FROM_IMAGE}" "!Need platform version >= 3 (current is 2)" \
|
|
-i "${TO_IMAGE}.quirk" --wp=0 --sys_props 0,0x10001,1,2
|
|
fi
|