Hello community, here is the log from the commit of package grub2 for openSUSE:Factory checked in at 2015-05-15 09:54:31 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/grub2 (Old) and /work/SRC/openSUSE:Factory/.grub2.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "grub2" Changes: -------- --- /work/SRC/openSUSE:Factory/grub2/grub2.changes 2015-05-10 10:52:36.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.grub2.new/grub2.changes 2015-05-15 09:54:32.000000000 +0200 @@ -1,0 +2,18 @@ +Mon May 11 08:50:14 UTC 2015 - mch...@suse.com + +- Support booting opensuse installer as PV DomU (boo#926795) + * added grub2-xen.cfg for tracking default pvgrub2 xen configs rather than + generating it from spec file + * grub2-xen.cfg: from Olaf Hering <oher...@suse.com> + +------------------------------------------------------------------- +Sun May 10 19:38:00 UTC 2015 - arvidj...@gmail.com + +- replace grub2-efinet-reopen-SNP-protocol-for-exclusive-use-by-grub.patch + with upstream version: + * 0001-efidisk-move-device-path-helpers-in-core-for-efinet.patch + * 0002-efinet-skip-virtual-IPv4-and-IPv6-devices-when-enume.patch + * 0003-efinet-open-Simple-Network-Protocol-exclusively.patch + Fixes EFI network boot in some QEMU configurations. + +------------------------------------------------------------------- Old: ---- grub2-efinet-reopen-SNP-protocol-for-exclusive-use-by-grub.patch New: ---- 0001-efidisk-move-device-path-helpers-in-core-for-efinet.patch 0002-efinet-skip-virtual-IPv4-and-IPv6-devices-when-enume.patch 0003-efinet-open-Simple-Network-Protocol-exclusively.patch grub2-xen.cfg ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ grub2.spec ++++++ --- /var/tmp/diff_new_pack.M37DVy/_old 2015-05-15 09:54:34.000000000 +0200 +++ /var/tmp/diff_new_pack.M37DVy/_new 2015-05-15 09:54:34.000000000 +0200 @@ -1,7 +1,7 @@ # # spec file for package grub2 # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -146,6 +146,7 @@ Source12: grub2-snapper-plugin.sh Source14: 80_suse_btrfs_snapshot Source15: grub2-once.service +Source16: grub2-xen.cfg Source1000: PATCH_POLICY Patch1: rename-grub-info-file-to-grub2.patch Patch2: grub2-linux.patch @@ -175,7 +176,9 @@ Patch41: grub2-s390x-04-grub2-install.patch Patch42: grub2-s390x-05-grub2-mkconfig.patch Patch43: grub2-use-rpmsort-for-version-sorting.patch -Patch50: grub2-efinet-reopen-SNP-protocol-for-exclusive-use-by-grub.patch +Patch44: 0001-efidisk-move-device-path-helpers-in-core-for-efinet.patch +Patch45: 0002-efinet-skip-virtual-IPv4-and-IPv6-devices-when-enume.patch +Patch46: 0003-efinet-open-Simple-Network-Protocol-exclusively.patch Patch51: grub2-xen-legacy-config-device-name.patch Patch52: grub2-getroot-support-NVMe-device-names.patch Patch53: grub2-getroot-treat-mdadm-ddf-as-simple-device.patch @@ -416,7 +419,9 @@ %patch41 -p1 %patch42 -p1 %patch43 -p1 -%patch50 -p1 +%patch44 -p1 +%patch45 -p1 +%patch46 -p1 %patch51 -p1 %patch52 -p1 %patch53 -p1 @@ -521,25 +526,7 @@ --program-transform-name=s,grub,%{name}, make %{?_smp_mflags} -cat > ./grub.cfg <<EOF -insmod part_msdos -insmod part_gpt -insmod search -insmod configfile -insmod legacy_configfile -if search -s root -f /boot/grub2/grub.cfg ; then - configfile /boot/grub2/grub.cfg -elif search -s root -f /@/boot/grub2/grub.cfg ; then - configfile /@/boot/grub2/grub.cfg -elif search -s root -f /boot/grub/menu.lst ; then - legacy_configfile /boot/grub/menu.lst -elif search -s root -f /grub2/grub.cfg ; then - configfile /grub2/grub.cfg -elif search -s root -f /grub/menu.lst ; then - legacy_configfile /grub/menu.lst -fi -EOF -./grub-mkstandalone --grub-mkimage=./grub-mkimage -o grub.xen -O %{grubxenarch} -d grub-core/ "/boot/grub/grub.cfg=./grub.cfg" +./grub-mkstandalone --grub-mkimage=./grub-mkimage -o grub.xen -O %{grubxenarch} -d grub-core/ "/boot/grub/grub.cfg=%{SOURCE16}" cd .. %endif ++++++ 0001-efidisk-move-device-path-helpers-in-core-for-efinet.patch ++++++ >From 7b386b703154c0901c4616badf18ddb260954bc1 Mon Sep 17 00:00:00 2001 From: Andrei Borzenkov <arvidj...@gmail.com> Date: Thu, 7 May 2015 20:37:16 +0300 Subject: [PATCH 1/3] efidisk: move device path helpers in core for efinet --- grub-core/disk/efi/efidisk.c | 61 ++++++++------------------------------------ grub-core/kern/efi/efi.c | 41 +++++++++++++++++++++++++++++ include/grub/efi/efi.h | 4 +++ 3 files changed, 55 insertions(+), 51 deletions(-) diff --git a/grub-core/disk/efi/efidisk.c b/grub-core/disk/efi/efidisk.c index 60a6d3c..a8783a3 100644 --- a/grub-core/disk/efi/efidisk.c +++ b/grub-core/disk/efi/efidisk.c @@ -43,47 +43,6 @@ static struct grub_efidisk_data *fd_devices; static struct grub_efidisk_data *hd_devices; static struct grub_efidisk_data *cd_devices; -/* Duplicate a device path. */ -static grub_efi_device_path_t * -duplicate_device_path (const grub_efi_device_path_t *dp) -{ - grub_efi_device_path_t *p; - grub_size_t total_size = 0; - - for (p = (grub_efi_device_path_t *) dp; - ; - p = GRUB_EFI_NEXT_DEVICE_PATH (p)) - { - total_size += GRUB_EFI_DEVICE_PATH_LENGTH (p); - if (GRUB_EFI_END_ENTIRE_DEVICE_PATH (p)) - break; - } - - p = grub_malloc (total_size); - if (! p) - return 0; - - grub_memcpy (p, dp, total_size); - return p; -} - -/* Return the device path node right before the end node. */ -static grub_efi_device_path_t * -find_last_device_path (const grub_efi_device_path_t *dp) -{ - grub_efi_device_path_t *next, *p; - - if (GRUB_EFI_END_ENTIRE_DEVICE_PATH (dp)) - return 0; - - for (p = (grub_efi_device_path_t *) dp, next = GRUB_EFI_NEXT_DEVICE_PATH (p); - ! GRUB_EFI_END_ENTIRE_DEVICE_PATH (next); - p = next, next = GRUB_EFI_NEXT_DEVICE_PATH (next)) - ; - - return p; -} - static struct grub_efidisk_data * make_devices (void) { @@ -110,7 +69,7 @@ make_devices (void) if (! dp) continue; - ldp = find_last_device_path (dp); + ldp = grub_efi_find_last_device_path (dp); if (! ldp) /* This is empty. Why? */ continue; @@ -150,11 +109,11 @@ find_parent_device (struct grub_efidisk_data *devices, grub_efi_device_path_t *dp, *ldp; struct grub_efidisk_data *parent; - dp = duplicate_device_path (d->device_path); + dp = grub_efi_duplicate_device_path (d->device_path); if (! dp) return 0; - ldp = find_last_device_path (dp); + ldp = grub_efi_find_last_device_path (dp); ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; ldp->length = sizeof (*ldp); @@ -180,11 +139,11 @@ is_child (struct grub_efidisk_data *child, grub_efi_device_path_t *dp, *ldp; int ret; - dp = duplicate_device_path (child->device_path); + dp = grub_efi_duplicate_device_path (child->device_path); if (! dp) return 0; - ldp = find_last_device_path (dp); + ldp = grub_efi_find_last_device_path (dp); ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; ldp->length = sizeof (*ldp); @@ -207,8 +166,8 @@ add_device (struct grub_efidisk_data **devices, struct grub_efidisk_data *d) { int ret; - ret = grub_efi_compare_device_paths (find_last_device_path ((*p)->device_path), - find_last_device_path (d->device_path)); + ret = grub_efi_compare_device_paths (grub_efi_find_last_device_path ((*p)->device_path), + grub_efi_find_last_device_path (d->device_path)); if (ret == 0) ret = grub_efi_compare_device_paths ((*p)->device_path, d->device_path); @@ -795,7 +754,7 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle) if (! dp) return 0; - ldp = find_last_device_path (dp); + ldp = grub_efi_find_last_device_path (dp); if (! ldp) return 0; @@ -810,14 +769,14 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle) /* It is necessary to duplicate the device path so that GRUB can overwrite it. */ - dup_dp = duplicate_device_path (dp); + dup_dp = grub_efi_duplicate_device_path (dp); if (! dup_dp) return 0; while (1) { grub_efi_device_path_t *dup_ldp; - dup_ldp = find_last_device_path (dup_dp); + dup_ldp = grub_efi_find_last_device_path (dup_dp); if (!(GRUB_EFI_DEVICE_PATH_TYPE (dup_ldp) == GRUB_EFI_MEDIA_DEVICE_PATH_TYPE && (GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE || GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE))) diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c index b9eb1ab..49a1501 100644 --- a/grub-core/kern/efi/efi.c +++ b/grub-core/kern/efi/efi.c @@ -394,6 +394,47 @@ grub_efi_get_device_path (grub_efi_handle_t handle) GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); } +/* Return the device path node right before the end node. */ +grub_efi_device_path_t * +grub_efi_find_last_device_path (const grub_efi_device_path_t *dp) +{ + grub_efi_device_path_t *next, *p; + + if (GRUB_EFI_END_ENTIRE_DEVICE_PATH (dp)) + return 0; + + for (p = (grub_efi_device_path_t *) dp, next = GRUB_EFI_NEXT_DEVICE_PATH (p); + ! GRUB_EFI_END_ENTIRE_DEVICE_PATH (next); + p = next, next = GRUB_EFI_NEXT_DEVICE_PATH (next)) + ; + + return p; +} + +/* Duplicate a device path. */ +grub_efi_device_path_t * +grub_efi_duplicate_device_path (const grub_efi_device_path_t *dp) +{ + grub_efi_device_path_t *p; + grub_size_t total_size = 0; + + for (p = (grub_efi_device_path_t *) dp; + ; + p = GRUB_EFI_NEXT_DEVICE_PATH (p)) + { + total_size += GRUB_EFI_DEVICE_PATH_LENGTH (p); + if (GRUB_EFI_END_ENTIRE_DEVICE_PATH (p)) + break; + } + + p = grub_malloc (total_size); + if (! p) + return 0; + + grub_memcpy (p, dp, total_size); + return p; +} + static void dump_vendor_path (const char *type, grub_efi_vendor_device_path_t *vendor) { diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h index 489cf9e..0e6fd86 100644 --- a/include/grub/efi/efi.h +++ b/include/grub/efi/efi.h @@ -53,6 +53,10 @@ void EXPORT_FUNC(grub_efi_print_device_path) (grub_efi_device_path_t *dp); char *EXPORT_FUNC(grub_efi_get_filename) (grub_efi_device_path_t *dp); grub_efi_device_path_t * EXPORT_FUNC(grub_efi_get_device_path) (grub_efi_handle_t handle); +grub_efi_device_path_t * +EXPORT_FUNC(grub_efi_find_last_device_path) (const grub_efi_device_path_t *dp); +grub_efi_device_path_t * +EXPORT_FUNC(grub_efi_duplicate_device_path) (const grub_efi_device_path_t *dp); grub_err_t EXPORT_FUNC (grub_efi_finish_boot_services) (grub_efi_uintn_t *outbuf_size, void *outbuf, grub_efi_uintn_t *map_key, grub_efi_uintn_t *efi_desc_size, -- 2.1.4 ++++++ 0002-efinet-skip-virtual-IPv4-and-IPv6-devices-when-enume.patch ++++++ >From c52ae40570c3bfbcca22d2195f5e6b31009d8a3f Mon Sep 17 00:00:00 2001 From: Andrei Borzenkov <arvidj...@gmail.com> Date: Thu, 7 May 2015 20:37:17 +0300 Subject: [PATCH 2/3] efinet: skip virtual IPv4 and IPv6 devices when enumerating cards EDK2 PXE driver creates two child devices - IPv4 and IPv6 - with bound SNP instance. This means we get three cards for every physical adapter when enumerating. Not only is this confusing, this may result in grub ignoring packets that come in via the "wrong" card. Example of device hierarchy is Ctrl[91] PciRoot(0x0)/Pci(0x3,0x0) Ctrl[95] PciRoot(0x0)/Pci(0x3,0x0)/MAC(525400123456,0x1) Ctrl[B4] PciRoot(0x0)/Pci(0x3,0x0)/MAC(525400123456,0x1)/IPv4(0.0.0.0) Ctrl[BC] PciRoot(0x0)/Pci(0x3,0x0)/MAC(525400123456,0x1)/IPv6(0000:0000:0000:0000:0000:0000:0000:0000) Skip PXE created virtual devices when enumerating cards. Make sure to find real card when applying initial autoconfiguration during PXE boot, this information is associated with one of child devices. --- grub-core/net/drivers/efi/efinet.c | 51 +++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c index f171f20..2b53e9e 100644 --- a/grub-core/net/drivers/efi/efinet.c +++ b/grub-core/net/drivers/efi/efinet.c @@ -174,6 +174,29 @@ grub_efinet_findcards (void) { grub_efi_simple_network_t *net; struct grub_net_card *card; + grub_efi_device_path_t *dp, *parent = NULL, *child = NULL; + + /* EDK2 UEFI PXE driver creates IPv4 and IPv6 messaging devices as + children of main MAC messaging device. We only need one device with + bound SNP per physical card, otherwise they compete with each other + when polling for incoming packets. + */ + dp = grub_efi_get_device_path (*handle); + if (!dp) + continue; + for (; ! GRUB_EFI_END_ENTIRE_DEVICE_PATH (dp); dp = GRUB_EFI_NEXT_DEVICE_PATH (dp)) + { + parent = child; + child = dp; + } + if (child + && GRUB_EFI_DEVICE_PATH_TYPE (child) == GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE + && (GRUB_EFI_DEVICE_PATH_SUBTYPE (child) == GRUB_EFI_IPV4_DEVICE_PATH_SUBTYPE + || GRUB_EFI_DEVICE_PATH_SUBTYPE (child) == GRUB_EFI_IPV6_DEVICE_PATH_SUBTYPE) + && parent + && GRUB_EFI_DEVICE_PATH_TYPE (parent) == GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE + && GRUB_EFI_DEVICE_PATH_SUBTYPE (parent) == GRUB_EFI_MAC_ADDRESS_DEVICE_PATH_SUBTYPE) + continue; net = grub_efi_open_protocol (*handle, &net_io_guid, GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); @@ -251,7 +274,33 @@ grub_efi_net_config_real (grub_efi_handle_t hnd, char **device, if (! cdp) continue; if (grub_efi_compare_device_paths (dp, cdp) != 0) - continue; + { + grub_efi_device_path_t *ldp, *dup_dp, *dup_ldp; + int match; + + /* EDK2 UEFI PXE driver creates pseudo devices with type IPv4/IPv6 + as children of Ethernet card and binds PXE and Load File protocols + to it. Loaded Image Device Path protocol will point to these pseudo + devices. We skip them when enumerating cards, so here we need to + find matching MAC device. + */ + ldp = grub_efi_find_last_device_path (dp); + if (GRUB_EFI_DEVICE_PATH_TYPE (ldp) != GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE + || (GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp) != GRUB_EFI_IPV4_DEVICE_PATH_SUBTYPE + && GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp) != GRUB_EFI_IPV6_DEVICE_PATH_SUBTYPE)) + continue; + dup_dp = grub_efi_duplicate_device_path (dp); + if (!dup_dp) + continue; + dup_ldp = grub_efi_find_last_device_path (dup_dp); + dup_ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; + dup_ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; + dup_ldp->length = sizeof (*dup_ldp); + match = grub_efi_compare_device_paths (dup_dp, cdp) == 0; + grub_free (dup_dp); + if (!match) + continue; + } pxe = grub_efi_open_protocol (hnd, &pxe_io_guid, GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (! pxe) -- 2.1.4 ++++++ 0003-efinet-open-Simple-Network-Protocol-exclusively.patch ++++++ >From 49426e9fd2e562c73a4f1206f32eff9e424a1a73 Mon Sep 17 00:00:00 2001 From: Andrei Borzenkov <arvidj...@gmail.com> Date: Thu, 7 May 2015 20:37:17 +0300 Subject: [PATCH 3/3] efinet: open Simple Network Protocol exclusively EDK2 network stack is based on Managed Network Protocol which is layered on top of Simple Management Protocol and does background polling. This polling races with grub for received (and probably trasmitted) packets which causes either serious slowdown or complete failure to load files. Open SNP device exclusively. This destroys all child MNP instances and stops background polling. Exclusive open cannot be done when enumerating cards, as it would destroy PXE information we need to autoconfigure interface; and it cannot be done during autoconfiguration as we need to do it for non-PXE boot as well. So move SNP open to card ->open method and add matching ->close to clean up. Based on patch from Mark Salter <msal...@redhat.com> Also-By: Mark Salter <msal...@redhat.com> Closes: 41731 --- grub-core/net/drivers/efi/efinet.c | 46 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c index 2b53e9e..5533515 100644 --- a/grub-core/net/drivers/efi/efinet.c +++ b/grub-core/net/drivers/efi/efinet.c @@ -142,9 +142,55 @@ get_card_packet (struct grub_net_card *dev) return nb; } +static grub_err_t +open_card (struct grub_net_card *dev) +{ + grub_efi_simple_network_t *net; + + /* Try to reopen SNP exlusively to close any active MNP protocol instance + that may compete for packet polling + */ + net = grub_efi_open_protocol (dev->efi_handle, &net_io_guid, + GRUB_EFI_OPEN_PROTOCOL_BY_EXCLUSIVE); + if (net) + { + if (net->mode->state == GRUB_EFI_NETWORK_STOPPED + && efi_call_1 (net->start, net) != GRUB_EFI_SUCCESS) + return grub_error (GRUB_ERR_NET_NO_CARD, "%s: net start failed", + dev->name); + + if (net->mode->state == GRUB_EFI_NETWORK_STOPPED) + return grub_error (GRUB_ERR_NET_NO_CARD, "%s: card stopped", + dev->name); + + if (net->mode->state == GRUB_EFI_NETWORK_STARTED + && efi_call_3 (net->initialize, net, 0, 0) != GRUB_EFI_SUCCESS) + return grub_error (GRUB_ERR_NET_NO_CARD, "%s: net initialize failed", + dev->name); + + efi_call_4 (grub_efi_system_table->boot_services->close_protocol, + dev->efi_net, &net_io_guid, + grub_efi_image_handle, dev->efi_handle); + dev->efi_net = net; + } + + /* If it failed we just try to run as best as we can */ + return GRUB_ERR_NONE; +} + +static void +close_card (struct grub_net_card *dev) +{ + efi_call_4 (grub_efi_system_table->boot_services->close_protocol, + dev->efi_net, &net_io_guid, + grub_efi_image_handle, dev->efi_handle); +} + static struct grub_net_card_driver efidriver = { .name = "efinet", + .open = open_card, + .close = close_card, .send = send_card_buffer, .recv = get_card_packet }; -- 2.1.4 ++++++ grub2-xen.cfg ++++++ insmod part_msdos insmod part_gpt insmod search insmod configfile insmod legacy_configfile set debian_cddev="" set debian_cdarch="" if [ "${grub_cpu}" = "x86_64" ]; then debian_cdarch="amd" fi if [ "${grub_cpu}" = "i386" ]; then debian_cdarch="i386" fi if [ -n "${debian_cdarch}" ]; then set debian_kern="/install.${debian_cdarch}/xen/vmlinuz" set debian_initrd="/install.${debian_cdarch}/xen/initrd.gz" search -s debian_domUcfg -f "/install.${debian_cdarch}/xen/debian.cfg" search -s debian_cdkern -f "${debian_kern}" search -s debian_cdinitrd -f "${debian_initrd}" if [ -n "${debian_domUcfg}" -a -n "${debian_cdinitrd}" -a -n "${debian_cdkern}" -a "${debian_domUcfg}" = "${debian_cdinitrd}" -a "${debian_domUcfg}" = "${debian_cdkern}" ]; then debian_cddev="${debian_domUcfg}" fi fi set fedora_cddev="" if [ "${grub_cpu}" = "x86_64" ]; then set fedora_kern="/images/pxeboot/vmlinuz" set fedora_initrd="/images/pxeboot/initrd.img" search -s fedora_cdkern -f "${fedora_kern}" search -s fedora_cdinitrd -f "${fedora_initrd}" if [ -n "${fedora_cdkern}" -a -n "${fedora_cdinitrd}" -a "${fedora_cdkern}" = "${fedora_cdinitrd}" ]; then set fedora_cddev="${fedora_cdkern}" fi fi set suse_cddev="" search -s suse_cddev_content -f "/content" search -s suse_cddev_product -f "/media.1/products" if [ -n "${suse_cddev_content}" -a -n "${suse_cddev_product}" -a "${suse_cddev_content}" = "${suse_cddev_product}" ]; then set suse_cddev="${suse_cddev_content}" fi hdcfg_lst="/boot/grub2/grub.cfg \ /@/boot/grub2/grub.cfg \ /boot/grub/menu.lst \ /grub2/grub.cfg \ /grub/menu.lst" set hdcfg="" for c in ${hdcfg_lst}; do if search -s hddev -f "${c}"; then set hdcfg="${c}" break fi done set timeout=0 if [ -n "${debian_cddev}" ]; then set timeout=8 menuentry "${debian_cddev} Debian Install" { set root="${debian_cddev}" linux "${debian_kern}" ignore_loglevel initrd "${debian_initrd}" } fi if [ -n "${fedora_cddev}" ]; then set timeout=8 menuentry "${fedora_cddev} Fedora Install" { set root="${fedora_cddev}" linux "${fedora_kern}" ignore_loglevel initrd "${fedora_initrd}" } menuentry "${fedora_cddev} Fedora Rescue" { set root="${fedora_cddev}" linux "${fedora_kern}" ignore_loglevel rescue initrd "${fedora_initrd}" } fi if [ -n "${suse_cddev}" ]; then if [ "${grub_cpu}" = "i386" ]; then set suse_cdarch="i586" else set suse_cdarch="${grub_cpu}" fi set timeout=8 set root="${suse_cddev}" set suse_cdcfg="/boot/${suse_cdarch}/grub2-xen/grub.cfg" set suse_cdkern="/boot/${suse_cdarch}/vmlinuz-xen" set suse_cdinitrd="/boot/${suse_cdarch}/initrd-xen" if [ -f "${suse_cdcfg}" ]; then menuentry "${suse_cddev} SUSE Install menu" { set root="${suse_cddev}" configfile "${suse_cdcfg}" } elif [ -f "${suse_cdkern}" -a -f "$suse_cdinitrd" ]; then menuentry "${suse_cddev} SUSE Install" { linux "${suse_cdkern}" linemode=1 xencons=hvc0 initrd "${suse_cdinitrd}" } menuentry "${suse_cddev} SUSE Rescue" { linux "${suse_cdkern}" linemode=1 xencons=hvc0 rescue=1 initrd "${suse_cdinitrd}" } menuentry "${suse_cddev} SUSE Upgrade" { linux "${suse_cdkern}" linemode=1 xencons=hvc0 upgrade=1 initrd "${suse_cdinitrd}" } else echo "the device ${suse_cddev} is not xen pv bootable" fi fi if [ -n "${hddev}" ] ; then set default="Boot From Hard Disk" menuentry "${hddev} Boot From Hard Disk" { set root="${hddev}" configfile "${hdcfg}" } fi