* 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>
+
+ 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.
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)
/* 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;
#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 ();
int grub_no_autoload;
-grub_addr_t
-grub_arch_modules_addr (void)
-{
- return 0;
-}
+grub_addr_t grub_modbase = 0;
void
grub_reboot (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. */
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
-}
}
}
+grub_addr_t grub_modbase;
+
void
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 ();
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);
-}
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 ();
{
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);
-}
#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
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
}
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. */
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)
{
}
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;
-}
}
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;
-}
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);
#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);