xref: /aosp_15_r20/external/vboot_reference/tests/futility/test_update.sh (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1*8617a60dSAndroid Build Coastguard Worker#!/bin/bash -eux
2*8617a60dSAndroid Build Coastguard Worker# Copyright 2018 The ChromiumOS Authors
3*8617a60dSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
4*8617a60dSAndroid Build Coastguard Worker# found in the LICENSE file.
5*8617a60dSAndroid Build Coastguard Worker
6*8617a60dSAndroid Build Coastguard Workerme=${0##*/}
7*8617a60dSAndroid Build Coastguard WorkerTMP="$me.tmp"
8*8617a60dSAndroid Build Coastguard Worker
9*8617a60dSAndroid Build Coastguard Worker# Test --sys_props (primitive test needed for future updating tests).
10*8617a60dSAndroid Build Coastguard Workertest_sys_props() {
11*8617a60dSAndroid Build Coastguard Worker  ! "${FUTILITY}" --debug update --sys_props "$*" 2>&1 |
12*8617a60dSAndroid Build Coastguard Worker    sed -n 's/.*property\[\(.*\)].value = \(.*\)/\1,\2,/p' |
13*8617a60dSAndroid Build Coastguard Worker    tr '\n' ' '
14*8617a60dSAndroid Build Coastguard Worker}
15*8617a60dSAndroid Build Coastguard Worker
16*8617a60dSAndroid Build Coastguard Workertest "$(test_sys_props "1,2,3")" = "0,1, 1,2, 2,3, "
17*8617a60dSAndroid Build Coastguard Workertest "$(test_sys_props "1 2 3")" = "0,1, 1,2, 2,3, "
18*8617a60dSAndroid Build Coastguard Workertest "$(test_sys_props "1, 2,3 ")" = "0,1, 1,2, 2,3, "
19*8617a60dSAndroid Build Coastguard Workertest "$(test_sys_props "   1,, 2")" = "0,1, 2,2, "
20*8617a60dSAndroid Build Coastguard Workertest "$(test_sys_props " , 4,")" = "1,4, "
21*8617a60dSAndroid Build Coastguard Worker
22*8617a60dSAndroid Build Coastguard Workertest_quirks() {
23*8617a60dSAndroid Build Coastguard Worker  ! "${FUTILITY}" --debug update --quirks "$*" 2>&1 |
24*8617a60dSAndroid Build Coastguard Worker    sed -n 's/.*Set quirk \(.*\) to \(.*\)./\1,\2/p' |
25*8617a60dSAndroid Build Coastguard Worker    tr '\n' ' '
26*8617a60dSAndroid Build Coastguard Worker}
27*8617a60dSAndroid Build Coastguard Worker
28*8617a60dSAndroid Build Coastguard Workertest "$(test_quirks "enlarge_image")" = "enlarge_image,1 "
29*8617a60dSAndroid Build Coastguard Workertest "$(test_quirks "enlarge_image=2")" = "enlarge_image,2 "
30*8617a60dSAndroid Build Coastguard Workertest "$(test_quirks " enlarge_image, enlarge_image=2")" = \
31*8617a60dSAndroid Build Coastguard Worker  "enlarge_image,1 enlarge_image,2 "
32*8617a60dSAndroid Build Coastguard Worker
33*8617a60dSAndroid Build Coastguard Worker# Test data files
34*8617a60dSAndroid Build Coastguard WorkerDATA_DIR="${SCRIPT_DIR}/futility/data"
35*8617a60dSAndroid Build Coastguard WorkerGERALT_BIOS="${DATA_DIR}/bios_geralt_cbfs.bin"
36*8617a60dSAndroid Build Coastguard WorkerLINK_BIOS="${DATA_DIR}/bios_link_mp.bin"
37*8617a60dSAndroid Build Coastguard WorkerPEPPY_BIOS="${DATA_DIR}/bios_peppy_mp.bin"
38*8617a60dSAndroid Build Coastguard WorkerVOXEL_BIOS="${DATA_DIR}/bios_voxel_dev.bin"
39*8617a60dSAndroid Build Coastguard WorkerRO_VPD_BLOB="${DATA_DIR}/ro_vpd.bin"
40*8617a60dSAndroid Build Coastguard WorkerSIGNER_CONFIG="${DATA_DIR}/signer_config.csv"
41*8617a60dSAndroid Build Coastguard Worker
42*8617a60dSAndroid Build Coastguard Worker# Work in scratch directory
43*8617a60dSAndroid Build Coastguard Workercd "${OUTDIR}"
44*8617a60dSAndroid Build Coastguard Workerset -o pipefail
45*8617a60dSAndroid Build Coastguard Worker
46*8617a60dSAndroid Build Coastguard Worker# Re-create the temp folders
47*8617a60dSAndroid Build Coastguard WorkerTMP_FROM="${TMP}/from"
48*8617a60dSAndroid Build Coastguard WorkerTMP_TO="${TMP}/to"
49*8617a60dSAndroid Build Coastguard WorkerEXPECTED="${TMP}/expected"
50*8617a60dSAndroid Build Coastguard Workerrm -rf "${TMP}"
51*8617a60dSAndroid Build Coastguard Workermkdir -p "${TMP_FROM}" "${TMP_TO}" "${EXPECTED}"
52*8617a60dSAndroid Build Coastguard Worker
53*8617a60dSAndroid Build Coastguard Worker# In all the test scenario, we want to test "updating from PEPPY to LINK".
54*8617a60dSAndroid Build Coastguard WorkerTO_IMAGE="${TMP}/src.link"
55*8617a60dSAndroid Build Coastguard WorkerFROM_IMAGE="${TMP}/src.peppy"
56*8617a60dSAndroid Build Coastguard WorkerTO_HWID="X86 LINK TEST 6638"
57*8617a60dSAndroid Build Coastguard WorkerFROM_HWID="X86 PEPPY TEST 4211"
58*8617a60dSAndroid Build Coastguard Workercp -f "${LINK_BIOS}" "${TO_IMAGE}"
59*8617a60dSAndroid Build Coastguard Workercp -f "${PEPPY_BIOS}" "${FROM_IMAGE}"
60*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" load_fmap "${FROM_IMAGE}" \
61*8617a60dSAndroid Build Coastguard Worker  RO_VPD:"${RO_VPD_BLOB}" RW_VPD:"${RO_VPD_BLOB}"
62*8617a60dSAndroid Build Coastguard Workercp -f "${FROM_IMAGE}" "${FROM_IMAGE}".unpatched
63*8617a60dSAndroid Build Coastguard Worker
64*8617a60dSAndroid Build Coastguard Workerpatch_file() {
65*8617a60dSAndroid Build Coastguard Worker  local file="$1"
66*8617a60dSAndroid Build Coastguard Worker  local section="$2"
67*8617a60dSAndroid Build Coastguard Worker  local section_offset="$3"
68*8617a60dSAndroid Build Coastguard Worker  local data="$4"
69*8617a60dSAndroid Build Coastguard Worker
70*8617a60dSAndroid Build Coastguard Worker  # NAME OFFSET SIZE
71*8617a60dSAndroid Build Coastguard Worker  local fmap_info
72*8617a60dSAndroid Build Coastguard Worker  local base
73*8617a60dSAndroid Build Coastguard Worker  local offset
74*8617a60dSAndroid Build Coastguard Worker
75*8617a60dSAndroid Build Coastguard Worker  fmap_info="$("${FUTILITY}" dump_fmap -p "${file}" "${section}")"
76*8617a60dSAndroid Build Coastguard Worker  base="$(echo "${fmap_info}" | sed 's/^[^ ]* //; s/ [^ ]*$//')"
77*8617a60dSAndroid Build Coastguard Worker  offset=$((base + section_offset))
78*8617a60dSAndroid Build Coastguard Worker  echo "offset: ${offset}"
79*8617a60dSAndroid Build Coastguard Worker  printf "%b" "${data}" | dd of="${file}" bs=1 seek="${offset}" \
80*8617a60dSAndroid Build Coastguard Worker    conv=notrunc
81*8617a60dSAndroid Build Coastguard Worker}
82*8617a60dSAndroid Build Coastguard Worker
83*8617a60dSAndroid Build Coastguard Worker# PEPPY and LINK have different platform element ("Google_Link" and
84*8617a60dSAndroid Build Coastguard Worker# "Google_Peppy") in firmware ID so we want to hack them by changing
85*8617a60dSAndroid Build Coastguard Worker# "Google_" to "Google.".
86*8617a60dSAndroid Build Coastguard Workerpatch_file "${TO_IMAGE}" RW_FWID_A 0 Google.
87*8617a60dSAndroid Build Coastguard Workerpatch_file "${TO_IMAGE}" RW_FWID_B 0 Google.
88*8617a60dSAndroid Build Coastguard Workerpatch_file "${TO_IMAGE}" RO_FRID 0 Google.
89*8617a60dSAndroid Build Coastguard Workerpatch_file "${FROM_IMAGE}" RW_FWID_A 0 Google.
90*8617a60dSAndroid Build Coastguard Workerpatch_file "${FROM_IMAGE}" RW_FWID_B 0 Google.
91*8617a60dSAndroid Build Coastguard Workerpatch_file "${FROM_IMAGE}" RO_FRID 0 Google.
92*8617a60dSAndroid Build Coastguard Worker
93*8617a60dSAndroid Build Coastguard Workerunpack_image() {
94*8617a60dSAndroid Build Coastguard Worker  local folder="${TMP}/$1"
95*8617a60dSAndroid Build Coastguard Worker  local image="$2"
96*8617a60dSAndroid Build Coastguard Worker  mkdir -p "${folder}"
97*8617a60dSAndroid Build Coastguard Worker  (cd "${folder}" && "${FUTILITY}" dump_fmap -x "../../${image}")
98*8617a60dSAndroid Build Coastguard Worker  "${FUTILITY}" gbb -g --rootkey="${folder}/rootkey" "${image}"
99*8617a60dSAndroid Build Coastguard Worker}
100*8617a60dSAndroid Build Coastguard Worker
101*8617a60dSAndroid Build Coastguard Worker# Unpack images so we can prepare expected results by individual sections.
102*8617a60dSAndroid Build Coastguard Workerunpack_image "to" "${TO_IMAGE}"
103*8617a60dSAndroid Build Coastguard Workerunpack_image "from" "${FROM_IMAGE}"
104*8617a60dSAndroid Build Coastguard Worker
105*8617a60dSAndroid Build Coastguard Worker# Hack FROM_IMAGE so it has same root key as TO_IMAGE (for RW update).
106*8617a60dSAndroid Build Coastguard WorkerFROM_DIFFERENT_ROOTKEY_IMAGE="${FROM_IMAGE}2"
107*8617a60dSAndroid Build Coastguard Workercp -f "${FROM_IMAGE}" "${FROM_DIFFERENT_ROOTKEY_IMAGE}"
108*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" gbb -s --rootkey="${TMP_TO}/rootkey" "${FROM_IMAGE}"
109*8617a60dSAndroid Build Coastguard Worker
110*8617a60dSAndroid Build Coastguard Worker# Hack for quirks
111*8617a60dSAndroid Build Coastguard Workercp -f "${FROM_IMAGE}" "${FROM_IMAGE}.large"
112*8617a60dSAndroid Build Coastguard Workertruncate -s $((8388608 * 2)) "${FROM_IMAGE}.large"
113*8617a60dSAndroid Build Coastguard Worker
114*8617a60dSAndroid Build Coastguard Worker# Create the FROM_SAME_RO_IMAGE using the RO from TO_IMAGE."
115*8617a60dSAndroid Build Coastguard WorkerFROM_SAME_RO_IMAGE="${FROM_IMAGE}.same_ro"
116*8617a60dSAndroid Build Coastguard Workercp -f "${FROM_IMAGE}" "${FROM_SAME_RO_IMAGE}"
117*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" load_fmap "${FROM_SAME_RO_IMAGE}" \
118*8617a60dSAndroid Build Coastguard Worker  "RO_SECTION:${TMP_TO}/RO_SECTION"
119*8617a60dSAndroid Build Coastguard Worker
120*8617a60dSAndroid Build Coastguard Worker# Create GBB v1.2 images (for checking digest)
121*8617a60dSAndroid Build Coastguard WorkerGBB_OUTPUT="$("${FUTILITY}" gbb --digest "${TO_IMAGE}")"
122*8617a60dSAndroid Build Coastguard Worker[ "${GBB_OUTPUT}" = "digest: <none>" ]
123*8617a60dSAndroid Build Coastguard WorkerTO_IMAGE_GBB12="${TO_IMAGE}.gbb12"
124*8617a60dSAndroid Build Coastguard WorkerHWID_DIGEST="adf64d2a434b610506153da42440b0b498d7369c0e98b629ede65eb59f4784fa"
125*8617a60dSAndroid Build Coastguard Workercp -f "${TO_IMAGE}" "${TO_IMAGE_GBB12}"
126*8617a60dSAndroid Build Coastguard Workerpatch_file "${TO_IMAGE_GBB12}" GBB 6 "\x02"
127*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" gbb -s --hwid="${TO_HWID}" "${TO_IMAGE_GBB12}"
128*8617a60dSAndroid Build Coastguard WorkerGBB_OUTPUT="$("${FUTILITY}" gbb --digest "${TO_IMAGE_GBB12}")"
129*8617a60dSAndroid Build Coastguard Worker[ "${GBB_OUTPUT}" = "digest: ${HWID_DIGEST}   valid" ]
130*8617a60dSAndroid Build Coastguard Worker
131*8617a60dSAndroid Build Coastguard Worker# Create images with (empty) AP RO verification
132*8617a60dSAndroid Build Coastguard Worker# (Patch FMAP to rename 'RO_UNUSED' to 'RO_GSCVD')
133*8617a60dSAndroid Build Coastguard Workercp -f "${FROM_IMAGE}" "${FROM_IMAGE}.locked"
134*8617a60dSAndroid Build Coastguard Workerpatch_file "${FROM_IMAGE}.locked" FMAP 0x0430 "RO_GSCVD\x00"
135*8617a60dSAndroid Build Coastguard Workercp -f "${FROM_IMAGE}.locked" "${FROM_IMAGE}.locked_same_desc"
136*8617a60dSAndroid Build Coastguard Workercp -f "${FROM_IMAGE}.locked" "${FROM_IMAGE}.unlocked"
137*8617a60dSAndroid Build Coastguard Workerpatch_file "${FROM_IMAGE}.unlocked" SI_DESC 0x60 \
138*8617a60dSAndroid Build Coastguard Worker  "\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff"
139*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" load_fmap "${FROM_IMAGE}.locked_same_desc" \
140*8617a60dSAndroid Build Coastguard Worker  "SI_DESC:${TMP_TO}/SI_DESC"
141*8617a60dSAndroid Build Coastguard Worker
142*8617a60dSAndroid Build Coastguard Worker# Generate expected results.
143*8617a60dSAndroid Build Coastguard Workercp -f "${TO_IMAGE}" "${EXPECTED}/full"
144*8617a60dSAndroid Build Coastguard Workercp -f "${FROM_IMAGE}" "${EXPECTED}/rw"
145*8617a60dSAndroid Build Coastguard Workercp -f "${FROM_IMAGE}" "${EXPECTED}/a"
146*8617a60dSAndroid Build Coastguard Workercp -f "${FROM_IMAGE}" "${EXPECTED}/b"
147*8617a60dSAndroid Build Coastguard Workercp -f "${FROM_SAME_RO_IMAGE}" "${EXPECTED}/FROM_SAME_RO_IMAGE.b"
148*8617a60dSAndroid Build Coastguard Workercp -f "${FROM_IMAGE}" "${EXPECTED}/legacy"
149*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" gbb -s --hwid="${FROM_HWID}" "${EXPECTED}/full"
150*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" load_fmap "${EXPECTED}/full" \
151*8617a60dSAndroid Build Coastguard Worker  "RW_VPD:${TMP_FROM}/RW_VPD" \
152*8617a60dSAndroid Build Coastguard Worker  "RO_VPD:${TMP_FROM}/RO_VPD"
153*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" load_fmap "${EXPECTED}/rw" \
154*8617a60dSAndroid Build Coastguard Worker  "RW_SECTION_A:${TMP_TO}/RW_SECTION_A" \
155*8617a60dSAndroid Build Coastguard Worker  "RW_SECTION_B:${TMP_TO}/RW_SECTION_B" \
156*8617a60dSAndroid Build Coastguard Worker  "RW_SHARED:${TMP_TO}/RW_SHARED" \
157*8617a60dSAndroid Build Coastguard Worker  "RW_LEGACY:${TMP_TO}/RW_LEGACY"
158*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" load_fmap "${EXPECTED}/a" \
159*8617a60dSAndroid Build Coastguard Worker  "RW_SECTION_A:${TMP_TO}/RW_SECTION_A"
160*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" load_fmap "${EXPECTED}/b" \
161*8617a60dSAndroid Build Coastguard Worker  "RW_SECTION_B:${TMP_TO}/RW_SECTION_B"
162*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" load_fmap "${EXPECTED}/FROM_SAME_RO_IMAGE.b" \
163*8617a60dSAndroid Build Coastguard Worker  "RW_SECTION_B:${TMP_TO}/RW_SECTION_B"
164*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" load_fmap "${EXPECTED}/legacy" \
165*8617a60dSAndroid Build Coastguard Worker  "RW_LEGACY:${TMP_TO}/RW_LEGACY"
166*8617a60dSAndroid Build Coastguard Workercp -f "${EXPECTED}/full" "${EXPECTED}/full.gbb12"
167*8617a60dSAndroid Build Coastguard Workerpatch_file "${EXPECTED}/full.gbb12" GBB 6 "\x02"
168*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" gbb -s --hwid="${FROM_HWID}" "${EXPECTED}/full.gbb12"
169*8617a60dSAndroid Build Coastguard Workercp -f "${EXPECTED}/full" "${EXPECTED}/full.gbb0"
170*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" gbb -s --flags=0 "${EXPECTED}/full.gbb0"
171*8617a60dSAndroid Build Coastguard Workercp -f "${FROM_IMAGE}" "${FROM_IMAGE}.gbb0"
172*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" gbb -s --flags=0 "${FROM_IMAGE}.gbb0"
173*8617a60dSAndroid Build Coastguard Workercp -f "${EXPECTED}/full" "${EXPECTED}/full.gbb0x27"
174*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" gbb -s --flags=0x27 "${EXPECTED}/full.gbb0x27"
175*8617a60dSAndroid Build Coastguard Workercp -f "${EXPECTED}/full" "${EXPECTED}/large"
176*8617a60dSAndroid Build Coastguard Workerdd if=/dev/zero bs=8388608 count=1 | tr '\000' '\377' >>"${EXPECTED}/large"
177*8617a60dSAndroid Build Coastguard Workercp -f "${EXPECTED}/full" "${EXPECTED}/me_unlocked_eve"
178*8617a60dSAndroid Build Coastguard Workerpatch_file "${EXPECTED}/me_unlocked_eve" SI_DESC 0x60 \
179*8617a60dSAndroid Build Coastguard Worker  "\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff"
180*8617a60dSAndroid Build Coastguard Workercp -f "${EXPECTED}/full" "${EXPECTED}/me_preserved"
181*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" load_fmap "${EXPECTED}/me_preserved" \
182*8617a60dSAndroid Build Coastguard Worker  "SI_ME:${TMP_FROM}/SI_ME"
183*8617a60dSAndroid Build Coastguard Workercp -f "${EXPECTED}/rw" "${EXPECTED}/rw.locked"
184*8617a60dSAndroid Build Coastguard Workerpatch_file "${EXPECTED}/rw.locked" FMAP 0x0430 "RO_GSCVD\x00"
185*8617a60dSAndroid Build Coastguard Worker
186*8617a60dSAndroid Build Coastguard Worker# A special set of images that only RO_VPD is preserved (RW_VPD is wiped) using
187*8617a60dSAndroid Build Coastguard Worker# FMAP_AREA_PRESERVE (\010=0x08).
188*8617a60dSAndroid Build Coastguard WorkerTO_IMAGE_WIPE_RW_VPD="${TO_IMAGE}.wipe_rw_vpd"
189*8617a60dSAndroid Build Coastguard Workercp -f "${TO_IMAGE}" "${TO_IMAGE_WIPE_RW_VPD}"
190*8617a60dSAndroid Build Coastguard Workerpatch_file "${TO_IMAGE_WIPE_RW_VPD}" FMAP 0x3fc "$(printf '\010')"
191*8617a60dSAndroid Build Coastguard Workercp -f "${EXPECTED}/full" "${EXPECTED}/full.empty_rw_vpd"
192*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" load_fmap "${EXPECTED}/full.empty_rw_vpd" \
193*8617a60dSAndroid Build Coastguard Worker  RW_VPD:"${TMP_TO}/RW_VPD"
194*8617a60dSAndroid Build Coastguard Workerpatch_file "${EXPECTED}/full.empty_rw_vpd" FMAP 0x3fc "$(printf '\010')"
195*8617a60dSAndroid Build Coastguard Worker
196*8617a60dSAndroid Build Coastguard Worker# Generate images for testing --unlock_me.
197*8617a60dSAndroid Build Coastguard Worker# There are two ways to detect the platform:
198*8617a60dSAndroid Build Coastguard Worker#  - Read CONFIG_IFD_CHIPSET from config file in CBFS
199*8617a60dSAndroid Build Coastguard Worker#  - Fallback for nissa: check if CONFIG_IFD_BIN_PATH contains 'nissa'
200*8617a60dSAndroid Build Coastguard Worker
201*8617a60dSAndroid Build Coastguard Worker# Rename BOOT_STUB to COREBOOT, which is the default region used by cbfstool.
202*8617a60dSAndroid Build Coastguard Workerrename_boot_stub() {
203*8617a60dSAndroid Build Coastguard Worker  local image="$1"
204*8617a60dSAndroid Build Coastguard Worker  local fmap_file="${TMP}/fmap"
205*8617a60dSAndroid Build Coastguard Worker
206*8617a60dSAndroid Build Coastguard Worker  "${FUTILITY}" dump_fmap "${image}" -x "FMAP:${fmap_file}"
207*8617a60dSAndroid Build Coastguard Worker  sed -i 's/BOOT_STUB/COREBOOT\x00/g' "${fmap_file}"
208*8617a60dSAndroid Build Coastguard Worker  "${FUTILITY}" load_fmap "${image}" "FMAP:${fmap_file}"
209*8617a60dSAndroid Build Coastguard Worker}
210*8617a60dSAndroid Build Coastguard Worker
211*8617a60dSAndroid Build Coastguard Worker# Add the given line to the config file in CBFS.
212*8617a60dSAndroid Build Coastguard Workeradd_config() {
213*8617a60dSAndroid Build Coastguard Worker  local image="$1"
214*8617a60dSAndroid Build Coastguard Worker  local config_line="$2"
215*8617a60dSAndroid Build Coastguard Worker  local config_file="${TMP}/config"
216*8617a60dSAndroid Build Coastguard Worker
217*8617a60dSAndroid Build Coastguard Worker  rename_boot_stub "${image}"
218*8617a60dSAndroid Build Coastguard Worker
219*8617a60dSAndroid Build Coastguard Worker  cbfstool "${image}" extract -n config -f "${config_file}"
220*8617a60dSAndroid Build Coastguard Worker  echo "${config_line}" >>"${config_file}"
221*8617a60dSAndroid Build Coastguard Worker  cbfstool "${image}" remove -n config
222*8617a60dSAndroid Build Coastguard Worker  cbfstool "${image}" add -n config -f "${config_file}" -t raw
223*8617a60dSAndroid Build Coastguard Worker}
224*8617a60dSAndroid Build Coastguard Worker
225*8617a60dSAndroid Build Coastguard Workerunlock_me() {
226*8617a60dSAndroid Build Coastguard Worker  local image="$1"
227*8617a60dSAndroid Build Coastguard Worker
228*8617a60dSAndroid Build Coastguard Worker  patch_file "${image}" SI_DESC 0x60 \
229*8617a60dSAndroid Build Coastguard Worker    "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
230*8617a60dSAndroid Build Coastguard Worker  patch_file "${image}" SI_DESC 0x154 \
231*8617a60dSAndroid Build Coastguard Worker    "\x00\x00\x00\x00"
232*8617a60dSAndroid Build Coastguard Worker}
233*8617a60dSAndroid Build Coastguard Worker
234*8617a60dSAndroid Build Coastguard WorkerIFD_CHIPSET='CONFIG_IFD_CHIPSET="adl"'
235*8617a60dSAndroid Build Coastguard WorkerIFD_PATH='CONFIG_IFD_BIN_PATH="3rdparty/blobs/mainboard/google/nissa/descriptor-craask.bin"'
236*8617a60dSAndroid Build Coastguard Workercp -f "${TO_IMAGE}" "${TO_IMAGE}.ifd_chipset"
237*8617a60dSAndroid Build Coastguard Workercp -f "${TO_IMAGE}" "${TO_IMAGE}.ifd_path"
238*8617a60dSAndroid Build Coastguard Workercp -f "${EXPECTED}/full" "${EXPECTED}/ifd_chipset"
239*8617a60dSAndroid Build Coastguard Workercp -f "${EXPECTED}/full" "${EXPECTED}/ifd_path"
240*8617a60dSAndroid Build Coastguard Workeradd_config "${TO_IMAGE}.ifd_chipset" "${IFD_CHIPSET}"
241*8617a60dSAndroid Build Coastguard Workeradd_config "${TO_IMAGE}.ifd_path" "${IFD_PATH}"
242*8617a60dSAndroid Build Coastguard Workeradd_config "${EXPECTED}/ifd_chipset" "${IFD_CHIPSET}"
243*8617a60dSAndroid Build Coastguard Workeradd_config "${EXPECTED}/ifd_path" "${IFD_PATH}"
244*8617a60dSAndroid Build Coastguard Worker
245*8617a60dSAndroid Build Coastguard Workercp -f "${EXPECTED}/ifd_chipset" "${EXPECTED}/me_unlocked.ifd_chipset"
246*8617a60dSAndroid Build Coastguard Workercp -f "${EXPECTED}/ifd_path" "${EXPECTED}/me_unlocked.ifd_path"
247*8617a60dSAndroid Build Coastguard Workerunlock_me "${EXPECTED}/me_unlocked.ifd_chipset"
248*8617a60dSAndroid Build Coastguard Workerunlock_me "${EXPECTED}/me_unlocked.ifd_path"
249*8617a60dSAndroid Build Coastguard Worker
250*8617a60dSAndroid Build Coastguard Worker# Has 3 modes:
251*8617a60dSAndroid Build Coastguard Worker# 1. $3 = "!something", run command, expect failure,
252*8617a60dSAndroid Build Coastguard Worker#    grep for something in log, fail if it is not present
253*8617a60dSAndroid Build Coastguard Worker# 2. $3 = "something", run command, expect success,
254*8617a60dSAndroid Build Coastguard Worker#    cmp output to file named $3, fail if they are not the same
255*8617a60dSAndroid Build Coastguard Worker# 3. $3 = "!", run command, expect success, fail to find a file named !
256*8617a60dSAndroid Build Coastguard Workertest_update() {
257*8617a60dSAndroid Build Coastguard Worker  local test_name="$1"
258*8617a60dSAndroid Build Coastguard Worker  local emu_src="$2"
259*8617a60dSAndroid Build Coastguard Worker  local expected="$3"
260*8617a60dSAndroid Build Coastguard Worker  local error_msg="${expected#!}"
261*8617a60dSAndroid Build Coastguard Worker  local emu="${TMP}/emu"
262*8617a60dSAndroid Build Coastguard Worker  local msg
263*8617a60dSAndroid Build Coastguard Worker
264*8617a60dSAndroid Build Coastguard Worker  shift 3
265*8617a60dSAndroid Build Coastguard Worker  cp -f "${emu_src}" "${emu}"
266*8617a60dSAndroid Build Coastguard Worker  echo "*** Test Item: ${test_name}"
267*8617a60dSAndroid Build Coastguard Worker  if [ "${error_msg}" != "${expected}" ] && [ -n "${error_msg}" ]; then
268*8617a60dSAndroid Build Coastguard Worker    msg="$(! "${FUTILITY}" update --emulate "${emu}" "$@" 2>&1)"
269*8617a60dSAndroid Build Coastguard Worker    grep -qF -- "${error_msg}" <<<"${msg}"
270*8617a60dSAndroid Build Coastguard Worker  else
271*8617a60dSAndroid Build Coastguard Worker    "${FUTILITY}" update --emulate "${emu}" "$@"
272*8617a60dSAndroid Build Coastguard Worker    cmp "${emu}" "${expected}"
273*8617a60dSAndroid Build Coastguard Worker  fi
274*8617a60dSAndroid Build Coastguard Worker}
275*8617a60dSAndroid Build Coastguard Worker
276*8617a60dSAndroid Build Coastguard Worker# --sys_props: mainfw_act, tpm_fwver, platform_ver, [wp_hw, wp_sw]
277*8617a60dSAndroid Build Coastguard Worker# tpm_fwver = <data key version:16><firmware version:16>.
278*8617a60dSAndroid Build Coastguard Worker# TO_IMAGE is signed with data key version = 1, firmware version = 4 => 0x10004.
279*8617a60dSAndroid Build Coastguard Worker
280*8617a60dSAndroid Build Coastguard Worker# Test Full update.
281*8617a60dSAndroid Build Coastguard Workertest_update "Full update" \
282*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full" \
283*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0
284*8617a60dSAndroid Build Coastguard Worker
285*8617a60dSAndroid Build Coastguard Workertest_update "Full update (incompatible platform)" \
286*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "!platform is not compatible" \
287*8617a60dSAndroid Build Coastguard Worker  -i "${LINK_BIOS}" --wp=0
288*8617a60dSAndroid Build Coastguard Worker
289*8617a60dSAndroid Build Coastguard Workertest_update "Full update (TPM Anti-rollback: data key)" \
290*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "!Data key version rollback detected (2->1)" \
291*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0 --sys_props 1,0x20001
292*8617a60dSAndroid Build Coastguard Worker
293*8617a60dSAndroid Build Coastguard Workertest_update "Full update (TPM Anti-rollback: kernel key)" \
294*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "!Firmware version rollback detected (5->4)" \
295*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0 --sys_props 1,0x10005
296*8617a60dSAndroid Build Coastguard Worker
297*8617a60dSAndroid Build Coastguard Workertest_update "Full update (TPM Anti-rollback: 0 as tpm_fwver)" \
298*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full" \
299*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0 --sys_props ,0x0
300*8617a60dSAndroid Build Coastguard Worker
301*8617a60dSAndroid Build Coastguard Workertest_update "Full update (TPM check failure due to invalid tpm_fwver)" \
302*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "!Invalid tpm_fwver: -1" \
303*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0 --sys_props ,-1
304*8617a60dSAndroid Build Coastguard Worker
305*8617a60dSAndroid Build Coastguard Workertest_update "Full update (Skip TPM check with --force)" \
306*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full" \
307*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0 --sys_props ,-1 --force
308*8617a60dSAndroid Build Coastguard Worker
309*8617a60dSAndroid Build Coastguard Workertest_update "Full update (from stdin)" \
310*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full" \
311*8617a60dSAndroid Build Coastguard Worker  -i - --wp=0 --sys_props ,-1 --force <"${TO_IMAGE}"
312*8617a60dSAndroid Build Coastguard Worker
313*8617a60dSAndroid Build Coastguard Workertest_update "Full update (GBB=0 -> 0)" \
314*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.gbb0" "${EXPECTED}/full.gbb0" \
315*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0
316*8617a60dSAndroid Build Coastguard Worker
317*8617a60dSAndroid Build Coastguard Workertest_update "Full update (GBB flags -> 0x27)" \
318*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full.gbb0x27" \
319*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --gbb_flags=0x27 --wp=0
320*8617a60dSAndroid Build Coastguard Worker
321*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--host_only)" \
322*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full" \
323*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0 --host_only --ec_image non-exist.bin
324*8617a60dSAndroid Build Coastguard Worker
325*8617a60dSAndroid Build Coastguard Workertest_update "Full update (GBB1.2 hwid digest)" \
326*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full.gbb12" \
327*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE_GBB12}" --wp=0
328*8617a60dSAndroid Build Coastguard Worker
329*8617a60dSAndroid Build Coastguard Workertest_update "Full update (Preserve VPD using FMAP_AREA_PRESERVE)" \
330*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full.empty_rw_vpd" \
331*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE_WIPE_RW_VPD}" --wp=0
332*8617a60dSAndroid Build Coastguard Worker
333*8617a60dSAndroid Build Coastguard Worker
334*8617a60dSAndroid Build Coastguard Worker# Test RW-only update.
335*8617a60dSAndroid Build Coastguard Workertest_update "RW update" \
336*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/rw" \
337*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=1
338*8617a60dSAndroid Build Coastguard Worker
339*8617a60dSAndroid Build Coastguard Workertest_update "RW update (incompatible platform)" \
340*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "!platform is not compatible" \
341*8617a60dSAndroid Build Coastguard Worker  -i "${LINK_BIOS}" --wp=1
342*8617a60dSAndroid Build Coastguard Worker
343*8617a60dSAndroid Build Coastguard Workertest_update "RW update (incompatible rootkey)" \
344*8617a60dSAndroid Build Coastguard Worker  "${FROM_DIFFERENT_ROOTKEY_IMAGE}" "!RW signed by incompatible root key" \
345*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=1
346*8617a60dSAndroid Build Coastguard Worker
347*8617a60dSAndroid Build Coastguard Workertest_update "RW update (TPM Anti-rollback: data key)" \
348*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "!Data key version rollback detected (2->1)" \
349*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=1 --sys_props 1,0x20001
350*8617a60dSAndroid Build Coastguard Worker
351*8617a60dSAndroid Build Coastguard Workertest_update "RW update (TPM Anti-rollback: kernel key)" \
352*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "!Firmware version rollback detected (5->4)" \
353*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=1 --sys_props 1,0x10005
354*8617a60dSAndroid Build Coastguard Worker
355*8617a60dSAndroid Build Coastguard Worker# Test Try-RW update (vboot2).
356*8617a60dSAndroid Build Coastguard Workertest_update "RW update (A->B)" \
357*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/b" \
358*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" -t --wp=1 --sys_props 0
359*8617a60dSAndroid Build Coastguard Worker
360*8617a60dSAndroid Build Coastguard Workertest_update "RW update (B->A)" \
361*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/a" \
362*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" -t --wp=1 --sys_props 1
363*8617a60dSAndroid Build Coastguard Worker
364*8617a60dSAndroid Build Coastguard Workertest_update "RW update, same RO, wp=0 (A->B)" \
365*8617a60dSAndroid Build Coastguard Worker  "${FROM_SAME_RO_IMAGE}" "${EXPECTED}/FROM_SAME_RO_IMAGE.b" \
366*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" -t --wp=0 --sys_props 0
367*8617a60dSAndroid Build Coastguard Worker
368*8617a60dSAndroid Build Coastguard Workertest_update "RW update, same RO, wp=1 (A->B)" \
369*8617a60dSAndroid Build Coastguard Worker  "${FROM_SAME_RO_IMAGE}" "${EXPECTED}/FROM_SAME_RO_IMAGE.b" \
370*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" -t --wp=1 --sys_props 0
371*8617a60dSAndroid Build Coastguard Worker
372*8617a60dSAndroid Build Coastguard Workertest_update "RW update -> fallback to RO+RW Full update" \
373*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full" \
374*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" -t --wp=0 --sys_props 1,0x10002
375*8617a60dSAndroid Build Coastguard Workertest_update "RW update (incompatible platform)" \
376*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "!platform is not compatible" \
377*8617a60dSAndroid Build Coastguard Worker  -i "${LINK_BIOS}" -t --wp=1
378*8617a60dSAndroid Build Coastguard Worker
379*8617a60dSAndroid Build Coastguard Workertest_update "RW update (incompatible rootkey)" \
380*8617a60dSAndroid Build Coastguard Worker  "${FROM_DIFFERENT_ROOTKEY_IMAGE}" "!RW signed by incompatible root key" \
381*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" -t --wp=1
382*8617a60dSAndroid Build Coastguard Worker
383*8617a60dSAndroid Build Coastguard Workertest_update "RW update (TPM Anti-rollback: data key)" \
384*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "!Data key version rollback detected (2->1)" \
385*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" -t --wp=1 --sys_props 1,0x20001
386*8617a60dSAndroid Build Coastguard Worker
387*8617a60dSAndroid Build Coastguard Workertest_update "RW update (TPM Anti-rollback: kernel key)" \
388*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "!Firmware version rollback detected (5->4)" \
389*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" -t --wp=1 --sys_props 1,0x10005
390*8617a60dSAndroid Build Coastguard Worker
391*8617a60dSAndroid Build Coastguard Workertest_update "RW update -> fallback to RO+RW Full update (TPM Anti-rollback)" \
392*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "!Firmware version rollback detected (6->4)" \
393*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" -t --wp=0 --sys_props 1,0x10006
394*8617a60dSAndroid Build Coastguard Worker
395*8617a60dSAndroid Build Coastguard Worker# Test 'factory mode'
396*8617a60dSAndroid Build Coastguard Workertest_update "Factory mode update (WP=0)" \
397*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full" \
398*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0 --mode=factory
399*8617a60dSAndroid Build Coastguard Worker
400*8617a60dSAndroid Build Coastguard Workertest_update "Factory mode update (WP=0)" \
401*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full" \
402*8617a60dSAndroid Build Coastguard Worker  --factory -i "${TO_IMAGE}" --wp=0
403*8617a60dSAndroid Build Coastguard Worker
404*8617a60dSAndroid Build Coastguard Workertest_update "Factory mode update (WP=1)" \
405*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "!remove write protection for factory mode" \
406*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=1 --mode=factory
407*8617a60dSAndroid Build Coastguard Worker
408*8617a60dSAndroid Build Coastguard Workertest_update "Factory mode update (WP=1)" \
409*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "!remove write protection for factory mode" \
410*8617a60dSAndroid Build Coastguard Worker  --factory -i "${TO_IMAGE}" --wp=1
411*8617a60dSAndroid Build Coastguard Worker
412*8617a60dSAndroid Build Coastguard Workertest_update "Factory mode update (GBB=0 -> 0x39)" \
413*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.gbb0" "${EXPECTED}/full" \
414*8617a60dSAndroid Build Coastguard Worker  --factory -i "${TO_IMAGE}" --wp=0
415*8617a60dSAndroid Build Coastguard Worker
416*8617a60dSAndroid Build Coastguard Worker# Test 'AP RO locked with verification turned on'
417*8617a60dSAndroid Build Coastguard Workertest_update "AP RO locked update (locked, SI_DESC is different)" \
418*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.locked" "${EXPECTED}/rw.locked" \
419*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0 --debug
420*8617a60dSAndroid Build Coastguard Worker
421*8617a60dSAndroid Build Coastguard Workertest_update "AP RO locked update (locked, SI_DESC is the same)" \
422*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.locked_same_desc" "${EXPECTED}/full" \
423*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0 --debug
424*8617a60dSAndroid Build Coastguard Worker
425*8617a60dSAndroid Build Coastguard Workertest_update "AP RO locked update (unlocked)" \
426*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.unlocked" "${EXPECTED}/full" \
427*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0 --debug
428*8617a60dSAndroid Build Coastguard Worker
429*8617a60dSAndroid Build Coastguard Worker# Test legacy update
430*8617a60dSAndroid Build Coastguard Workertest_update "Legacy update" \
431*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/legacy" \
432*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --mode=legacy
433*8617a60dSAndroid Build Coastguard Worker
434*8617a60dSAndroid Build Coastguard Worker# Test quirks
435*8617a60dSAndroid Build Coastguard Workertest_update "Full update (wrong size)" \
436*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.large" "!Failed writing firmware" \
437*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0 \
438*8617a60dSAndroid Build Coastguard Worker  --quirks unlock_csme_eve,eve_smm_store
439*8617a60dSAndroid Build Coastguard Worker
440*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--quirks enlarge_image)" \
441*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.large" "${EXPECTED}/large" --quirks enlarge_image \
442*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0
443*8617a60dSAndroid Build Coastguard Worker
444*8617a60dSAndroid Build Coastguard Workertest_update "Full update (multi-line --quirks enlarge_image)" \
445*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.large" "${EXPECTED}/large" --quirks '
446*8617a60dSAndroid Build Coastguard Worker  enlarge_image
447*8617a60dSAndroid Build Coastguard Worker  ' -i "${TO_IMAGE}" --wp=0
448*8617a60dSAndroid Build Coastguard Worker
449*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--quirks unlock_csme_eve)" \
450*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/me_unlocked_eve" \
451*8617a60dSAndroid Build Coastguard Worker  --quirks unlock_csme_eve \
452*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0
453*8617a60dSAndroid Build Coastguard Worker
454*8617a60dSAndroid Build Coastguard Workertest_update "Full update (failure by --quirks min_platform_version)" \
455*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "!Need platform version >= 3 (current is 2)" \
456*8617a60dSAndroid Build Coastguard Worker  --quirks min_platform_version=3 \
457*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0 --sys_props ,,2
458*8617a60dSAndroid Build Coastguard Worker
459*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--quirks min_platform_version)" \
460*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full" \
461*8617a60dSAndroid Build Coastguard Worker  --quirks min_platform_version=3 \
462*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0 --sys_props ,,3
463*8617a60dSAndroid Build Coastguard Worker
464*8617a60dSAndroid Build Coastguard Workertest_update "Full update (incompatible platform)" \
465*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}".unpatched "!platform is not compatible" \
466*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0
467*8617a60dSAndroid Build Coastguard Worker
468*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--quirks no_check_platform)" \
469*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}".unpatched "${EXPECTED}/full" \
470*8617a60dSAndroid Build Coastguard Worker  --quirks no_check_platform \
471*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0
472*8617a60dSAndroid Build Coastguard Worker
473*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--quirks preserve_me with non-host programmer)" \
474*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full" \
475*8617a60dSAndroid Build Coastguard Worker  --quirks preserve_me \
476*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0 \
477*8617a60dSAndroid Build Coastguard Worker  -p raiden_debug_spi:target=AP
478*8617a60dSAndroid Build Coastguard Worker
479*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--quirks preserve_me)" \
480*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full" \
481*8617a60dSAndroid Build Coastguard Worker  --quirks preserve_me \
482*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0
483*8617a60dSAndroid Build Coastguard Worker
484*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--quirks preserve_me, autoupdate)" \
485*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/me_preserved" \
486*8617a60dSAndroid Build Coastguard Worker  --quirks preserve_me -m autoupdate \
487*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0
488*8617a60dSAndroid Build Coastguard Worker
489*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--quirks preserve_me, deferupdate_hold)" \
490*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/me_preserved" \
491*8617a60dSAndroid Build Coastguard Worker  --quirks preserve_me -m deferupdate_hold \
492*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0
493*8617a60dSAndroid Build Coastguard Worker
494*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--quirks preserve_me, factory)" \
495*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full" \
496*8617a60dSAndroid Build Coastguard Worker  --quirks preserve_me -m factory \
497*8617a60dSAndroid Build Coastguard Worker  -i "${TO_IMAGE}" --wp=0
498*8617a60dSAndroid Build Coastguard Worker
499*8617a60dSAndroid Build Coastguard Worker# Test manifest.
500*8617a60dSAndroid Build Coastguard WorkerTMP_JSON_OUT="${TMP}/json.out"
501*8617a60dSAndroid Build Coastguard Workerecho "TEST: Manifest (--manifest, --image)"
502*8617a60dSAndroid Build Coastguard Workercp -f "${GERALT_BIOS}" "${TMP}/image.bin"
503*8617a60dSAndroid Build Coastguard Worker(cd "${TMP}" &&
504*8617a60dSAndroid Build Coastguard Worker "${FUTILITY}" update -i image.bin --manifest) >"${TMP_JSON_OUT}"
505*8617a60dSAndroid Build Coastguard Workercmp \
506*8617a60dSAndroid Build Coastguard Worker  <(jq -S <"${TMP_JSON_OUT}") \
507*8617a60dSAndroid Build Coastguard Worker  <(jq -S <"${SCRIPT_DIR}/futility/bios_geralt_cbfs.manifest.json")
508*8617a60dSAndroid Build Coastguard Worker
509*8617a60dSAndroid Build Coastguard Worker# Test archive and manifest. CL_TAG is for custom_label_tag.
510*8617a60dSAndroid Build Coastguard WorkerA="${TMP}/archive"
511*8617a60dSAndroid Build Coastguard Workermkdir -p "${A}/bin"
512*8617a60dSAndroid Build Coastguard Workerecho 'echo "${CL_TAG}"' >"${A}/bin/vpd"
513*8617a60dSAndroid Build Coastguard Workerchmod +x "${A}/bin/vpd"
514*8617a60dSAndroid Build Coastguard Worker
515*8617a60dSAndroid Build Coastguard Workercp -f "${LINK_BIOS}" "${A}/bios.bin"
516*8617a60dSAndroid Build Coastguard Workerecho "TEST: Manifest (--manifest, -a, bios.bin)"
517*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" update -a "${A}" --manifest >"${TMP_JSON_OUT}"
518*8617a60dSAndroid Build Coastguard Workercmp \
519*8617a60dSAndroid Build Coastguard Worker  <(jq -S <"${TMP_JSON_OUT}") \
520*8617a60dSAndroid Build Coastguard Worker  <(jq -S <"${SCRIPT_DIR}/futility/link_bios.manifest.json")
521*8617a60dSAndroid Build Coastguard Worker
522*8617a60dSAndroid Build Coastguard Workermv -f "${A}/bios.bin" "${A}/image.bin"
523*8617a60dSAndroid Build Coastguard Workerecho "TEST: Manifest (--manifest, -a, image.bin)"
524*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" update -a "${A}" --manifest >"${TMP_JSON_OUT}"
525*8617a60dSAndroid Build Coastguard Workercmp \
526*8617a60dSAndroid Build Coastguard Worker  <(jq -S <"${TMP_JSON_OUT}") \
527*8617a60dSAndroid Build Coastguard Worker  <(jq -S <"${SCRIPT_DIR}/futility/link_image.manifest.json")
528*8617a60dSAndroid Build Coastguard Worker
529*8617a60dSAndroid Build Coastguard Worker
530*8617a60dSAndroid Build Coastguard Workercp -f "${TO_IMAGE}" "${A}/image.bin"
531*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--archive, single package)" \
532*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}" "${EXPECTED}/full" \
533*8617a60dSAndroid Build Coastguard Worker  -a "${A}" --wp=0 --sys_props ,,3
534*8617a60dSAndroid Build Coastguard Worker
535*8617a60dSAndroid Build Coastguard Workerecho "TEST: Output (--archive, --mode=output)"
536*8617a60dSAndroid Build Coastguard WorkerTMP_OUTPUT="${TMP}/out_archive" && mkdir -p "${TMP_OUTPUT}"
537*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" update -a "${A}" --mode=output \
538*8617a60dSAndroid Build Coastguard Worker  --output_dir="${TMP_OUTPUT}"
539*8617a60dSAndroid Build Coastguard Workercmp "${TMP_OUTPUT}/image.bin" "${TO_IMAGE}"
540*8617a60dSAndroid Build Coastguard Worker
541*8617a60dSAndroid Build Coastguard Worker# Test Unified Build archives.
542*8617a60dSAndroid Build Coastguard Workermkdir -p "${A}/keyset" "${A}/images"
543*8617a60dSAndroid Build Coastguard Workercp -f "${SIGNER_CONFIG}" "${A}/"
544*8617a60dSAndroid Build Coastguard Workercp -f "${LINK_BIOS}" "${A}/image.bin"
545*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" gbb -s --rootkey="${TMP_FROM}/rootkey" "${A}/image.bin"
546*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" load_fmap "${A}/image.bin" VBLOCK_A:"${TMP_FROM}/VBLOCK_A"
547*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" load_fmap "${A}/image.bin" VBLOCK_B:"${TMP_FROM}/VBLOCK_B"
548*8617a60dSAndroid Build Coastguard Workermv -f "${A}/image.bin" "${A}/images/bios_coral.bin"
549*8617a60dSAndroid Build Coastguard Workercp -f "${PEPPY_BIOS}" "${A}/images/bios_peppy.bin"
550*8617a60dSAndroid Build Coastguard Workercp -f "${LINK_BIOS}" "${A}/images/bios_link.bin"
551*8617a60dSAndroid Build Coastguard Workercp -f "${TMP_TO}/rootkey" "${A}/keyset/rootkey.customtip-cl"
552*8617a60dSAndroid Build Coastguard Workercp -f "${TMP_TO}/VBLOCK_A" "${A}/keyset/vblock_A.customtip-cl"
553*8617a60dSAndroid Build Coastguard Workercp -f "${TMP_TO}/VBLOCK_B" "${A}/keyset/vblock_B.customtip-cl"
554*8617a60dSAndroid Build Coastguard Workercp -f "${PEPPY_BIOS}" "${FROM_IMAGE}.ap"
555*8617a60dSAndroid Build Coastguard Workercp -f "${LINK_BIOS}" "${FROM_IMAGE}.al"
556*8617a60dSAndroid Build Coastguard Workercp -f "${VOXEL_BIOS}" "${FROM_IMAGE}.av"
557*8617a60dSAndroid Build Coastguard Workerpatch_file "${FROM_IMAGE}.ap" FW_MAIN_A 0 "corrupted"
558*8617a60dSAndroid Build Coastguard Workerpatch_file "${FROM_IMAGE}.al" FW_MAIN_A 0 "corrupted"
559*8617a60dSAndroid Build Coastguard Workerpatch_file "${FROM_IMAGE}.av" FW_MAIN_A 0 "corrupted"
560*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--archive, model=link)" \
561*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.al" "${LINK_BIOS}" \
562*8617a60dSAndroid Build Coastguard Worker  -a "${A}" --wp=0 --sys_props 0,0x10001,3 --model=link
563*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--archive, model=peppy)" \
564*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.ap" "${PEPPY_BIOS}" \
565*8617a60dSAndroid Build Coastguard Worker  -a "${A}" --wp=0 --sys_props 0,0x10001,3 --model=peppy
566*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--archive, model=unknown)" \
567*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.ap" "!Unsupported model: 'unknown'" \
568*8617a60dSAndroid Build Coastguard Worker  -a "${A}" --wp=0 --sys_props 0,0x10001,3 --model=unknown
569*8617a60dSAndroid Build Coastguard Worker
570*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--archive, detect-model)" \
571*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.ap" "${PEPPY_BIOS}" \
572*8617a60dSAndroid Build Coastguard Worker  -a "${A}" --wp=0 --sys_props 0,0x10001,3 \
573*8617a60dSAndroid Build Coastguard Worker  --programmer raiden_debug_spi:target=AP
574*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--archive, detect-model, unsupported FRID)" \
575*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.av" "!Unsupported FRID: 'Google_Voxel'" \
576*8617a60dSAndroid Build Coastguard Worker  -a "${A}" --wp=0 --sys_props 0,0x10001,3 \
577*8617a60dSAndroid Build Coastguard Worker  --programmer raiden_debug_spi:target=AP
578*8617a60dSAndroid Build Coastguard Worker
579*8617a60dSAndroid Build Coastguard Workerecho "*** Test Item: Detect model (--archive, --detect-model-only)"
580*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" update -a "${A}" \
581*8617a60dSAndroid Build Coastguard Worker  --emulate "${FROM_IMAGE}.ap" --detect-model-only >"${TMP}/model.out"
582*8617a60dSAndroid Build Coastguard Workercmp "${TMP}/model.out" <(echo peppy)
583*8617a60dSAndroid Build Coastguard Worker
584*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--archive, custom label with tag specified)" \
585*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.al" "${LINK_BIOS}" \
586*8617a60dSAndroid Build Coastguard Worker  -a "${A}" --wp=0 --sys_props 0,0x10001,3 --model=customtip-cl
587*8617a60dSAndroid Build Coastguard WorkerCL_TAG="bad" PATH="${A}/bin:${PATH}" \
588*8617a60dSAndroid Build Coastguard Worker  test_update "Full update (--archive, custom label, wrong image)" \
589*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.al" "!The firmware image for custom label" \
590*8617a60dSAndroid Build Coastguard Worker  -a "${A}" --wp=0 --sys_props 0,0x10001,3 --debug --model=customtip
591*8617a60dSAndroid Build Coastguard WorkerCL_TAG="cl" PATH="${A}/bin:${PATH}" \
592*8617a60dSAndroid Build Coastguard Worker  test_update "Full update (--archive, custom label, fake VPD)" \
593*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.al" "${LINK_BIOS}" \
594*8617a60dSAndroid Build Coastguard Worker  -a "${A}" --wp=0 --sys_props 0,0x10001,3 --model=customtip
595*8617a60dSAndroid Build Coastguard Worker
596*8617a60dSAndroid Build Coastguard Worker# The output mode (without specifying signature id) for custom label would still
597*8617a60dSAndroid Build Coastguard Worker# need a source (emulate) image to decide the VPD, which is not a real use case.
598*8617a60dSAndroid Build Coastguard Workerecho "TEST: Output (--archive, --mode=output, custom label with tag specified)"
599*8617a60dSAndroid Build Coastguard WorkerTMP_OUTPUT="${TMP}/out_custom_label" && mkdir -p "${TMP_OUTPUT}"
600*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" update -a "${A}" --mode=output \
601*8617a60dSAndroid Build Coastguard Worker  --output_dir="${TMP_OUTPUT}" --model=customtip-cl
602*8617a60dSAndroid Build Coastguard Workercmp "${TMP_OUTPUT}/image.bin" "${LINK_BIOS}"
603*8617a60dSAndroid Build Coastguard Worker
604*8617a60dSAndroid Build Coastguard Worker# Custom label + Unibuild with default keys as model name
605*8617a60dSAndroid Build Coastguard Workercp -f "${TMP_TO}/rootkey" "${A}/keyset/rootkey.customtip"
606*8617a60dSAndroid Build Coastguard Workercp -f "${TMP_TO}/VBLOCK_A" "${A}/keyset/vblock_A.customtip"
607*8617a60dSAndroid Build Coastguard Workercp -f "${TMP_TO}/VBLOCK_B" "${A}/keyset/vblock_B.customtip"
608*8617a60dSAndroid Build Coastguard Workertest_update "Full update (--archive, custom label, no VPD, default keys)" \
609*8617a60dSAndroid Build Coastguard Worker  "${FROM_IMAGE}.al" "${LINK_BIOS}" \
610*8617a60dSAndroid Build Coastguard Worker  -a "${A}" --wp=0 --sys_props 0,0x10001,3 --model=customtip
611*8617a60dSAndroid Build Coastguard Worker
612*8617a60dSAndroid Build Coastguard Worker# Test special programmer
613*8617a60dSAndroid Build Coastguard Workertest_flashrom() {
614*8617a60dSAndroid Build Coastguard Worker  echo "TEST: Full update (dummy programmer)"
615*8617a60dSAndroid Build Coastguard Worker  local emu="${TMP}/emu"
616*8617a60dSAndroid Build Coastguard Worker  cp -f "${FROM_IMAGE}" "${emu}"
617*8617a60dSAndroid Build Coastguard Worker  "${FUTILITY}" update --programmer \
618*8617a60dSAndroid Build Coastguard Worker    dummy:emulate=VARIABLE_SIZE,image="${emu}",size=8388608 \
619*8617a60dSAndroid Build Coastguard Worker    -i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,3 >&2
620*8617a60dSAndroid Build Coastguard Worker  cmp "${emu}" "${EXPECTED}/full"
621*8617a60dSAndroid Build Coastguard Worker}
622*8617a60dSAndroid Build Coastguard Workertype flashrom >/dev/null 2>&1 && test_flashrom
623*8617a60dSAndroid Build Coastguard Worker
624*8617a60dSAndroid Build Coastguard Workertest_cbfstool() {
625*8617a60dSAndroid Build Coastguard Worker  echo "TEST: Update with cbsfstool"
626*8617a60dSAndroid Build Coastguard Worker  local smm="${TMP}/smm"
627*8617a60dSAndroid Build Coastguard Worker  local cbfs="${TMP}/cbfs"
628*8617a60dSAndroid Build Coastguard Worker  local quirk="${TMP}/quirk"
629*8617a60dSAndroid Build Coastguard Worker
630*8617a60dSAndroid Build Coastguard Worker  echo "SMM STORE" >"${smm}"
631*8617a60dSAndroid Build Coastguard Worker  truncate -s 262144 "${smm}"
632*8617a60dSAndroid Build Coastguard Worker  cp -f "${FROM_IMAGE}" "${TMP_FROM}.smm"
633*8617a60dSAndroid Build Coastguard Worker  cp -f "${EXPECTED}/full" "${EXPECTED}/full_smm"
634*8617a60dSAndroid Build Coastguard Worker  cbfstool "${TMP_FROM}.smm" add -r RW_LEGACY -n "smm_store" \
635*8617a60dSAndroid Build Coastguard Worker    -f "${smm}" -t raw
636*8617a60dSAndroid Build Coastguard Worker  cbfstool "${EXPECTED}/full_smm" add -r RW_LEGACY -n "smm_store" \
637*8617a60dSAndroid Build Coastguard Worker    -f "${smm}" -t raw -b 0x1bf000
638*8617a60dSAndroid Build Coastguard Worker  test_update "Legacy update (--quirks eve_smm_store)" \
639*8617a60dSAndroid Build Coastguard Worker    "${TMP_FROM}.smm" "${EXPECTED}/full_smm" \
640*8617a60dSAndroid Build Coastguard Worker    -i "${TO_IMAGE}" --wp=0 \
641*8617a60dSAndroid Build Coastguard Worker    --quirks eve_smm_store
642*8617a60dSAndroid Build Coastguard Worker
643*8617a60dSAndroid Build Coastguard Worker  echo "min_platform_version=3" >"${quirk}"
644*8617a60dSAndroid Build Coastguard Worker  cp -f "${TO_IMAGE}" "${TO_IMAGE}.quirk"
645*8617a60dSAndroid Build Coastguard Worker  "${FUTILITY}" dump_fmap -x "${TO_IMAGE}" "BOOT_STUB:${cbfs}"
646*8617a60dSAndroid Build Coastguard Worker  # Create a fake CBFS using FW_MAIN_A size.
647*8617a60dSAndroid Build Coastguard Worker  truncate -s $((0x000dffc0)) "${cbfs}"
648*8617a60dSAndroid Build Coastguard Worker  "${FUTILITY}" load_fmap "${TO_IMAGE}.quirk" "FW_MAIN_A:${cbfs}"
649*8617a60dSAndroid Build Coastguard Worker  cbfstool "${TO_IMAGE}.quirk" add -r FW_MAIN_A -n updater_quirks \
650*8617a60dSAndroid Build Coastguard Worker    -f "${quirk}" -t raw
651*8617a60dSAndroid Build Coastguard Worker  test_update "Full update (failure by CBFS quirks)" \
652*8617a60dSAndroid Build Coastguard Worker    "${FROM_IMAGE}" "!Need platform version >= 3 (current is 2)" \
653*8617a60dSAndroid Build Coastguard Worker    -i "${TO_IMAGE}.quirk" --wp=0 --sys_props 0,0x10001,2
654*8617a60dSAndroid Build Coastguard Worker}
655*8617a60dSAndroid Build Coastguard Workertype cbfstool >/dev/null 2>&1 && test_cbfstool
656*8617a60dSAndroid Build Coastguard Worker
657*8617a60dSAndroid Build Coastguard Workertest_ifdtool() {
658*8617a60dSAndroid Build Coastguard Worker  test_update "Full update (--quirks unlock_csme, IFD chipset)" \
659*8617a60dSAndroid Build Coastguard Worker    "${FROM_IMAGE}" "${EXPECTED}/me_unlocked.ifd_chipset" \
660*8617a60dSAndroid Build Coastguard Worker    --quirks unlock_csme -i "${TO_IMAGE}.ifd_chipset" --wp=0
661*8617a60dSAndroid Build Coastguard Worker
662*8617a60dSAndroid Build Coastguard Worker  test_update "Full update (--quirks unlock_csme, IFD bin path)" \
663*8617a60dSAndroid Build Coastguard Worker    "${FROM_IMAGE}" "${EXPECTED}/me_unlocked.ifd_path" \
664*8617a60dSAndroid Build Coastguard Worker    --quirks unlock_csme -i "${TO_IMAGE}.ifd_path" --wp=0
665*8617a60dSAndroid Build Coastguard Worker
666*8617a60dSAndroid Build Coastguard Worker  test_update "Full update (--unlock_me)" \
667*8617a60dSAndroid Build Coastguard Worker    "${FROM_IMAGE}" "${EXPECTED}/me_unlocked.ifd_chipset" \
668*8617a60dSAndroid Build Coastguard Worker    --unlock_me -i "${TO_IMAGE}.ifd_chipset" --wp=0
669*8617a60dSAndroid Build Coastguard Worker
670*8617a60dSAndroid Build Coastguard Worker  echo "TEST: Output (--mode=output, --quirks unlock_csme)"
671*8617a60dSAndroid Build Coastguard Worker  TMP_OUTPUT="${TMP}/out_csme" && mkdir -p "${TMP_OUTPUT}"
672*8617a60dSAndroid Build Coastguard Worker  mkdir -p "${TMP_OUTPUT}"
673*8617a60dSAndroid Build Coastguard Worker  "${FUTILITY}" update -i "${EXPECTED}/ifd_chipset" --mode=output \
674*8617a60dSAndroid Build Coastguard Worker    --output_dir="${TMP_OUTPUT}" --quirks unlock_csme
675*8617a60dSAndroid Build Coastguard Worker  cmp "${TMP_OUTPUT}/image.bin" "${EXPECTED}/me_unlocked.ifd_chipset"
676*8617a60dSAndroid Build Coastguard Worker}
677*8617a60dSAndroid Build Coastguard Workertype ifdtool >/dev/null 2>&1 && test_ifdtool
678*8617a60dSAndroid Build Coastguard Worker
679*8617a60dSAndroid Build Coastguard Workerrm -rf "${TMP}"
680*8617a60dSAndroid Build Coastguard Workerexit 0
681