? .pc ? patches ? v1 Index: util/grub.d/10_linux.in =================================================================== RCS file: /cvsroot/grub/grub2/util/grub.d/10_linux.in,v retrieving revision 1.10 diff -u -r1.10 10_linux.in --- util/grub.d/10_linux.in 30 Apr 2008 11:06:27 -0000 1.10 +++ util/grub.d/10_linux.in 30 May 2008 07:44:35 -0000 @@ -78,11 +78,36 @@ echo "$a" } +paravirt="${GRUB_PARAVIRT_ENV:-detect}" +echo "paravirt: $paravirt" >&2 +if [ "$paravirt" == "detect" ] ; then + if [ -e /proc/xen/capabilities ] || [ -e /sys/bus/xen ] ; then + paravirt="xen" + else + paravirt="native" + fi +fi +# Determine the config string to check for in this paravirtual environment. +case "${paravirt}" in + xen) paravirt_guest="CONFIG_XEN=y" ;; + native) paravirt_guest= ;; + *) # Invalid? Call it native... + paravirt=native + paravirt_guest= + ;; +esac +echo "paravirt_guest: $paravirt_guest" >&2 + list=`for i in /boot/vmlinu[xz]-* /vmlinu[xz]-* ; do if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi done` +xen_hv=`for i in /boot/xen-*.gz /xen-*.gz ; do + if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi + done` +xen_hv=${xen_hv_} while [ "x$list" != "x" ] ; do + echo >&2 linux=`find_latest $list` echo "Found linux image: $linux" >&2 basename=`basename $linux` @@ -91,6 +116,37 @@ version=`echo $basename | sed -e "s,^[^0-9]*-,,g"` alt_version=`echo $version | sed -e "s,\.old$,,g"` + config= + for i in "config-${version}" "config-${alt_version}"; do + if test -e "${dirname}/${i}" ; then + config="$i" + break + fi + done + if test -n "${config}" ; then + echo "Found config: ${dirname}/${config}" >&2 + fi + + is_paravirt= + is_paravirt_guest= + is_nonparavirt_xen= + + if test -n ${config} ; then + if grep -q CONFIG_PARAVIRT=y ${dirname}/${config} ; then + is_paravirt=1 + + if test -n "${paravirt_guest}" && grep -q ${paravirt_guest} ${dirname}/${config} ; then + is_paravirt_guest=1 + fi + fi + + # Special case to handle pre-CONFIG_PARAVIRT Xen guests. + if ! grep -q CONFIG_PARAVIRT ${dirname}/${config} && + grep -q CONFIG_XEN=y ${dirname}/${config} ; then + is_nonparavirt_xen=1 + fi + fi + initrd= for i in "initrd.img-${version}" "initrd-${version}.img" \ "initrd.img-${alt_version}" "initrd-${alt_version}.img"; do @@ -103,31 +159,73 @@ echo "Found initrd image: ${dirname}/${initrd}" >&2 fi - cat << EOF + echo "is_paravirt=$is_paravirt is_paravirt_guest=$is_paravirt_guest is_nonparavirt_xen=$is_nonparavirt_xen" >&2 + emit=std + if [ "${paravirt}" != "native" ] && [ "$is_paravirt_guest" ] ; then + emit=pv + elif [ "${paravirt}" != "native" ] && [ ! "$is_paravirt_guest" ] ; then + if [ "${paravirt}" == "xen" ] && [ "$is_nonparavirt_xen" ]; then + # Allow old style non-CONFIG_PARAVIRT Xen kernels. + echo "allowing non-PARAVIRT Xen kernel $linux" >&2 + emit=nonpvxen + else + echo "skip non-paravirt kernel $linux in guest domain. (B)" >&2 + emit=none + #list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '` + #continue + fi + else + if [ "$is_nonparavirt_xen" ]; then + echo "skip non paravirt Xen kernel $linux on native. (C)" >&2 + emit=none + # skip xen kernels + #list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '` + #continue + fi + fi + + if [ "${emit}" == "pv" ] || [ "${emit}" == "nonpvxen" ] ; then + if [ -n "${xen_hv}" ] ; then + echo "create xen stanzas for $xen_hv and Linux $version" >&2 + if [ "${emit}" == "pv" ] ; then + emit="std" # Also emit a non-Xen entry for a paravirt kernel + else + emit=none # But not for an old-style -Xen kernel + fi + else + # If no hypervisor present then assume guest domain and emit a standard entry + emit="std" + fi + fi + + if [ "${emit}" == "std" ] ; then + echo "create regular entry for $version" >&2 + cat << EOF menuentry "${OS}, linux ${version}" { linux ${grub_dirname}/${basename} root=${GRUB_DEVICE} ro ${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} EOF - if test -n "${initrd}" ; then + if test -n "${initrd}" ; then cat << EOF initrd ${grub_dirname}/${initrd} EOF - fi - cat << EOF + fi + cat << EOF } EOF - cat << EOF + cat << EOF menuentry "${OS}, linux ${version} (single-user mode)" { linux ${grub_dirname}/${basename} root=${GRUB_DEVICE} ro single ${GRUB_CMDLINE_LINUX} EOF - if test -n "${initrd}" ; then - cat << EOF + if test -n "${initrd}" ; then + cat << EOF initrd ${grub_dirname}/${initrd} EOF - fi - cat << EOF + fi + cat << EOF } EOF + fi list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '` done