Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Unified Diff: src/scripts/build_gpt.sh

Issue 1100001: Switch to GPT-format disk images. (Closed)
Patch Set: Final GPT-enabling changeset. I hope. Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/scripts/build_gpt.sh
diff --git a/src/scripts/build_gpt.sh b/src/scripts/build_gpt.sh
new file mode 100755
index 0000000000000000000000000000000000000000..0376734bc21ebc4b5553b9b9a347915aa7003431
--- /dev/null
+++ b/src/scripts/build_gpt.sh
@@ -0,0 +1,146 @@
+#!/bin/bash
+#
+# 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.
+#
+
+# Load common constants. This should be the first executable line.
+# The path to common.sh should be relative to your script's location.
+. "$(dirname "$0")/common.sh"
+
+# Load functions and constants for chromeos-install
+. "$(dirname "$0")/chromeos-common.sh"
+
+# Script must be run inside the chroot.
+assert_inside_chroot
+
+get_default_board
+
+# Flags.
+DEFINE_string arch "" \
+ "The target architecture (\"arm\" or \"x86\")."
+DEFINE_string board "$DEFAULT_BOARD" \
+ "The board to build an image for."
+DEFINE_string board_root "" \
+ "The build directory, needed to find tools for ARM."
+
+# Usage.
+FLAGS_HELP=$(cat <<EOF
+
+Usage: $(basename $0) [flags] IMAGEDIR OUTDEV
+
+This takes the image components in IMAGEDIR and creates a bootable,
+GPT-formatted image in OUTDEV. OUTDEV can be a file or block device.
+
+EOF
+)
+
+# Parse command line.
+FLAGS "$@" || exit 1
+eval set -- "${FLAGS_ARGV}"
+
+if [[ -z "$FLAGS_board" ]] ; then
+ error "--board is required."
+ exit 1
+fi
+
+if [[ -z "$1" || -z "$2" ]] ; then
+ flags_help
+ exit 1
+fi
+IMAGEDIR="$1"
+OUTDEV="$2"
+
+if [[ -n "$FLAGS_arch" ]]; then
+ ARCH=${FLAGS_arch}
+else
+ # Figure out ARCH from the given toolchain.
+ # TODO: Move to common.sh as a function after scripts are switched over.
+ TC_ARCH=$(echo "$CHOST" | awk -F'-' '{ print $1 }')
+ case "$TC_ARCH" in
+ arm*)
+ ARCH="arm"
+ ;;
+ *86)
+ ARCH="x86"
+ ;;
+ *)
+ error "Unable to determine ARCH from toolchain: $CHOST"
+ exit 1
+ esac
+fi
+
+if [[ -z "$FLAGS_board_root" ]]; then
+ FLAGS_board_root="/build/${FLAGS_board}"
+fi
+
+# Only now can we die on error. shflags functions leak non-zero error codes,
+# so will die prematurely if 'set -e' is specified before now.
+set -e
+# Die on uninitialized variables.
+set -u
+
+# Check for missing parts.
+ROOTFS_IMG="${IMAGEDIR}/rootfs.image"
+if [[ ! -s ${ROOTFS_IMG} ]]; then
+ error "Can't find ${ROOTFS_IMG}"
+ exit 1
+fi
+
+KERNEL_IMG="${IMAGEDIR}/vmlinuz.image"
+if [[ ! -s ${KERNEL_IMG} ]]; then
+ error "Can't find ${KERNEL_IMG}"
+ exit 1
+fi
+
+STATEFUL_IMG="${IMAGEDIR}/stateful_partition.image"
+if [[ ! -s ${STATEFUL_IMG} ]]; then
+ error "Can't find ${STATEFUL_IMG}"
+ exit 1
+fi
+
+# We'll need some code to put in the PMBR, for booting on legacy BIOS. Some ARM
+# systems will use a U-Boot script temporarily, but it goes in the same place.
+if [[ "$ARCH" = "arm" ]]; then
+ # U-Boot script copies the kernel into memory, then boots it.
+ KERNEL_OFFSET=$(printf "0x%08x" ${START_KERN_A})
+ KERNEL_SECS_HEX=$(printf "0x%08x" ${NUM_KERN_BLOCKS})
+ MBR_SCRIPT="${IMAGEDIR}/mbr_script"
+ echo -e "echo\necho ---- ChromeOS Boot ----\necho\n" \
+ "mmc read 1 C0008000 $KERNEL_OFFSET $KERNEL_SECS_HEX\n" \
+ "bootm C0008000" > ${MBR_SCRIPT}
+ MKIMAGE="${FLAGS_board_root}/u-boot/mkimage"
+ if [[ -f "$MKIMAGE".gz ]]; then
+ sudo gunzip "$MKIMAGE".gz
+ fi
+ if [[ -x "$MKIMAGE" ]]; then
+ MBR_SCRIPT_UIMG="${MBR_SCRIPT}.uimg"
+ "$MKIMAGE" -A "${ARCH}" -O linux -T script -a 0 -e 0 -n "COS boot" \
+ -d ${MBR_SCRIPT} ${MBR_SCRIPT_UIMG}
+ MBR_IMG=${IMAGEDIR}/mbr.img
+ dd bs=1 count=`stat --printf="%s" ${MBR_SCRIPT_UIMG}` \
+ if="$MBR_SCRIPT_UIMG" of="$MBR_IMG" conv=notrunc
+ hexdump -v -C "$MBR_IMG"
+ else
+ echo "Error: u-boot mkimage not found or not executable."
+ fi
+ PMBRCODE=${MBR_IMG}
+else
+ PMBRCODE=$(readlink -f /usr/share/syslinux/gptmbr.bin)
+fi
+
+# Create the GPT. This has the side-effect of setting some global vars
+# describing the partition table entries (see the comments in the source).
+install_gpt $OUTDEV $ROOTFS_IMG $KERNEL_IMG $STATEFUL_IMG $PMBRCODE
+
+# Now populate the partitions.
+echo "Copying stateful partition..."
+dd if=${STATEFUL_IMG} of=${OUTDEV} conv=notrunc bs=512 seek=${START_STATEFUL}
+
+echo "Copying kernel..."
+dd if=${KERNEL_IMG} of=${OUTDEV} conv=notrunc bs=512 seek=${START_KERN_A}
+
+echo "Copying rootfs..."
+dd if=${ROOTFS_IMG} of=${OUTDEV} conv=notrunc bs=512 seek=${START_ROOTFS_A}
+

Powered by Google App Engine
This is Rietveld 408576698