WIP: Use kexec to boot Tizen
authorŁukasz Stelmach <l.stelmach@samsung.com>
Thu, 5 Mar 2020 16:27:55 +0000 (17:27 +0100)
committer정재훈/Tizen Platform Lab(SR)/Staff Engineer/삼성전자 <jh80.chung@samsung.com>
Thu, 19 Mar 2020 01:10:44 +0000 (10:10 +0900)
Initial kboot ramdisk.

Signed-off-by: Łukasz Stelmach <l.stelmach@samsung.com>
CMakeLists.txt
packaging/initrd-recovery.spec
src/initrd-recovery/00-initrd-recovery.list.in
src/initrd-recovery/init
src/initrd-recovery/normal-init [new file with mode: 0755]

index 501926e..dd24847 100644 (file)
@@ -2,7 +2,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
 PROJECT(initrd-recovery)
 
 # Initrd-recovery
-INSTALL(FILES ${INITRD_RECOVERY_SRC_DIR}/init DESTINATION ${INITRD_RECOVERY_LIBEXEC_DIR})
+INSTALL(FILES ${INITRD_RECOVERY_SRC_DIR}/init ${INITRD_RECOVERY_SRC_DIR}/normal-init DESTINATION ${INITRD_RECOVERY_LIBEXEC_DIR})
 
 CONFIGURE_FILE(${INITRD_RECOVERY_SRC_DIR}/mkinitrd-recovery.sh.in
                ${INITRD_RECOVERY_SRC_DIR}/mkinitrd-recovery.sh
index b7c152f..156fffd 100644 (file)
@@ -61,6 +61,7 @@ rm -rf %{_datadir}/initrd-recovery
 %license LICENSE
 %{initrd_recovery_install_dropin_dir}/00-initrd-recovery.list
 %attr(0775,root,root)%{initrd_recovery_libexec_dir}/init
+%attr(0775,root,root)%{initrd_recovery_libexec_dir}/normal-init
 %attr(0775,root,root)%{initrd_recovery_libexec_dir}/mkinitrd-recovery.sh
 %attr(0775,root,root)%{initrd_recovery_libexec_dir}/minireboot
 
index 21a03e9..48ce971 100644 (file)
@@ -1,7 +1,9 @@
 # ---- Target contents ----------------------------------------------------- #
 MVWITHLIBS="
 @INITRD_RECOVERY_LIBEXEC_DIR@/init
+@INITRD_RECOVERY_LIBEXEC_DIR@/normal-init
 @INITRD_RECOVERY_LIBEXEC_DIR@/minireboot
+/usr/sbin/kexec
 "
 
 WITHLIBS="
@@ -19,6 +21,7 @@ WITHLIBS="
 SYMLINKS="
 /bin/sh:bash
 /sbin/init:@INITRD_RECOVERY_LIBEXEC_DIR@/init
+/sbin/normal-init:@INITRD_RECOVERY_LIBEXEC_DIR@/normal-init
 /sbin/minireboot:@INITRD_RECOVERY_LIBEXEC_DIR@/minireboot
 /sbin/reboot:@INITRD_RECOVERY_LIBEXEC_DIR@/minireboot
 "
index 7c6cf17..cf3e42d 100755 (executable)
@@ -5,6 +5,13 @@ export PATH=/usr/bin:/bin:/usr/sbin:/sbin
 FAKE_ROOT=/system
 FAKE_ROOT_RO=/system-ro
 INFORM_PATH=/mnt/inform
+BOOT_PATH=/boot
+REBOOT_PARAM_PATH=${INFORM_PATH}/reboot-param.bin
+
+reboot_upgrade_val=upgr
+reboot_recovery_val=rcvr
+reboot_nodef_val=ndef
+reboot_download_val=dwnl
 
 STATUS_DIR=${FAKE_ROOT}/opt/data/recovery
 STATUS_FILE=${STATUS_DIR}/RW.STATUS
@@ -17,10 +24,11 @@ UMOUNT="/bin/umount"
 REBOOT="/sbin/reboot"
 BLKID="/usr/sbin/blkid"
 
+
 #------------------------------------------------
 #       mount_partitions
 #------------------------------------------------
-mount_partitions() {
+mount_apifs() {
     "$MOUNT" -t proc none /proc
     "$MOUNT" -t sysfs none /sys
     "$MOUNT" -t smackfs smackfs /smack
@@ -34,7 +42,13 @@ mount_partitions() {
 #------------------------------------------------
 #       mount_inform
 #------------------------------------------------
-mount_inform() {
+mount_partitions() {
+    PART_BOOT=$("$BLKID" -L "BOOT" -o device)
+    if [ "z$PART_BOOT" != "z" ]; then
+        "$MKDIR" -p ${BOOT_PATH}
+        "$MOUNT" -t vfat ${PART_BOOT} ${BOOT_PATH}
+    fi
+
     PART_INFORM=$("$BLKID" -L "inform" -o device)
     if [ "z$PART_INFORM" != "z" ]; then
         "$MKDIR" -p ${INFORM_PATH}
@@ -47,6 +61,8 @@ mount_inform() {
 #------------------------------------------------
 do_reboot() {
     echo "Reboot"
+    "$UMOUNT" "$INFORM_PATH"
+    "$UMOUNT" "$BOOT_PATH"
     "$SYNC"
     "$REBOOT"
     while [ 1 ]
@@ -61,29 +77,27 @@ do_reboot() {
 #------------------------------------------------
 echo "You entered into /sbin/init on initrd"
 
+mount_apifs
 mount_partitions
-mount_inform
 
 cd /
 
-# Manually parse /proc/cmdline to avoid additional tools on image
-read cmdline </proc/cmdline
-echo "Kernel command line: $cmdline"
-set -- $cmdline
-while [ $# -gt 0 ]; do
-    key="${1%%=*}"
-    if [ "$key" = "bootmode" ]; then
-        BOOT_MODE="${1#*=}"
-        break;
-    fi
-    shift
-done
+BOOT_MODE=normal
 
-if [ "z$BOOT_MODE" = "z" ]; then
-    echo "BOOT_MODE was NOT defined!!"
-    echo "Do reboot!!"
-    do_reboot
+# Logic from boot.scr
+if [ -f "$REBOOT_PARAM_PATH" ]; then
+    REBOOT_PARAM="$(cat $REBOOT_PARAM_PATH)"
+    if [ "$REBOOT_PARAM" = "$reboot_upgrade_val" ]; then
+       BOOT_MODE=fota
+    elif [ "$REBOOT_PARAM" = "$reboot_recovery_val" ]; then
+       BOOT_MODE=recovery
+    elif [ "$REBOOT_PARAM" = "$reboot_download_val" ]; then
+       BOOT_MODE=flash
+    elif [ "$REBOOT_PARAM" = "$reboot_nodef_val" ]; then
+       echo "This reboot parameter is not supported..."
+    fi
 fi
+
 echo "BOOTMODE is ${BOOT_MODE}"
 
 if [ -f /sbin/${BOOT_MODE}-init ]; then
diff --git a/src/initrd-recovery/normal-init b/src/initrd-recovery/normal-init
new file mode 100755 (executable)
index 0000000..2c8f184
--- /dev/null
@@ -0,0 +1,28 @@
+#!/bin/sh
+export PATH=/usr/bin:/bin:/usr/sbin:/sbin
+
+while read -t3 -s -n1 -p "Press any key to enter shell..." key; do
+    echo
+    exec /bin/bash
+done;
+
+set -x
+INFORM_PATH=/mnt/inform
+BOOT_PATH=/boot
+REBOOT_PARAM_PATH=${INFORM_PATH}/reboot-param.bin
+
+BLKID="/usr/sbin/blkid"
+KEXEC="/usr/sbin/kexec"
+
+CMDLINE="$(cat /boot/cmdline.txt)"
+PART_RAMDISK=$("$BLKID" -L "ramdisk" -o device)
+
+blkid
+echo PART_RAMDISK=$("$BLKID" -L "ramdisk" -o device)
+
+echo "Booting Tizen"
+"$KEXEC" --load /boot/zImage \
+        --append="$CMDLINE bootmode=ramdisk" \
+        --ramdisk="$PART_RAMDISK" \
+        --kexec-syscall
+"$KEXEC" -e