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