#!/bin/bash

# This script runs under fakeroot.  The fakeroot utility has 
# problems under 64-bit/multi-processor/preemptive kernel, so
# we run it only when necessary. 
# NOTE: If this build is being run on a 64-bit machine, make
# sure to NOT invoke any 32-bit applications in this script.
# Instead move all 32-bit application accesses to buildFS

trap 'echo Error: command exited with code ["$?"]; exit 1' ERR

if [[ -f $PROFILE_DIR/$PROFILE ]]; then
        source $PROFILE_DIR/$PROFILE
fi

# make root file system images for squashfs, jffs2 and ubifs

	#### SQUASHFS 

function squashfs_enabled()
{
	[[ "$BRCM_FLASH_NAND_ROOTFS_SQUBI" = "y" ]] ||
	[[ "$BRCM_ROOTFS_SQUASHFS" = "y" ]] ||
	[[ "$BUILD_ROOTFS_SQUASHFS_HASH" = "y" ]]
}

function mksquashfs_img()
{
sqshimg_name="$1"
if [ "$BRCM_IKOS" == "y" ]; then
    $HOSTTOOLS_DIR/mksquashfs $TARGET_FS $PROFILE_DIR/$sqshimg_name -noappend -all-root
    $HOSTTOOLS_DIR/mksquashfs $TARGET_FS $PROFILE_DIR/${sqshimg_name}.raw -noappend -all-root -noI -noD -noF -noX
    #-noI			do not compress inode table
    #-noD			do not compress data blocks
    #-noF			do not compress fragment blocks
    #-noX			do not compress extended attributes
else
    (ulimit -t 900 ; $HOSTTOOLS_DIR/mksquashfs $TARGET_FS $PROFILE_DIR/$sqshimg_name -noappend -all-root -comp xz) 
    if [ $? -ne 0 ]; then
        echo "mksquashfs failed once"
        (ulimit -t 900 ; $HOSTTOOLS_DIR/mksquashfs $TARGET_FS $PROFILE_DIR/$sqshimg_name -noappend -all-root -comp xz) 
        if [ $? -ne 0 ]; then
            echo "mksquashfs failed twice"
            exit 2
        fi
    fi
fi
}

