From f970b55e43a289788b48c9ef715224446a9b6913 Mon Sep 17 00:00:00 2001 From: robertmh Date: Mon, 21 Jan 2008 14:37:25 +0000 Subject: [PATCH] 2008-01-21 Robert Millan * disk/memdisk.c (memdisk_size): New variable. (grub_memdisk_open): Replace grub_arch_memdisk_size() call with `memdisk_size'. (grub_memdisk_init): Initialize `memdisk_size'. Reallocate memdisk image to dynamic memory. (grub_memdisk_fini): Replace grub_arch_memdisk_size() call with `memdisk_size'. Free memdisk block. --- ChangeLog | 10 ++++++++++ disk/memdisk.c | 23 ++++++++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 31c349e8f..46aa97dd2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-01-21 Robert Millan + + * disk/memdisk.c (memdisk_size): New variable. + (grub_memdisk_open): Replace grub_arch_memdisk_size() call with + `memdisk_size'. + (grub_memdisk_init): Initialize `memdisk_size'. Reallocate memdisk + image to dynamic memory. + (grub_memdisk_fini): Replace grub_arch_memdisk_size() call with + `memdisk_size'. Free memdisk block. + 2008-01-21 Robert Millan Fix detection of very small filesystems (like tar). diff --git a/disk/memdisk.c b/disk/memdisk.c index 23b3322d4..ccc22adc5 100644 --- a/disk/memdisk.c +++ b/disk/memdisk.c @@ -1,7 +1,7 @@ /* memdisk.c - Access embedded memory disk. */ /* * GRUB -- GRand Unified Bootloader - * Copyright (C) 2007 Free Software Foundation, Inc. + * Copyright (C) 2007,2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ #include static grub_addr_t memdisk_addr; +static grub_off_t memdisk_size = 0; static int grub_memdisk_iterate (int (*hook) (const char *name)) @@ -38,7 +39,7 @@ grub_memdisk_open (const char *name, grub_disk_t disk) if (grub_strcmp (name, "memdisk")) return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a memdisk"); - disk->total_sectors = grub_arch_memdisk_size () / GRUB_DISK_SECTOR_SIZE; + disk->total_sectors = memdisk_size / GRUB_DISK_SECTOR_SIZE; disk->id = (int) 'mdsk'; disk->has_partitions = 0; @@ -80,15 +81,27 @@ static struct grub_disk_dev grub_memdisk_dev = GRUB_MOD_INIT(memdisk) { - if (! grub_arch_memdisk_size ()) + grub_addr_t memdisk_orig_addr; + + memdisk_size = grub_arch_memdisk_size (); + if (! memdisk_size) return; - memdisk_addr = grub_arch_memdisk_addr (); + + memdisk_orig_addr = grub_arch_memdisk_addr (); + grub_dprintf ("memdisk", "Found memdisk image at %p\n", memdisk_orig_addr); + + 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_disk_dev_register (&grub_memdisk_dev); } GRUB_MOD_FINI(memdisk) { - if (! grub_arch_memdisk_size ()) + if (! memdisk_size) return; + grub_free (memdisk_addr); grub_disk_dev_unregister (&grub_memdisk_dev); }