make_universal_factory_shim: support "-m" to assign master (base) image

Some images (especially RMA) need to use stateful or other lagacy stuff from
other image files.

This CL adds "-m" to make_universal_factory_shim so that we can change the
master image (the one for all legacy / stateful partition).

BUG=chrome-os-partner:4108
TEST=./make_universal_factory_shim.sh -m factory_test.bin \
     factory_install.bin factory_test.bin release_image.bin

Change-Id: I6c8e096fd7ae921a4fb157c035f575a7c3b33834
Reviewed-on: http://gerrit.chromium.org/gerrit/4020
Reviewed-by: Nick Sanders <nsanders@chromium.org>
Tested-by: Hung-Te Lin <hungte@chromium.org>
This commit is contained in:
Hung-Te Lin 2011-07-13 19:08:01 +08:00
parent 2f2b9031bc
commit 8d5f0e60de

View File

@ -52,6 +52,7 @@ image_copy_partition() {
local from_part="$2" local from_part="$2"
local to_image="$3" local to_image="$3"
local to_part="$4" local to_part="$4"
local bs="$CGPT_BS"
local from_offset="$(image_get_partition_offset "$from_image" "$from_part")" local from_offset="$(image_get_partition_offset "$from_image" "$from_part")"
local from_size="$(image_get_partition_size "$from_image" "$from_part")" local from_size="$(image_get_partition_size "$from_image" "$from_part")"
@ -62,9 +63,29 @@ image_copy_partition() {
die "Failed to copy partition: $from_image#$from_part -> $to_image#$to_part" die "Failed to copy partition: $from_image#$from_part -> $to_image#$to_part"
fi fi
# TODO(hungte) Speed up by increasing bs # Seed up by increasing block size
dd if="$from_image" of="$to_image" bs="$CGPT_BS" conv=notrunc \ # TODO(hungte) improve obs calculation or change offsets
while [ "$((from_size > 0 &&
from_size % 2 == 0 &&
from_offset % 2 == 0 &&
to_offset % 2 == 0))" = "1" ]; do
bs=$((bs * 2))
from_size=$((from_size / 2))
from_offset=$((from_offset / 2))
to_offset=$((to_offset / 2))
done
# Display progress if the partition is larger than 32M.
if [ "$((from_size * bs > 32 * 1048576))" = "1" ] && type pv >/dev/null 2>&1
then
dd if="$from_image" bs="$bs" count=$from_size skip="$from_offset" |
pv -B "$bs" -s "$((bs * from_size))" |
dd of="$to_image" bs="$bs" count="$from_size" seek="$to_offset" \
conv=notrunc iflag=fullblock
else
dd if="$from_image" of="$to_image" bs="$bs" conv=notrunc \
count=$from_size skip="$from_offset" seek="$to_offset" count=$from_size skip="$from_offset" seek="$to_offset"
fi
} }
images_get_total_size() { images_get_total_size() {
@ -72,13 +93,16 @@ images_get_total_size() {
local total="0" local total="0"
local index local index
# reference, slot_a, slot_b, slot_c.
[ "$#" = 4 ] || die "incorrect call to images_get_total_size"
# copy most partitions from first image # copy most partitions from first image
total="$((total + CGPT_START_SIZE + CGPT_END_SIZE))" total="$((total + CGPT_START_SIZE + CGPT_END_SIZE))"
for index in $STATE_PARTITION $LEGACY_PARTITIONS; do for index in $STATE_PARTITION $LEGACY_PARTITIONS; do
total="$((total + $(image_get_partition_size "$1" $index) ))" total="$((total + $(image_get_partition_size "$1" $index) ))"
done done
for image in "$1" "$2" "$3"; do for image in "$2" "$3" "$4"; do
if [ -z "$image" ]; then if [ -z "$image" ]; then
total="$((total + $(image_get_partition_size "$1" $RESERVED_PARTITION)))" total="$((total + $(image_get_partition_size "$1" $RESERVED_PARTITION)))"
total="$((total + $(image_get_partition_size "$1" $RESERVED_PARTITION)))" total="$((total + $(image_get_partition_size "$1" $RESERVED_PARTITION)))"
@ -115,35 +139,53 @@ image_append_partition() {
main() { main() {
local force="" local force=""
if [ "$1" = "-f" ]; then local image=""
shift local output=""
local main_source=""
local index=""
local slots="0"
while [ "$#" -gt 1 ]; do
case "$1" in
"-f" )
force="True" force="True"
fi shift
;;
"-m" )
main_source="$2"
shift
shift
;;
* )
break
esac
done
if [ "$#" -lt 2 -o "$#" -gt 4 ]; then if [ "$#" -lt 2 -o "$#" -gt 4 ]; then
echo "Usage: $SCRIPT [-f] output shim_image_1 [shim_2 [shim_3]]" echo "Usage: $SCRIPT [-m master] [-f] output shim_image_1 [shim_2 [shim_3]]"
exit 1 exit 1
fi fi
local image="" if [ -z "$main_source" ]; then
local output="$1" main_source="$2"
local main_source="$2" fi
local index="" output="$1"
local slots="0"
shift shift
if [ -f "$output" -a -z "$force" ]; then if [ -f "$output" -a -z "$force" ]; then
die "Output file $output already exists. To overwrite the file, add -f." die "Output file $output already exists. To overwrite the file, add -f."
fi fi
for image in "$@"; do for image in "$main_source" "$@"; do
if [ ! -f "$image" ]; then if [ ! -f "$image" ]; then
die "Cannot find input file $image." die "Cannot find input file $image."
fi fi
done done
# build output # build output
local total_size="$(images_get_total_size "$@")" local total_size="$(images_get_total_size "$main_source" "$@")"
# echo "Total size from [$@]: $total_size" # echo "Total size from [$@]: $total_size"
truncate "$output" -s "$((total_size * CGPT_BS))" truncate -s "0" "$output" # starting with a new file is much faster.
truncate -s "$((total_size * CGPT_BS))" "$output"
cgpt create "$output" cgpt create "$output"
cgpt boot -p "$output" cgpt boot -p "$output"
@ -153,7 +195,7 @@ main() {
local rootfs_part=3 local rootfs_part=3
for image in "$1" "$2" "$3"; do for image in "$1" "$2" "$3"; do
if [ -z "$image" ]; then if [ -z "$image" ]; then
image="$1" image="$main_source"
kpart="$RESERVED_PARTITION" kpart="$RESERVED_PARTITION"
rootfs_part="$RESERVED_PARTITION" rootfs_part="$RESERVED_PARTITION"
fi fi