]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Replace grub_module_iterate with FOR_MODULES.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 16 Oct 2011 13:23:29 +0000 (15:23 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 16 Oct 2011 13:23:29 +0000 (15:23 +0200)
* grub-core/disk/memdisk.c (GRUB_MOD_INIT): Switched to new interface.
* grub-core/kern/efi/efi.c (grub_arch_modules_addr): Renamed to...
(grub_efi_modules_addr): ...this.
* grub-core/kern/efi/init.c (grub_modbase): New variable.
(grub_efi_init): Set grub_modbase.
* grub-core/kern/emu/main.c (grub_arch_modules_addr): Removed.
(grub_modbase): New variable.
* grub-core/kern/i386/coreboot/init.c (grub_arch_modules_addr): Removed.
(grub_modbase): New variable.
(grub_machine_init): Set grub_modbase.
* grub-core/kern/i386/pc/init.c (grub_arch_modules_addr): Removed.
(grub_modbase): New variable.
(grub_machine_init): Set grub_modbase.
* grub-core/kern/ieee1275/init.c (grub_arch_modules_addr): Removed.
(grub_modbase): New variable.
(grub_machine_init): Set grub_modbase.
* grub-core/kern/main.c (grub_module_iterate): Remove.
(grub_modules_get_end): Use grub_modbase.
(grub_load_modules): Use FOR_MODULES.
(grub_load_config): Likewise.
* grub-core/kern/mips/arc/init.c (grub_arch_modules_addr): Removed.
(grub_modbase): New variable.
(grub_machine_init): Set grub_modbase.
* grub-core/kern/mips/loongson/init.c (grub_arch_modules_addr): Removed.
(grub_modbase): New variable.
(grub_machine_init): Set grub_modbase.
* grub-core/kern/mips/qemu_mips/init.c (grub_arch_modules_addr):
Removed.
(grub_modbase): New variable.
(grub_machine_init): Set grub_modbase.
* include/grub/efi/efi.h (grub_efi_modules_addr): New declaration.
* include/grub/kernel.h (grub_arch_modules_addr): Removed.
(grub_module_iterate): Likewise.
(grub_modbase): New variable declaration.
(FOR_MODULES): New macro.

14 files changed:
ChangeLog
grub-core/disk/memdisk.c
grub-core/kern/efi/efi.c
grub-core/kern/efi/init.c
grub-core/kern/emu/main.c
grub-core/kern/i386/coreboot/init.c
grub-core/kern/i386/pc/init.c
grub-core/kern/ieee1275/init.c
grub-core/kern/main.c
grub-core/kern/mips/arc/init.c
grub-core/kern/mips/loongson/init.c
grub-core/kern/mips/qemu_mips/init.c
include/grub/efi/efi.h
include/grub/kernel.h

index 0592459c3e28e0c2c3efe9358895d131dcbba81d..2ce132a1425b79d21422da1fa943174d2e8a43ac 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,43 @@
+2011-10-16  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Replace grub_module_iterate with FOR_MODULES.
+
+       * grub-core/disk/memdisk.c (GRUB_MOD_INIT): Switched to new interface.
+       * grub-core/kern/efi/efi.c (grub_arch_modules_addr): Renamed to...
+       (grub_efi_modules_addr): ...this.
+       * grub-core/kern/efi/init.c (grub_modbase): New variable.
+       (grub_efi_init): Set grub_modbase.
+       * grub-core/kern/emu/main.c (grub_arch_modules_addr): Removed.
+       (grub_modbase): New variable.
+       * grub-core/kern/i386/coreboot/init.c (grub_arch_modules_addr): Removed.
+       (grub_modbase): New variable.
+       (grub_machine_init): Set grub_modbase.
+       * grub-core/kern/i386/pc/init.c (grub_arch_modules_addr): Removed.
+       (grub_modbase): New variable.
+       (grub_machine_init): Set grub_modbase.
+       * grub-core/kern/ieee1275/init.c (grub_arch_modules_addr): Removed.
+       (grub_modbase): New variable.
+       (grub_machine_init): Set grub_modbase.
+       * grub-core/kern/main.c (grub_module_iterate): Remove.
+       (grub_modules_get_end): Use grub_modbase.
+       (grub_load_modules): Use FOR_MODULES.
+       (grub_load_config): Likewise.
+       * grub-core/kern/mips/arc/init.c (grub_arch_modules_addr): Removed.
+       (grub_modbase): New variable.
+       (grub_machine_init): Set grub_modbase.
+       * grub-core/kern/mips/loongson/init.c (grub_arch_modules_addr): Removed.
+       (grub_modbase): New variable.
+       (grub_machine_init): Set grub_modbase.
+       * grub-core/kern/mips/qemu_mips/init.c (grub_arch_modules_addr):
+       Removed.
+       (grub_modbase): New variable.
+       (grub_machine_init): Set grub_modbase.
+       * include/grub/efi/efi.h (grub_efi_modules_addr): New declaration.
+       * include/grub/kernel.h (grub_arch_modules_addr): Removed.
+       (grub_module_iterate): Likewise.
+       (grub_modbase): New variable declaration.
+       (FOR_MODULES): New macro.
+
 2011-10-16  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * configure.ac: Check for __ctzdi2 and __ctzsi2.
index ed570c6a0e7a738285164bde9caaf0e45c5dc334..4de0971ae10934ae25c4d4171098f1c191971922 100644 (file)
@@ -86,30 +86,24 @@ static struct grub_disk_dev grub_memdisk_dev =
 
 GRUB_MOD_INIT(memdisk)
 {
-  auto int hook (struct grub_module_header *);
-  int hook (struct grub_module_header *header)
-    {
-      if (header->type == OBJ_TYPE_MEMDISK)
-       {
-         char *memdisk_orig_addr;
-         memdisk_orig_addr = (char *) header + sizeof (struct grub_module_header);
+  struct grub_module_header *header;
+  FOR_MODULES (header)
+    if (header->type == OBJ_TYPE_MEMDISK)
+      {
+       char *memdisk_orig_addr;
+       memdisk_orig_addr = (char *) header + sizeof (struct grub_module_header);
 
-         grub_dprintf ("memdisk", "Found memdisk image at %p\n", memdisk_orig_addr);
+       grub_dprintf ("memdisk", "Found memdisk image at %p\n", memdisk_orig_addr);
 
-         memdisk_size = header->size - sizeof (struct grub_module_header);
-         memdisk_addr = grub_malloc (memdisk_size);
+       memdisk_size = header->size - sizeof (struct grub_module_header);
+       memdisk_addr = grub_malloc (memdisk_size);
 
-         grub_dprintf ("memdisk", "Copying memdisk image to dynamic memory\n");
-         grub_memmove (memdisk_addr, memdisk_orig_addr, memdisk_size);
+       grub_dprintf ("memdisk", "Copying memdisk image to dynamic memory\n");
+       grub_memmove (memdisk_addr, memdisk_orig_addr, memdisk_size);
 
-         grub_disk_dev_register (&grub_memdisk_dev);
-         return 1;
-       }
-
-      return 0;
-    }
-
-  grub_module_iterate (hook);
+       grub_disk_dev_register (&grub_memdisk_dev);
+       break;
+      }
 }
 
 GRUB_MOD_FINI(memdisk)
index d0994a940671abc708b44f19967b4022c6188219..e27dd1ad05ea8f4565d1658016ec262678e3a4c8 100644 (file)
@@ -218,7 +218,7 @@ grub_get_rtc (void)
 /* Search the mods section from the PE32/PE32+ image. This code uses
    a PE32 header, but should work with PE32+ as well.  */
 grub_addr_t
-grub_arch_modules_addr (void)
+grub_efi_modules_addr (void)
 {
   grub_efi_loaded_image_t *image;
   struct grub_pe32_header *header;
index 4dfb06284464bb590f54a0ad246b363f860c311f..942ab0256b948b65736d5858e36d52fa97044d5d 100644 (file)
 #include <grub/mm.h>
 #include <grub/kernel.h>
 
+grub_addr_t grub_modbase;
+
 void
 grub_efi_init (void)
 {
+  grub_modbase = grub_efi_modules_addr ();
   /* First of all, initialize the console so that GRUB can display
      messages.  */
   grub_console_init ();
index 9a58acd9eb155aad1b50b0152c64f7073d498c77..d5c09ad47e6c2bd70e99c7c8401548ce6bc8978d 100644 (file)
@@ -53,11 +53,7 @@ static char *root_dev = NULL, *dir = NULL;
 
 int grub_no_autoload;
 
-grub_addr_t
-grub_arch_modules_addr (void)
-{
-  return 0;
-}
+grub_addr_t grub_modbase = 0;
 
 void
 grub_reboot (void)
index ebbea25232a3dbdfa6429ea1ab52e5b7525fd00e..b7510ff98b5d6fcb55b8e0e60c86c3fb69ba03bc 100644 (file)
@@ -56,10 +56,18 @@ grub_exit (void)
     grub_cpu_idle ();
 }
 
+#ifdef GRUB_MACHINE_QEMU
+grub_addr_t grub_modbase;
+#else
+grub_addr_t grub_modbase = ALIGN_UP((grub_addr_t) _end, GRUB_KERNEL_MACHINE_MOD_ALIGN);
+#endif
+
 void
 grub_machine_init (void)
 {
 #ifdef GRUB_MACHINE_QEMU
+  grub_modbase = grub_core_entry_addr + grub_kernel_image_size;
+
   grub_qemu_init_cirrus ();
 #endif
   /* Initialize the console as early as possible.  */
@@ -118,14 +126,3 @@ grub_machine_fini (void)
   grub_vga_text_fini ();
   grub_stop_floppy ();
 }
-
-/* Return the end of the core image.  */
-grub_addr_t
-grub_arch_modules_addr (void)
-{
-#ifdef GRUB_MACHINE_QEMU
-  return grub_core_entry_addr + grub_kernel_image_size;
-#else
-  return ALIGN_UP((grub_addr_t) _end, GRUB_KERNEL_MACHINE_MOD_ALIGN);
-#endif
-}
index 24fe8fed9440f5acb45baab0bd631a765917cb3f..62269de781200aef86cf0afa07b7b4fce1e061ce 100644 (file)
@@ -129,6 +129,8 @@ compact_mem_regions (void)
       }
 }
 
