#!/bin/bash -eux # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. # Refer to the Google Chrome OS Main Processor Firmware Specification for what # the pieces are. # This script generates different firmware binaries with different # configurations. # Syntax: ./firmware_boot.sh <Firmware name without .fd extension>. # Usage of the script. usage() { cat <<EOF $0 firmware_name firmware_name - name of the firmware. EOF } if [ $# != 1 ]; then usage exit 0 fi base=$1 input=${base}.fd if [ ! -f $input ]; then echo "$input file does not exists." exit 0 fi # First, run dump_fmap $input | ./x to compute these values: # dev-mode BIOS is in firmware A rw_a_offset=$(dump_fmap -p ${input} | grep 'RW_SECTION_A' | cut -d' ' -f2) rw_a_size=$(dump_fmap -p ${input} | grep 'RW_SECTION_A' | cut -d' ' -f3) # normal-mode BIOS is in firmware B rw_b_offset=$(dump_fmap -p ${input} | grep 'RW_SECTION_B' | cut -d' ' -f2) rw_b_size=$(dump_fmap -p ${input} | grep 'RW_SECTION_B' | cut -d' ' -f3) # Extract the RW BIOS chunks dd if=${input} of=dev.bin bs=1 skip=${rw_a_offset} count=${rw_a_size} dd if=${input} of=nor.bin bs=1 skip=${rw_b_offset} count=${rw_b_size} # Garble one to make it fail the signature. I know that we reserve 64K at the # start of the section for the signature and headers, so we'll make a random # payload and put the normal header on the front. dd if=/dev/urandom of=bad.bin bs=1 count=${rw_b_size} dd if=nor.bin of=bad.bin conv=notrunc bs=1 count=65536 # A:Normal B:Normal output=${base}-NN.fd cp ${input} ${output} dd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} dd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} # A:Dev B:Dev output=${base}-DD.fd cp ${input} ${output} dd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} dd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} # A:Normal B:Dev output=${base}-ND.fd cp ${input} ${output} dd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} dd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} # A:Dev B:Normal output=${base}-DN.fd cp ${input} ${output} dd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} dd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} # A:Normal B:Bad output=${base}-NB.fd cp ${input} ${output} dd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} dd if=bad.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} # A:Bad B:Normal output=${base}-BN.fd cp ${input} ${output} dd if=bad.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} dd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} # A:Dev B:Bad output=${base}-DB.fd cp ${input} ${output} dd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} dd if=bad.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset} # A:Bad B:Dev output=${base}-BD.fd cp ${input} ${output} dd if=bad.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset} dd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset}