18fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna#!/bin/bash -eux
28fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
38fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
48fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# Use of this source code is governed by a BSD-style license that can be
58fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# found in the LICENSE file.
68fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
78fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# Refer to the Google Chrome OS Main Processor Firmware Specification for what
88fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# the pieces are.
98fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# This script generates different firmware binaries with different
108fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# configurations.
118fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
128fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# Syntax: ./firmware_boot.sh <Firmware name without .fd extension>.
138fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# Usage of the script.
148fbdc10ebad1b14794aba593025338f017261972Rajesh Chennausage()
158fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna{
168fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna  cat <<EOF
178fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna  $0 firmware_name
188fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna  firmware_name - name of the firmware.
198fbdc10ebad1b14794aba593025338f017261972Rajesh ChennaEOF
208fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna}
218fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
228fbdc10ebad1b14794aba593025338f017261972Rajesh Chennaif [ $# != 1 ]; then
238fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna  usage
248fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna  exit 0
258fbdc10ebad1b14794aba593025338f017261972Rajesh Chennafi
268fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
278fbdc10ebad1b14794aba593025338f017261972Rajesh Chennabase=$1
288fbdc10ebad1b14794aba593025338f017261972Rajesh Chennainput=${base}.fd
298fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
308fbdc10ebad1b14794aba593025338f017261972Rajesh Chennaif [ ! -f $input ]; then
318fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna  echo "$input file does not exists."
328fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna  exit 0
338fbdc10ebad1b14794aba593025338f017261972Rajesh Chennafi
348fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
358fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# First, run dump_fmap $input | ./x to compute these values:
368fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
378fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# dev-mode BIOS is in firmware A
388fbdc10ebad1b14794aba593025338f017261972Rajesh Chennarw_a_offset=$(dump_fmap -p ${input} | grep 'RW_SECTION_A' | cut -d' ' -f2)
398fbdc10ebad1b14794aba593025338f017261972Rajesh Chennarw_a_size=$(dump_fmap -p ${input} | grep 'RW_SECTION_A' | cut -d' ' -f3)
408fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
418fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# normal-mode BIOS is in firmware B
428fbdc10ebad1b14794aba593025338f017261972Rajesh Chennarw_b_offset=$(dump_fmap -p ${input} | grep 'RW_SECTION_B' | cut -d' ' -f2)
438fbdc10ebad1b14794aba593025338f017261972Rajesh Chennarw_b_size=$(dump_fmap -p ${input} | grep 'RW_SECTION_B' | cut -d' ' -f3)
448fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
458fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# Extract the RW BIOS chunks
468fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=${input} of=dev.bin bs=1 skip=${rw_a_offset} count=${rw_a_size}
478fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=${input} of=nor.bin bs=1 skip=${rw_b_offset} count=${rw_b_size}
488fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
498fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# Garble one to make it fail the signature. I know that we reserve 64K at the
508fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# start of the section for the signature and headers, so we'll make a random
518fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# payload and put the normal header on the front.
528fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=/dev/urandom of=bad.bin bs=1 count=${rw_b_size}
538fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=nor.bin of=bad.bin conv=notrunc bs=1 count=65536
548fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
558fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# A:Normal B:Normal
568fbdc10ebad1b14794aba593025338f017261972Rajesh Chennaoutput=${base}-NN.fd
578fbdc10ebad1b14794aba593025338f017261972Rajesh Chennacp ${input} ${output}
588fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset}
598fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset}
608fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
618fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# A:Dev    B:Dev
628fbdc10ebad1b14794aba593025338f017261972Rajesh Chennaoutput=${base}-DD.fd
638fbdc10ebad1b14794aba593025338f017261972Rajesh Chennacp ${input} ${output}
648fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset}
658fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset}
668fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
678fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# A:Normal B:Dev
688fbdc10ebad1b14794aba593025338f017261972Rajesh Chennaoutput=${base}-ND.fd
698fbdc10ebad1b14794aba593025338f017261972Rajesh Chennacp ${input} ${output}
708fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset}
718fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset}
728fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
738fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# A:Dev    B:Normal
748fbdc10ebad1b14794aba593025338f017261972Rajesh Chennaoutput=${base}-DN.fd
758fbdc10ebad1b14794aba593025338f017261972Rajesh Chennacp ${input} ${output}
768fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset}
778fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset}
788fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
798fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# A:Normal B:Bad
808fbdc10ebad1b14794aba593025338f017261972Rajesh Chennaoutput=${base}-NB.fd
818fbdc10ebad1b14794aba593025338f017261972Rajesh Chennacp ${input} ${output}
828fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset}
838fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=bad.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset}
848fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
858fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# A:Bad    B:Normal
868fbdc10ebad1b14794aba593025338f017261972Rajesh Chennaoutput=${base}-BN.fd
878fbdc10ebad1b14794aba593025338f017261972Rajesh Chennacp ${input} ${output}
888fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=bad.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset}
898fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=nor.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset}
908fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
918fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# A:Dev    B:Bad
928fbdc10ebad1b14794aba593025338f017261972Rajesh Chennaoutput=${base}-DB.fd
938fbdc10ebad1b14794aba593025338f017261972Rajesh Chennacp ${input} ${output}
948fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset}
958fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=bad.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset}
968fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna
978fbdc10ebad1b14794aba593025338f017261972Rajesh Chenna# A:Bad    B:Dev
988fbdc10ebad1b14794aba593025338f017261972Rajesh Chennaoutput=${base}-BD.fd
998fbdc10ebad1b14794aba593025338f017261972Rajesh Chennacp ${input} ${output}
1008fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=bad.bin of=${output} conv=notrunc bs=1 seek=${rw_a_offset}
1018fbdc10ebad1b14794aba593025338f017261972Rajesh Chennadd if=dev.bin of=${output} conv=notrunc bs=1 seek=${rw_b_offset}
102