| 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}
|
| +
|
|
|