1#!/bin/bash -eux 2 3# Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7# Refer to the Google Chrome OS Main Processor Firmware Specification for what 8# the pieces are. 9# This script generates different firmware binaries with different 10# configurations. 11 12# Syntax: ./firmware_boot.sh <Firmware name without .fd extension>. 13# Usage of the script. 14usage() 15{ 16 cat <<EOF 17 $0 firmware_name 18 firmware_name - name of the firmware. 19EOF 20} 21 22if [ $# != 1 ]; then 23 usage 24 exit 0 25fi 26 27base=$1 28input=${base}.fd 29 30if [ ! -f $input ]; then 31 echo "$input file does not exists." 32 exit 0 33fi 34 35# First, run dump_fmap $input | ./x to compute these values: 36 37# dev-mode BIOS is in firmware A 38rw_a_offset=$(dump_fmap -p ${input} | grep 'RW_SECTION_A' | cut -d' ' -f2) 39rw_a_size=$(dump_fmap -p ${input} | grep 'RW_SECTION_A' | cut -d' ' -f3) 40 41# normal-mode BIOS is in firmware B 42rw_b_offset=$(dump_fmap -p ${input} | grep 'RW_SECTION_B' | cut -d' ' -f2) 43rw_b_size=$(dump_fmap -p ${input} | grep 'RW_SECTION_B' | cut -d' ' -f3) 44 45# Extract the RW BIOS chunks 46dd if=${input} of=dev.bin bs=1 skip=${rw_a_offset} count=${rw_a_size} 47dd if=${input} of=nor.bin bs=1 skip=${rw_b_offset} count=${rw_b_size} 48 49# Garble one to make it fail the signature. I know that we reserve 64K at the 50# start of the section for the signature and headers, so we'll make a random 51# payload and put the normal header on the front. 52dd if=/dev/urandom of=bad.bin bs=1 count=${rw_b_size} 53dd if=nor.bin of=bad.bin conv=notrunc bs=1 count=65536 54 55# A:Normal B:Normal 56output=${base}-NN.fd 57cp ${input} ${output} 58dd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} 59dd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} 60 61# A:Dev B:Dev 62output=${base}-DD.fd 63cp ${input} ${output} 64dd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} 65dd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} 66 67# A:Normal B:Dev 68output=${base}-ND.fd 69cp ${input} ${output} 70dd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} 71dd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} 72 73# A:Dev B:Normal 74output=${base}-DN.fd 75cp ${input} ${output} 76dd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} 77dd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} 78 79# A:Normal B:Bad 80output=${base}-NB.fd 81cp ${input} ${output} 82dd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} 83dd if=bad.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} 84 85# A:Bad B:Normal 86output=${base}-BN.fd 87cp ${input} ${output} 88dd if=bad.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} 89dd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} 90 91# A:Dev B:Bad 92output=${base}-DB.fd 93cp ${input} ${output} 94dd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} 95dd if=bad.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} 96 97# A:Bad B:Dev 98output=${base}-BD.fd 99cp ${input} ${output} 100dd if=bad.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} 101dd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} 102