diff -up mkinitrd-6.0.93/mkinitrd.tuxonice mkinitrd-6.0.93/mkinitrd --- mkinitrd-6.0.93/mkinitrd.tuxonice 2010-03-18 13:27:18.000000000 +0900 +++ mkinitrd-6.0.93/mkinitrd 2010-03-18 14:37:24.000000000 +0900 @@ -74,6 +74,8 @@ LD_SO_CONF=/etc/ld.so.conf LD_SO_CONF_D=/etc/ld.so.conf.d/ [ -e /etc/sysconfig/mkinitrd ] && . /etc/sysconfig/mkinitrd +[ -e /etc/sysconfig/mkinitrd-suspend2 ] && . /etc/sysconfig/mkinitrd-suspend2 +[ -e /etc/sysconfig/mkinitrd-tuxonice ] && . /etc/sysconfig/mkinitrd-tuxonice CONFMODS="$MODULES" MODULES="" @@ -91,7 +93,18 @@ modulefile=/etc/modules.conf rc=0 nolvm="" nodmraid="" - +tuxoniceuserui="none" +tuxoniceversion="30001" +tuxonicefwtarget="" +splashtheme="suspend2" + +DSDT="/boot/DSDT.aml" +SWSUSPPROC="/proc/suspend2" +USERUIPROC="userui_program" +FWLOCPROC="filewriter_target" +RESUMETAR="resume2" +FWIDENT="Suspend2" +UIPREFIX="suspend2" IMAGESIZE=8000 PRESCSIMODS="" fstab="/etc/fstab" @@ -111,6 +124,9 @@ usage () { $cmd " [--image-version] [--force-raid-probe | --omit-raid-modules]" $cmd " [--with=] [--force-lvm-probe | --omit-lvm-modules]" $cmd " [--builtin=] [--omit-dmraid] [--net-dev=]" + $cmd " [--tuxonice-userui=]" + $cmd " [--tuxonice-version=] [--splash=]" + $cmd " [--dsdt-location=]" $cmd " [--fstab=] [--nocompress] " $cmd "" $cmd " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" @@ -745,6 +761,125 @@ handlegraphics() { qpopd } +IsANumber() { + case "$1" in *[!0-9]*|"") return 1 ;; esac + return 0 +} + +check_filewriter() { + # Filewriterhandling for Software Suspend 2 + # we will check for /etc/hibernate/hibernate.conf and the filewriter + # settings there + local resume2 fwlocopt fwloc fwsize oldtarget newresume2 + + if [ -e $1/$RESUMETAR ]; then + resume2=$(cat $1/$RESUMETAR) + # if filewriter is already active use that information + if [ $(echo "$resume2"X | dd bs=5 count=1 2>/dev/null) = "file:" ]; then tuxonicefwtarget=$resume2; return; fi + else + # if resume2 does not exist the current kernel is not Suspend 2 enabled, + # so there is no way to determine filewriters target information anyway + return + fi + + if [ ! -e $1/$2 ]; then return; fi + if [ -e /etc/hibernate/tuxonice.conf ]; then + fwlocopt=$(egrep ^FilewriterLocation /etc/hibernate/tuxonice.conf|tail -n 1) + elif [ -e /etc/hibernate/suspend2.conf ]; then + fwlocopt=$(egrep ^FilewriterLocation /etc/hibernate/suspend2.conf|tail -n 1) + elif [ ! -e /etc/hibernate/hibernate.conf ]; then + return; + else + fwlocopt=$(egrep ^FilewriterLocation /etc/hibernate/hibernate.conf|tail -n 1) + fi + + if [ ! "$fwlocopt" ]; then return; fi + fwloc=$(echo $fwlocopt | awk '{ print $2 }') + fwsize=$(echo $fwlocopt | awk '{ print $3 }') + + if [ ! -e "$fwloc" ]; then + if ! IsANumber "$fwsize"; then return; fi + { + echo "$FWIDENT" + dd if=/dev/zero bs=1M count=$fwsize 2>/dev/null + + } > "$fwloc" + fi + + oldtarget=$(cat $1/$2) + sync + echo "$fwloc" > $1/$2 + newresume2=$(cat $1/$RESUMETAR) + echo "$oldtarget" > $1/$2 + echo "$resume2" > $1/$RESUMETAR + + if [ $(echo $newresume2 | dd bs=5 count=1 2>/dev/null) = "file:" ]; then tuxonicefwtarget=$newresume2; fi +} + +inst_tuxonice() { + # TuxOnIce stuff + emit "echo Activating tux on ice" + userui="$tuxoniceuserui"; + if [ "x$tuxoniceuserui" == "xauto" ]; then + if [ -f /sbin/${UIPREFIX}ui_fbsplash ]; then + userui="fb"; + elif [ -f /sbin/${UIPREFIX}ui_text ]; then + userui="text"; + else + userui="none"; + fi + fi + if [ "x$userui" != "xnone" ]; then + if [ "x$userui" == "xfb" ]; then + if [ -f /sbin/${UIPREFIX}ui_fbsplash ]; then + inst /sbin/${UIPREFIX}ui_fbsplash "$2" /bin/${UIPREFIX}ui_fbsplash + if [ -e /etc/splash/${splashtheme} ]; then + mkdir "$2/etc/splash" + cp -prH /etc/splash/${splashtheme}/ "$2/etc/splash/" + fi + # check if splashtheme is a symlink and add one to initrd if that is the case + if [ -L /etc/splash/${splashtheme} ]; then + dlink=` find /etc/splash/${splashtheme} -printf '%l' ` + dlink=$(basename $dlink) + ln -sf ${splashtheme} "$2/etc/splash/$dlink" + fi + if [ -e $2/etc/splash/{$splashtheme} ]; then + if [ ! -e $2/etc/splash/TuxOnIce ]; then + ln -sf ${splashtheme} "$2/etc/splash/TuxOnIce" + fi + if [ ! -e $2/etc/splash/suspend2 ]; then + ln -sf ${splashtheme} "$2/etc/splash/suspend2" + fi + fi + if [ -f /sbin/splash_helper ]; then + inst /sbin/splash_helper "$2" /bin/splash_helper + fi + emit "echo /bin/${UIPREFIX}ui_fbsplash > $1/$4" + else + error "WARNING: framebuffer UI for suspend not found, skipping." + fi + elif [ "x$userui" == "xtext" ]; then + if [ -f /sbin/${UIPREFIX}ui_text ]; then + inst /sbin/${UIPREFIX}ui_text "$2" /bin/${UIPREFIX}ui_text + emit "echo /bin/${UIPREFIX}ui_text > $1/$4" + else + error "WARNING: text UI for suspend not found, skipping." + fi + else + error "WARNING: unknown UI \"$userui\" specified." + fi + fi + + # First try to resume with the parameter present on the kernel commandline + emit "echo Trying to resume from target specified as $RESUMETAR on cmdline." + emit "echo 1 > $1/do_resume" + + # Then we will try the swapdevice/filetarget that was present while creating the initrd + emit "echo Trying to resume from $3." + emit "echo $3 > $1/$RESUMETAR" + emit "echo 1 > $1/do_resume" +} + savedargs=$* while [ $# -gt 0 ]; do case $1 in @@ -945,6 +1080,54 @@ while [ $# -gt 0 ]; do shift fi ;; + --splash*) + if echo $1 | grep -q '=' ; then + splashtheme=`echo $1 | sed 's/^--splash=//'` + else + splashtheme=$2 + shift + fi + ;; + --tuxonice-userui*) + if echo $1 | grep -q '=' ; then + tuxoniceuserui=`echo $1 | sed 's/^--tuxonice-userui=//'` + else + tuxoniceuserui=$2 + shift + fi + ;; + --tuxonice-version*) + if echo $1 | grep -q '=' ; then + tuxoniceversion=`echo $1 | sed 's/^--tuxonice-version=//'` + else + tuxoniceversion=$2 + shift + fi + ;; + --suspend2-userui*) + if echo $1 | grep -q '=' ; then + tuxoniceuserui=`echo $1 | sed 's/^--suspend2-userui=//'` + else + tuxoniceuserui=$2 + shift + fi + ;; + --suspend2-version*) + if echo $1 | grep -q '=' ; then + tuxoniceversion=`echo $1 | sed 's/^--suspend2-version=//'` + else + tuxoniceversion=$2 + shift + fi + ;; + --dsdt-location*) + if echo $1 | grep -q '=' ; then + DSDT=`echo $1 | sed 's/^--dsdt-location=//'` + else + DSDT=$2 + shift + fi + ;; --help) usage -n ;; @@ -962,6 +1145,22 @@ while [ $# -gt 0 ]; do shift done +if [ "$tuxoniceversion" -lt "20108" ]; then + SWSUSPPROC="/proc/software_suspend" +elif [ "$tuxoniceversion" -ge "20208" ]; then + SWSUSPPROC="/sys/power/suspend2" + USERUIPROC="user_interface/program" + FWLOCPROC="filewriter/target" +fi +if [ "$tuxoniceversion" -ge "20211" ]; then + RESUMETAR="resume" +fi +if [ "$tuxoniceversion" -ge "20212" ]; then + SWSUSPPROC="/sys/power/tuxonice" + FWIDENT="TuxOnIce" + UIPREFIX="tuxonice" +fi + if [ -z "$target" -o -z "$kernel" ]; then usage fi @@ -1186,6 +1385,7 @@ fi mkdir -p $MNTIMAGE mkdir -p $MNTIMAGE/lib/firmware mkdir -p $MNTIMAGE/lib/modules/$kernel +mkdir -p $MNTIMAGE/lib/splash mkdir -p $MNTIMAGE/bin mkdir -p $MNTIMAGE/etc mkdir -p $MNTIMAGE/dev @@ -1220,6 +1420,10 @@ excludemods() { echo $output } +if [ -e "$DSDT" ]; then + inst "$DSDT" "$MNTIMAGE/DSDT.aml" +fi + if [ -n "$excludemodules" ]; then MODULES=$(excludemods $MODULES) availmodules=$(excludemods $availmodules) @@ -1253,6 +1457,7 @@ done mknod $MNTIMAGE/dev/tty c 5 0 mknod $MNTIMAGE/dev/console c 5 1 mknod $MNTIMAGE/dev/ptmx c 5 2 +mknod $MNTIMAGE/dev/fb0 c 29 0 if [ -n "$raiddevices" ]; then inst /sbin/mdadm "$MNTIMAGE" @@ -1496,6 +1701,7 @@ mknod /dev/console c 5 1 mknod /dev/ptmx c 5 2 mknod /dev/fb c 29 0 mknod /dev/hvc0 c 229 0 +mknod /dev/fb0 c 29 0 EOF # XXX really we need to openvt too, in case someting changes the @@ -1628,8 +1834,21 @@ for cryptdev in ${!cryptolv@} ; do emitcrypto `eval echo '$'$cryptdev` done -if [ -z "$noresume" -a -n "$thawdev" ]; then - emit "resume $thawdev" +if [ -z "$noresume" ]; then + if [ -n "$thawdev" ]; then + emit "resume $thawdev" + fi + check_filewriter $SWSUSPPROC $FWLOCPROC + swsuspdev="$thawdev" + if [ -n "$tuxonicefwtarget" ]; then + inst_tuxonice $SWSUSPPROC $MNTIMAGE $tuxonicefwtarget $USERUIPROC + elif [ -n "$swsuspdev" ]; then + if [[ "$swsuspdev" =~ ^(UUID=|LABEL=) ]]; then + swsuspdev=$(resolve_device_name "$swsuspdev") + fi + + inst_tuxonice $SWSUSPPROC $MNTIMAGE swap:$swsuspdev $USERUIPROC + fi fi if [ -n "$loopfs" ]; then