]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Fix efi chainloader on network root.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 10 Mar 2012 19:41:28 +0000 (20:41 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 10 Mar 2012 19:41:28 +0000 (20:41 +0100)
* grub-core/loader/efi/chainloader.c (grub_cmd_chainloader): Handle
network devices.
* grub-core/net/drivers/efi/efinet.c (grub_efinet_get_device_handle):
New function.

ChangeLog
grub-core/loader/efi/chainloader.c
grub-core/net/drivers/efi/efinet.c
include/grub/efi/efi.h

index 961d791c7cee485c44abc5e40209bd20f238f7ca..6b9f7ea9fe3f1562ea3a8d38e2746240cc033314 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2012-03-10  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Fix efi chainloader on network root.
+
+       * grub-core/loader/efi/chainloader.c (grub_cmd_chainloader): Handle
+       network devices.
+       * grub-core/net/drivers/efi/efinet.c (grub_efinet_get_device_handle):
+       New function.
+
 2012-03-10  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/gfxmenu/gui_progress_bar.c (grub_gui_progress_bar): Remove
index ffd8bf57183d5c41ee2545c98d40062871906abd..83d3f93e61d3b6ff0701ded71979fefb719fee16 100644 (file)
@@ -34,6 +34,7 @@
 #include <grub/efi/disk.h>
 #include <grub/command.h>
 #include <grub/i18n.h>
+#include <grub/net.h>
 
 GRUB_MOD_LICENSE ("GPLv3+");
 
@@ -190,11 +191,11 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
   grub_ssize_t size;
   grub_efi_status_t status;
   grub_efi_boot_services_t *b;
-  grub_efi_handle_t dev_handle = 0;
   grub_device_t dev = 0;
   grub_efi_device_path_t *dp = 0;
   grub_efi_loaded_image_t *loaded_image;
   char *filename;
+  grub_efi_handle_t dev_handle = 0;
 
   if (argc == 0)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
@@ -219,13 +220,29 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
     goto fail;
 
   if (dev->disk)
+    dev_handle = grub_efidisk_get_device_handle (dev->disk);
+  else if (dev->net && dev->net->server)
     {
-      dev_handle = grub_efidisk_get_device_handle (dev->disk);
-      if (dev_handle)
-       dp = grub_efi_get_device_path (dev_handle);
+      grub_net_network_level_address_t addr;
+      struct grub_net_network_level_interface *inf;
+      grub_net_network_level_address_t gateway;
+      grub_err_t err;
+
+      err = grub_net_resolve_address (dev->net->server, &addr);
+      if (err)
+       goto fail;
+
+      err = grub_net_route_address (addr, &gateway, &inf);
+      if (err)
+       goto fail;
+
+      dev_handle = grub_efinet_get_device_handle (inf->card);
     }
 
-  if (! dev->disk || ! dev_handle || ! dp)
+  if (dev_handle)
+    dp = grub_efi_get_device_path (dev_handle);
+
+  if (! dp)
     {
       grub_error (GRUB_ERR_BAD_DEVICE, "not a valid root device");
       goto fail;
index 14ab1bc2cd27fc4e31aafce0d61eef6d91344257..78a1eab16cf505844fef2c5b553a8dde686c9da3 100644 (file)
@@ -122,6 +122,13 @@ static struct grub_net_card_driver efidriver =
     .recv = get_card_packet
   };
 
+grub_efi_handle_t
+grub_efinet_get_device_handle (struct grub_net_card *card)
+{
+  if (!card || card->driver != &efidriver)
+    return 0;
+  return card->efi_handle;
+}
 
 static void
 grub_efinet_findcards (void)
index a1a28cd4ef38fae7c8ecdb5180aedcaea30ca0e1..e67d92b35fc1460872f390e80fbc16063feef931 100644 (file)
@@ -86,4 +86,9 @@ extern grub_efi_handle_t EXPORT_VAR(grub_efi_image_handle);
 
 extern int EXPORT_VAR(grub_efi_is_finished);
 
+struct grub_net_card;
+
+grub_efi_handle_t
+grub_efinet_get_device_handle (struct grub_net_card *card);
+
 #endif /* ! GRUB_EFI_EFI_HEADER */