initramfs: Add init script for eMMC

This init script mounts the rootfs based on the root u-boot env
variable, mounts the read-write filesystem and sets up the overlay.

Change-Id: Id122f426822bddf12c04819e0b93ed2daa4ab7f6
Signed-off-by: Adriana Kobylak <anoo@us.ibm.com>
diff --git a/recipes-phosphor/images/obmc-phosphor-initramfs.bb b/recipes-phosphor/images/obmc-phosphor-initramfs.bb
index 739aab5..4c7237f 100644
--- a/recipes-phosphor/images/obmc-phosphor-initramfs.bb
+++ b/recipes-phosphor/images/obmc-phosphor-initramfs.bb
@@ -2,7 +2,11 @@
 the Minimal RAM-based Initial Root Filesystem (initramfs), which finds the \
 first 'init' program more efficiently."
 
-PACKAGE_INSTALL = "${VIRTUAL-RUNTIME_base-utils} base-passwd ${ROOTFS_BOOTSTRAP_INSTALL} obmc-phosphor-initfs"
+# Init scripts
+INIT_PACKAGE = "obmc-phosphor-initfs"
+INIT_PACKAGE_df-phosphor-mmc = "phosphor-mmc-init"
+
+PACKAGE_INSTALL = "${VIRTUAL-RUNTIME_base-utils} base-passwd ${ROOTFS_BOOTSTRAP_INSTALL} ${INIT_PACKAGE}"
 
 # Do not pollute the initrd image with rootfs features
 IMAGE_FEATURES = "read-only-rootfs"
diff --git a/recipes-phosphor/initrdscripts/phosphor-mmc-init.bb b/recipes-phosphor/initrdscripts/phosphor-mmc-init.bb
new file mode 100644
index 0000000..45ae452
--- /dev/null
+++ b/recipes-phosphor/initrdscripts/phosphor-mmc-init.bb
@@ -0,0 +1,26 @@
+SUMMARY = "Phosphor OpenBMC pre-init scripts for mmc"
+DESCRIPTION = "Phosphor OpenBMC filesystem mount implementation for mmc."
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+PR = "r1"
+
+inherit allarch
+
+RDEPENDS_${PN} += " \
+    ${VIRTUAL-RUNTIME_base-utils} \
+    gptfdisk \
+    parted \
+    udev \
+"
+
+S = "${WORKDIR}"
+SRC_URI += "file://mmc-init.sh"
+
+do_install() {
+    install -m 0755 ${WORKDIR}/mmc-init.sh ${D}/init
+    install -d ${D}/dev
+    mknod -m 622 ${D}/dev/console c 5 1
+}
+
+FILES_${PN} += " /init /dev "
diff --git a/recipes-phosphor/initrdscripts/phosphor-mmc-init/mmc-init.sh b/recipes-phosphor/initrdscripts/phosphor-mmc-init/mmc-init.sh
new file mode 100644
index 0000000..ec4b745
--- /dev/null
+++ b/recipes-phosphor/initrdscripts/phosphor-mmc-init/mmc-init.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+# Get the value of the root env variable found in /proc/cmdline
+get_root() {
+    local root="$(cat /proc/cmdline)"
+    root="${root##* root=PARTLABEL=}"
+    root="${root%% *}"
+    [ "${root}" != "" ] && echo "${root}"
+}
+
+fslist="proc sys dev run"
+rodir=/mnt/rofs
+cd /
+mkdir -p $fslist
+mount dev dev -tdevtmpfs
+mount sys sys -tsysfs
+mount proc proc -tproc
+mount tmpfs run -t tmpfs -o mode=755,nodev
+
+# Move the secondary GPT to the end of the device if needed. Look for the GPT
+# header signature "EFI PART" located 512 bytes from the end of the device.
+magic=$(tail -c 512 /dev/mmcblk0 | hexdump -C -n 8 | grep "EFI PART")
+if test -z "${magic}"; then
+    sgdisk -e /dev/mmcblk0
+    partprobe
+fi
+
+# There eMMC GPT labels for the rootfs are rofs-a and rofs-b, and the label for
+# the read-write partition is rwfs. Run udev to make the partition labels show 
+# up. Mounting by label allows for partition numbers to change if needed.
+udevd --daemon
+udevadm trigger --type=devices --action=add
+udevadm settle --timeout=10
+
+mkdir -p $rodir
+if ! mount /dev/disk/by-partlabel/"$(get_root)" $rodir -t ext4 -o ro; then
+    /bin/sh
+fi
+if ! mount /dev/disk/by-partlabel/rwfs $rodir/var -t ext4 -o rw; then
+    /bin/sh
+fi
+
+rm -rf $rodir/var/persist/etc-work/
+mkdir -p $rodir/var/persist/etc $rodir/var/persist/etc-work $rodir/var/persist/home/root
+mount overlay $rodir/etc -t overlay -o lowerdir=$rodir/etc,upperdir=$rodir/var/persist/etc,workdir=$rodir/var/persist/etc-work
+
+for f in $fslist; do
+    mount --move $f $rodir/$f
+done
+
+exec chroot $rodir /sbin/init