+grub_addr_t grub_modbase;
+
 void
 grub_machine_init (void)
 {
@@ -137,6 +139,9 @@ grub_machine_init (void)
   int grub_lower_mem;
 #endif
 
+  grub_modbase = GRUB_MEMORY_MACHINE_DECOMPRESSION_ADDR
+    + (grub_kernel_image_size - GRUB_KERNEL_MACHINE_RAW_SIZE);
+
   /* Initialize the console as early as possible.  */
   grub_console_init ();
 
@@ -206,11 +211,3 @@ grub_machine_fini (void)
   grub_console_fini ();
   grub_stop_floppy ();
 }
-
-/* Return the end of the core image.  */
-grub_addr_t
-grub_arch_modules_addr (void)
-{
-  return GRUB_MEMORY_MACHINE_DECOMPRESSION_ADDR
-    + (grub_kernel_image_size - GRUB_KERNEL_MACHINE_RAW_SIZE);
-}
index 81b06c88e41f9061f79f1c4e5120f6462466dd8c..76f932d099d2c2be15d0a10668645d893c93e393 100644 (file)
@@ -256,9 +256,14 @@ grub_parse_cmdline (void)
 
 static grub_uint64_t ieee1275_get_time_ms (void);
 
+grub_addr_t grub_modbase;
+
 void
 grub_machine_init (void)
 {
+  grub_modbase = ALIGN_UP((grub_addr_t) _end 
+                         + GRUB_KERNEL_MACHINE_MOD_GAP,
+                         GRUB_KERNEL_MACHINE_MOD_ALIGN);
   grub_ieee1275_init ();
 
   grub_console_init_early ();
@@ -293,9 +298,3 @@ grub_get_rtc (void)
 {
   return ieee1275_get_time_ms ();
 }
-
-grub_addr_t
-grub_arch_modules_addr (void)
-{
-  return ALIGN_UP((grub_addr_t) _end + GRUB_KERNEL_MACHINE_MOD_GAP, GRUB_KERNEL_MACHINE_MOD_ALIGN);
-}
index 0cec93d89240c3299a7e807dcf58b82e4a82f721..9e1971773d1527f986e085e9431ebca4db332144 100644 (file)
 #include <grub/reader.h>
 #include <grub/parser.h>
 
-void
-grub_module_iterate (int (*hook) (struct grub_module_header *header))
-{
-  struct grub_module_info *modinfo;
-  struct grub_module_header *header;
-  grub_addr_t modbase;
-
-  modbase = grub_arch_modules_addr ();
-  modinfo = (struct grub_module_info *) modbase;
-
-  /* Check if there are any modules.  */
-  if ((modinfo == 0) || modinfo->magic != GRUB_MODULE_MAGIC)
-    return;
-
-  for (header = (struct grub_module_header *) (modbase + modinfo->offset);
-       header < (struct grub_module_header *) (modbase + modinfo->size);
-       header = (struct grub_module_header *) ((char *) header + header->size))
-    {
-      if (hook (header))
-       break;
-    }
-}
-
 /* This is actualy platform-independant but used only on loongson and sparc.  */
 #if defined (GRUB_MACHINE_MIPS_LOONGSON) || defined (GRUB_MACHINE_MIPS_QEMU_MIPS) || defined (GRUB_MACHINE_SPARC64)
 grub_addr_t
 grub_modules_get_end (void)
 {
   struct grub_module_info *modinfo;
-  grub_addr_t modbase;
 
-  modbase = grub_arch_modules_addr ();
-  modinfo = (struct grub_module_info *) modbase;
+  modinfo = (struct grub_module_info *) grub_modbase;
 
   /* Check if there are any modules.  */
   if ((modinfo == 0) || modinfo->magic != GRUB_MODULE_MAGIC)
-    return modbase;
+    return grub_modbase;
 
-  return modbase + modinfo->size;
+  return grub_modbase + modinfo->size;
 }
 #endif
 
@@ -76,42 +51,36 @@ grub_modules_get_end (void)
 static void
 grub_load_modules (void)
 {
-  auto int hook (struct grub_module_header *);
-  int hook (struct grub_module_header *header)
-    {
-      /* Not an ELF module, skip.  */
-      if (header->type != OBJ_TYPE_ELF)
-        return 0;
-
-      if (! grub_dl_load_core ((char *) header + sizeof (struct grub_module_header),
-                              (header->size - sizeof (struct grub_module_header))))
-       grub_fatal ("%s", grub_errmsg);
+  struct grub_module_header *header;
+  FOR_MODULES (header)
+  {
+    /* Not an ELF module, skip.  */
+    if (header->type != OBJ_TYPE_ELF)
+      continue;
 
-      if (grub_errno)
-       grub_print_error ();
+    if (! grub_dl_load_core ((char *) header + sizeof (struct grub_module_header),
+                            (header->size - sizeof (struct grub_module_header))))
+      grub_fatal ("%s", grub_errmsg);
 
-      return 0;
-    }
-
-  grub_module_iterate (hook);
+    if (grub_errno)
+      grub_print_error ();
+  }
 }
 
 static void
 grub_load_config (void)
 {
-  auto int hook (struct grub_module_header *);
-  int hook (struct grub_module_header *header)
-    {
-      /* Not an embedded config, skip.  */
-      if (header->type != OBJ_TYPE_CONFIG)
-       return 0;
-
-      grub_parser_execute ((char *) header +
-                          sizeof (struct grub_module_header));
-      return 1;
-    }
-
-  grub_module_iterate (hook);
+  struct grub_module_header *header;
+  FOR_MODULES (header)
+  {
+    /* Not an embedded config, skip.  */
+    if (header->type != OBJ_TYPE_CONFIG)
+      continue;
+    
+    grub_parser_execute ((char *) header +
+                        sizeof (struct grub_module_header));
+    break;
+  }
 }
 
 /* Write hook for the environment variables of root. Remove surrounding
index 514b481f6338b122700600eb0c6030e8066639bd..2e25335cab65d55e78da1ee359adb82abba330df 100644 (file)
@@ -125,12 +125,14 @@ grub_machine_mmap_iterate (grub_memory_hook_t hook)
 }
 
 extern grub_uint32_t grub_total_modules_size;
+grub_addr_t grub_modbase;
 
 void
 grub_machine_init (void)
 {
   struct grub_arc_memory_descriptor *cur = NULL;
 
+  grub_modbase = GRUB_KERNEL_MIPS_ARC_LINK_ADDR - grub_total_modules_size;
   grub_console_init_early ();
 
   /* FIXME: measure this.  */
@@ -164,12 +166,6 @@ grub_machine_init (void)
   grub_arcdisk_init ();
 }
 
