#!/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}
|