NANDSIZES=
for a in ${!BUILD_NAND_IMG_BLKSIZE_*}
do
  eval v=\$$a
  if [ -n "$v" ]
  then 
    a=${a#BUILD_NAND_IMG_BLKSIZE_}
    a=${a%KB}
    NANDSIZES="$NANDSIZES $a"
  fi
done
echo "NANDSIZES is $NANDSIZES"

if [ "$BRCM_KERNEL_ROOTFS" = "all" ]; then
        if [ ! -e "$PROFILE_DIR/vmlinux.bin" ]; then
             echo "error: $PROFILE_DIR/vmlinux.bin not found! Check buildFS output"
             exit 2
        fi 
        if [ ! -e "$PROFILE_DIR/vmlinux" ]; then
             echo "error: $PROFILE_DIR/vmlinux not found! Check buildFS output"
             exit 2
        fi 

        SUMTOOL=`find $HOSTTOOLS_DIR/mtd-utils*/ -name 'sumtool' -print -quit`

#### JFFS2 RootFS
        echo -e "/cferam.000" > $HOSTTOOLS_DIR/nocomprlist
        if [ -f $BUILD_DIR/shared/opensource/pmc/images/$BRCM_CHIP.bin ]; then
            echo -e "/pmc.bin" >> $HOSTTOOLS_DIR/nocomprlist
        fi
        if [ ! -z ${BRCM_DTB} ]; then
            for DTB in `find ${DTB_DIR} -name "*.dtb" -printf "%f\n"`
            do
                echo -e "/${DTB}" >> $HOSTTOOLS_DIR/nocomprlist
            done
        fi
        if [ "$BUILD_NAND_KERNEL_LZMA" = "y" ]; then
            echo "Compressing kernel using LZMA"
            $HOSTTOOLS_DIR/cmplzma -k -2 -lzma $PROFILE_DIR/vmlinux $PROFILE_DIR/vmlinux.bin $PROFILE_DIR/vmlinux.lz
            cp $PROFILE_DIR/vmlinux.lz $TARGET_FS/.
            echo -e "/vmlinux.lz" >> $HOSTTOOLS_DIR/nocomprlist
        fi
        if [ "$BUILD_NAND_KERNEL_LZ4" = "y" ]; then
            echo "Compressing kernel using LZ4-HC"
            $HOSTTOOLS_DIR/cmplzma -k -2 -lz4 $PROFILE_DIR/vmlinux $PROFILE_DIR/vmlinux.bin $PROFILE_DIR/vmlinux.lz4
            cp $PROFILE_DIR/vmlinux.lz4 $TARGET_FS/.
            echo -e "/vmlinux.lz4" >> $HOSTTOOLS_DIR/nocomprlist
        fi

        [ ! -z ${BRCM_DTB} ] && cp -v ${DTB_DIR}/*.dtb $TARGET_FS/

        cp $CFE_RAM_FILE $TARGET_FS/cferam.000

        if [ "$BUILD_SECURE_BOOT" = "y" ]; then

           eval "$BUILD_SBI_NOHDR --in $CFE_RAM_FILE --out $PROFILE_DIR/fs/secram.000"
           echo -e "/secram.000" >> $HOSTTOOLS_DIR/nocomprlist
	   if [ "$SECURE_BOOT_ARCH" == "GEN3" ] 
	   then
        	eval "$BUILD_SBI_NOHDR_MFG --in $CFE_RAM_FILE -out $PROFILE_DIR/fs/secmfg.000"
           	echo -e "/secmfg.000" >> $HOSTTOOLS_DIR/nocomprlist
           fi

           eval "$BUILD_SBI_SIGN --in $PROFILE_DIR/vmlinux.lz --out $PROFILE_DIR/vmlinux.sig" 
           cp $PROFILE_DIR/vmlinux.sig $TARGET_FS/.
           echo -e "/vmlinux.sig" >> $HOSTTOOLS_DIR/nocomprlist
        fi

#### JFFS2 BootFS/UBI RootFS
        # Create boot file system dir
        rm -rf $TARGET_BOOTFS
        mkdir $TARGET_BOOTFS
        chmod 777 $TARGET_BOOTFS
        mv $TARGET_FS/cferam.000 $TARGET_BOOTFS/.
        if [ -f $BUILD_DIR/secureos/optee/optee.lz ]; then
            cp -f $BUILD_DIR/secureos/optee/*.lz  $TARGET_BOOTFS/.
        fi

        if [ -f $BUILD_DIR/bootloaders/armtf/armtf.lz ]; then
            cp -f $BUILD_DIR/bootloaders/armtf/armtf.lz  $TARGET_BOOTFS/.
        fi

        if [ -f $BUILD_DIR/shared/opensource/pmc/images/$BRCM_CHIP.bin ]; then
            echo copy $BRCM_CHIP.bin to $TARGET_BOOTFS/pmc.bin
            install -p $BUILD_DIR/shared/opensource/pmc/images/$BRCM_CHIP.bin $TARGET_BOOTFS/pmc.bin
        fi

	[ ! -z ${BRCM_DTB} ] && mv $TARGET_FS/*.dtb ${TARGET_BOOTFS}/.
        rm -f $TARGET_BOOTFS/vmlinux.lz4;
        rm -f $TARGET_BOOTFS/vmlinux.lz;
        if [ "$BUILD_NAND_KERNEL_LZMA" = "y" ]; then
            echo copy vmlinux.lz to $TARGET_BOOTFS
            rm -f $TARGET_FS/vmlinux.lz
            cp $PROFILE_DIR/vmlinux.lz $TARGET_BOOTFS/.
        fi
        if [ "$BUILD_NAND_KERNEL_LZ4" = "y" ]; then
            echo copy vmlinux.lz4 to $TARGET_BOOTFS
            rm -f $TARGET_FS/vmlinux.lz4
            cp $PROFILE_DIR/vmlinux.lz4 $TARGET_BOOTFS/.
        fi

        mkdir -p $TARGET_FS/bootfs
        mkdir -p $TARGET_BOOTFS/etc

	cp $PROFILE_DIR/image_ident $TARGET_BOOTFS/etc/image_ident

        cp $TARGET_FS/etc/image_version $TARGET_BOOTFS/etc/image_version
        echo -e "/etc/image_version" >> $HOSTTOOLS_DIR/nocomprlist
        echo -e "/etc/image_ident" >> $HOSTTOOLS_DIR/nocomprlist

        if squashfs_enabled; then
                echo -e "[ubifs]"                 > $PROFILE_DIR/squbi.ini
                echo -e "mode=ubi"               >> $PROFILE_DIR/squbi.ini
                echo -e "image=$PROFILE_DIR/squashfs.img" >> $PROFILE_DIR/squbi.ini
                echo -e "vol_id=0"               >> $PROFILE_DIR/squbi.ini
                echo -e "vol_type=static"        >> $PROFILE_DIR/squbi.ini
                echo -e "vol_name=rootfs_squashfs"  >> $PROFILE_DIR/squbi.ini
        #        echo -e "vol_flags=autoresize"   >> $PROFILE_DIR/squbi.ini
                mksquashfs_img squashfs.img
        fi

	for BLK in $NANDSIZES
	do
	   let "BYTES = $BLK * 1024"
	   case $BLK in
		128)
             		PAGE=2048
			;;
		256|512)
             		PAGE=4096
			;;
		1024)
             		PAGE=8192
			;;
           esac
           let "LEB = $BYTES - 2 * $PAGE"

           echo -e "[ubifs]"                 > $PROFILE_DIR/ubi.ini
           echo -e "mode=ubi"               >> $PROFILE_DIR/ubi.ini
           echo -e "image=$PROFILE_DIR/rootfs_${BLK}.ubifs" >> $PROFILE_DIR/ubi.ini
           echo -e "vol_id=0"               >> $PROFILE_DIR/ubi.ini
           echo -e "vol_type=dynamic"       >> $PROFILE_DIR/ubi.ini
           echo -e "vol_name=rootfs_ubifs"  >> $PROFILE_DIR/ubi.ini
           echo -e "vol_flags=autoresize"   >> $PROFILE_DIR/ubi.ini

        # -e == --lebsize = blocksize - 2xpagesize
            $HOSTTOOLS_DIR/mkfs.jffs2 --squash-uids $BRCM_ENDIAN_FLAGS -p -n -e $BYTES -r $TARGET_BOOTFS -o $PROFILE_DIR/ibootfs${BLK}kb.img -N $HOSTTOOLS_DIR/nocomprlist
            $SUMTOOL $BRCM_ENDIAN_FLAGS -p -i $PROFILE_DIR/ibootfs${BLK}kb.img -o $PROFILE_DIR/bootfs${BLK}kb.img -e ${BLK}KiB -n
            rm -f $PROFILE_DIR/ibootfs${BLK}kb.img
            $HOSTTOOLS_DIR/mtd-utils*/ubinize -v -o $PROFILE_DIR/ubi_rootfs${BLK}kb.img -m $PAGE -p $BYTES  $PROFILE_DIR/ubi.ini
            if squashfs_enabled; then
                    $HOSTTOOLS_DIR/mtd-utils*/ubinize -v -o $PROFILE_DIR/squbi_rootfs${BLK}kb.img -m $PAGE -p $BYTES $PROFILE_DIR/squbi.ini
            fi

        done

        if [ "$BUILD_SECURE_BOOT" = "y" ]; then

           mv $TARGET_FS/secram.000 $TARGET_BOOTFS/.
	   if [ -f $TARGET_FS/secmfg.000 ]; then
              mv $TARGET_FS/secmfg.000 $TARGET_BOOTFS/.
           fi
           mv $TARGET_FS/vmlinux.sig $TARGET_BOOTFS/.

           if [ "$BUILD_NAND_IMG_BLKSIZE_128KB" = "y" ]; then
               $HOSTTOOLS_DIR/mkfs.jffs2 --squash-uids $BRCM_ENDIAN_FLAGS -p -n -e $FLASH_NAND_BLOCK_128KB -r $TARGET_BOOTFS -o $PROFILE_DIR/bootfs128kb_secureboot.img -N $HOSTTOOLS_DIR/nocomprlist
           fi
           if [ "$BUILD_NAND_IMG_BLKSIZE_256KB" = "y" ]; then
               $HOSTTOOLS_DIR/mkfs.jffs2 --squash-uids $BRCM_ENDIAN_FLAGS -p -n -e $FLASH_NAND_BLOCK_256KB -r $TARGET_BOOTFS -o $PROFILE_DIR/bootfs256kb_secureboot.img -N $HOSTTOOLS_DIR/nocomprlist
           fi
           if [ "$BUILD_NAND_IMG_BLKSIZE_512KB" = "y" ]; then
               $HOSTTOOLS_DIR/mkfs.jffs2 --squash-uids $BRCM_ENDIAN_FLAGS -p -n -e $FLASH_NAND_BLOCK_512KB -r $TARGET_BOOTFS -o $PROFILE_DIR/bootfs512kb_secureboot.img -N $HOSTTOOLS_DIR/nocomprlist
           fi
           if [ "$BUILD_NAND_IMG_BLKSIZE_1024KB" = "y" ]; then
               $HOSTTOOLS_DIR/mkfs.jffs2 --squash-uids $BRCM_ENDIAN_FLAGS -p -n -e $FLASH_NAND_BLOCK_1024KB -r $TARGET_BOOTFS -o $PROFILE_DIR/bootfs1024kb_secureboot.img -N $HOSTTOOLS_DIR/nocomprlist
           fi
        fi

        rmdir $TARGET_FS/bootfs

        # -e == --lebsize = blocksize - 2xpagesize
        if [ "$BUILD_NAND_IMG_BLKSIZE_128KB" = "y" ]; then
            if [ "$BRCM_FLASH_NAND_LAYOUT_PUREUBI" = "y" ]; then
                    # pureUBI
                    $PROFILE_DIR/../buildUBI -u $PROFILE_DIR/ubi_full.ini -m $PROFILE_DIR/metadata.bin -f $PROFILE_DIR/filestruct_full.bin -t $TARGET_BOOTFS -y $PROFILE_DIR/rootfs_128.ubifs
                    $HOSTTOOLS_DIR/mtd-utils*/ubinize -v -o $PROFILE_DIR/ubi_rootfs128kb_pureubi.img -m 2048 -p $FLASH_NAND_BLOCK_128KB $PROFILE_DIR/ubi_full.ini
            fi

            if squashfs_enabled; then
                    # squash on pureUBI
                    $PROFILE_DIR/../buildUBI -u $PROFILE_DIR/ubi_full.ini -m $PROFILE_DIR/metadata.bin -f $PROFILE_DIR/filestruct_full.bin -t $TARGET_BOOTFS -y $PROFILE_DIR/squashfs.img -s 1
                    $HOSTTOOLS_DIR/mtd-utils*/ubinize -v -o $PROFILE_DIR/squbi_rootfs128kb_pureubi.img -m 2048 -p $FLASH_NAND_BLOCK_128KB $PROFILE_DIR/ubi_full.ini
            fi
        fi

        if [ "$BUILD_NAND_IMG_BLKSIZE_256KB" = "y" ]; then
            # pureUBI
            if [ "$BRCM_FLASH_NAND_LAYOUT_PUREUBI" = "y" ]; then
                    $PROFILE_DIR/../buildUBI -u $PROFILE_DIR/ubi_full.ini -m $PROFILE_DIR/metadata.bin -f $PROFILE_DIR/filestruct_full.bin -t $TARGET_BOOTFS -y $PROFILE_DIR/rootfs_256.ubifs
                    $HOSTTOOLS_DIR/mtd-utils*/ubinize -v -o $PROFILE_DIR/ubi_rootfs256kb_pureubi.img -m 4096 -p $FLASH_NAND_BLOCK_256KB $PROFILE_DIR/ubi_full.ini
            fi

            if squashfs_enabled; then
                    # squash on pureUBI
                    $PROFILE_DIR/../buildUBI -u $PROFILE_DIR/ubi_full.ini -m $PROFILE_DIR/metadata.bin -f $PROFILE_DIR/filestruct_full.bin -t $TARGET_BOOTFS -y $PROFILE_DIR/squashfs.img -s 1
                    $HOSTTOOLS_DIR/mtd-utils*/ubinize -v -o $PROFILE_DIR/squbi_rootfs256kb_pureubi.img -m 4096 -p $FLASH_NAND_BLOCK_256KB $PROFILE_DIR/ubi_full.ini
            fi
        fi

        if [ "$BUILD_NAND_IMG_BLKSIZE_512KB" = "y" ]; then
            # pureUBI
            $PROFILE_DIR/../buildUBI -u $PROFILE_DIR/ubi_full.ini -m $PROFILE_DIR/metadata.bin -f $PROFILE_DIR/filestruct_full.bin -t $TARGET_BOOTFS -y $PROFILE_DIR/rootfs_512.ubifs
            $HOSTTOOLS_DIR/mtd-utils*/ubinize -v -o $PROFILE_DIR/ubi_rootfs512kb_pureubi.img -m 4096 -p $FLASH_NAND_BLOCK_512KB $PROFILE_DIR/ubi_full.ini

            # squash on pureUBI
            $PROFILE_DIR/../buildUBI -u $PROFILE_DIR/ubi_full.ini -m $PROFILE_DIR/metadata.bin -f $PROFILE_DIR/filestruct_full.bin -t $TARGET_BOOTFS -y $PROFILE_DIR/squashfs.img -s 1
            $HOSTTOOLS_DIR/mtd-utils*/ubinize -v -o $PROFILE_DIR/squbi_rootfs512kb_pureubi.img -m 4096 -p $FLASH_NAND_BLOCK_512KB $PROFILE_DIR/ubi_full.ini
        fi

        if [ "$BUILD_NAND_IMG_BLKSIZE_1024KB" = "y" ]; then
            # pureUBI
            $PROFILE_DIR/../buildUBI -u $PROFILE_DIR/ubi_full.ini -m $PROFILE_DIR/metadata.bin -f $PROFILE_DIR/filestruct_full.bin -t $TARGET_BOOTFS -y $PROFILE_DIR/rootfs_1025.ubifs
            $HOSTTOOLS_DIR/mtd-utils*/ubinize -v -o $PROFILE_DIR/ubi_rootfs1024kb_pureubi.img -m 8192 -p $FLASH_NAND_BLOCK_1024KB $PROFILE_DIR/ubi_full.ini

            # squash on pureUBI
            $PROFILE_DIR/../buildUBI -u $PROFILE_DIR/ubi_full.ini -m $PROFILE_DIR/metadata.bin -f $PROFILE_DIR/filestruct_full.bin -t $TARGET_BOOTFS -y $PROFILE_DIR/squashfs.img -s 1
            $HOSTTOOLS_DIR/mtd-utils*/ubinize -v -o $PROFILE_DIR/squbi_rootfs1024kb_pureubi.img -m 8192 -p $FLASH_NAND_BLOCK_1024KB $PROFILE_DIR/ubi_full.ini
        fi

        rm $HOSTTOOLS_DIR/nocomprlist

fi