-grub_addr_t
-grub_arch_modules_addr (void)
-{
-  return GRUB_KERNEL_MIPS_ARC_LINK_ADDR - grub_total_modules_size;
-}
-
 void
 grub_machine_fini (void)
 {
index 2d1a0653e4a2de50252c439bd21beefb654e76a6..8acfb0767a8b9bea32e0045bd8391c684cf3f4ef 100644 (file)
@@ -298,9 +298,5 @@ grub_reboot (void)
 }
 
 extern char _end[];
+grub_addr_t grub_modbase = (grub_addr_t) _end;
 
-grub_addr_t
-grub_arch_modules_addr (void)
-{
-  return (grub_addr_t) _end;
-}
index db9cc796ae63db232cd8f6f6663b0337c657d591..4921c42bf6394e98b1990517c9791447c5d981bb 100644 (file)
@@ -113,9 +113,5 @@ grub_machine_mmap_iterate (grub_memory_hook_t hook)
 }
 
 extern char _end[];
+grub_addr_t grub_modbase = (grub_addr_t) _end;
 
-grub_addr_t
-grub_arch_modules_addr (void)
-{
-  return (grub_addr_t) _end;
-}
index e98f99507378a6df1cd9263e85a4652aa4818a1d..7ecda58abb6d860cad5da8aadb31975b6e8675e8 100644 (file)
@@ -70,6 +70,8 @@ extern void (*EXPORT_VAR(grub_efi_net_config)) (grub_efi_handle_t hnd,
                                                char **device,
                                                char **path);
 
+grub_addr_t grub_efi_modules_addr (void);
+
 void grub_efi_mm_init (void);
 void grub_efi_mm_fini (void);
 void grub_efi_init (void);
index aef58566875d69c799fe18e1d68a4f10859d57bc..d8c0fed33795a2a413425e04c8716cacc99d95d1 100644 (file)
@@ -68,9 +68,15 @@ struct grub_module_info64
 #define grub_module_info grub_module_info32
 #endif
 
-extern grub_addr_t grub_arch_modules_addr (void);
-
-extern void EXPORT_FUNC(grub_module_iterate) (int (*hook) (struct grub_module_header *));
+extern grub_addr_t EXPORT_VAR (grub_modbase);
+
+#define FOR_MODULES(var)  for (\
+  var = grub_modbase ? (struct grub_module_header *) \
+    (grub_modbase + (((struct grub_module_info *) grub_modbase)->offset)) : 0;\
+  var && (grub_addr_t) var \
+    < (grub_modbase + (((struct grub_module_info *) grub_modbase)->size));    \
+  var = (struct grub_module_header *)                                  \
+    ((char *) var + ((struct grub_module_header *) var)->size))
 
 grub_addr_t grub_modules_get_end (void);