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