[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: embedding filesystems in core image (Re: moving ata initialisation t
From: |
Marco Gerards |
Subject: |
Re: embedding filesystems in core image (Re: moving ata initialisation to a command) |
Date: |
Wed, 16 Jan 2008 21:10:30 +0100 |
User-agent: |
Gnus/5.110006 (No Gnus v0.6) Emacs/21.4 (gnu/linux) |
Robert Millan <address@hidden> writes:
> On Sat, Dec 22, 2007 at 01:24:53PM +0100, Yoshinori K. Okuji wrote:
>> On Saturday 22 December 2007 13:18, Robert Millan wrote:
>> > Here's a new patch, with some cleanup. The main difference is that
>> > memdisk.c doesn't include any arch-specific code.
>>
>> You forgot to attach it. :)
>
> Oops. Here it is.
Hopefully this is the newest version? You forgot the changelog entry.
Some comments below, otherwise it is fine :-)
--
Marco
> diff -x '*.mk' -Nurp grub2/conf/i386-pc.rmk grub2.memdisk/conf/i386-pc.rmk
> --- grub2/conf/i386-pc.rmk 2007-12-21 12:41:23.000000000 +0100
> +++ grub2.memdisk/conf/i386-pc.rmk 2007-12-21 21:47:57.000000000 +0100
> @@ -39,7 +39,7 @@ kernel_img_HEADERS = arg.h boot.h cache.
> env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
> partition.h pc_partition.h rescue.h symbol.h term.h time.h types.h \
> machine/biosdisk.h machine/boot.h machine/console.h machine/init.h \
> - machine/memory.h machine/loader.h machine/vga.h machine/vbe.h
> + machine/memory.h machine/loader.h machine/vga.h machine/vbe.h
> machine/kernel.h
> kernel_img_CFLAGS = $(COMMON_CFLAGS)
> kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
> kernel_img_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-Ttext,8200 $(COMMON_CFLAGS)
> @@ -136,7 +136,7 @@ pkgdata_MODULES = biosdisk.mod _chain.mo
> _multiboot.mod chain.mod multiboot.mod reboot.mod halt.mod \
> vbe.mod vbetest.mod vbeinfo.mod video.mod gfxterm.mod \
> videotest.mod play.mod bitmap.mod tga.mod cpuid.mod serial.mod ata.mod \
> - vga.mod
> + vga.mod memdisk.mod
>
> # For biosdisk.mod.
> biosdisk_mod_SOURCES = disk/i386/pc/biosdisk.c
> @@ -263,4 +263,9 @@ vga_mod_SOURCES = term/i386/pc/vga.c
> vga_mod_CFLAGS = $(COMMON_CFLAGS)
> vga_mod_LDFLAGS = $(COMMON_LDFLAGS)
>
> +# For memdisk.mod.
> +memdisk_mod_SOURCES = disk/memdisk.c
> +memdisk_mod_CFLAGS = $(COMMON_CFLAGS)
> +memdisk_mod_LDFLAGS = $(COMMON_LDFLAGS)
> +
> include $(srcdir)/conf/common.mk
> diff -x '*.mk' -Nurp grub2/disk/memdisk.c grub2.memdisk/disk/memdisk.c
> --- grub2/disk/memdisk.c 1970-01-01 01:00:00.000000000 +0100
> +++ grub2.memdisk/disk/memdisk.c 2007-12-22 13:00:19.000000000 +0100
> @@ -0,0 +1,94 @@
> +/* memdisk.c - Access embedded memory disk. */
> +/*
> + * GRUB -- GRand Unified Bootloader
> + * Copyright (C) 2007 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
> + * the Free Software Foundation, either version 3 of the License, or
> + * (at your option) any later version.
> + *
> + * GRUB is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <grub/disk.h>
> +#include <grub/dl.h>
> +#include <grub/kernel.h>
> +#include <grub/misc.h>
> +#include <grub/mm.h>
> +#include <grub/types.h>
> +
> +static grub_addr_t memdisk_addr;
> +
> +static int
> +grub_memdisk_iterate (int (*hook) (const char *name))
> +{
> + return hook ("memdisk");
> +}
> +
> +static grub_err_t
> +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->id = (int) 'mdsk';
> + disk->has_partitions = 0;
> +
> + return GRUB_ERR_NONE;
> +}
> +
> +static void
> +grub_memdisk_close (grub_disk_t disk __attribute((unused)))
> +{
> +}
> +
> +static grub_err_t
> +grub_memdisk_read (grub_disk_t disk __attribute((unused)), grub_disk_addr_t
> sector,
> + grub_size_t size, char *buf)
> +{
> + grub_memcpy (buf, memdisk_addr + (sector << GRUB_DISK_SECTOR_BITS), size
> << GRUB_DISK_SECTOR_BITS);
> + return 0;
> +}
> +
> +static grub_err_t
> +grub_memdisk_write (grub_disk_t disk __attribute((unused)), grub_disk_addr_t
> sector,
> + grub_size_t size, const char *buf)
> +{
> + grub_memcpy (memdisk_addr + (sector << GRUB_DISK_SECTOR_BITS), buf, size
> << GRUB_DISK_SECTOR_BITS);
> + return 0;
> +}
> +
> +static struct grub_disk_dev grub_memdisk_dev =
> + {
> + .name = "memdisk",
> + .id = GRUB_DISK_DEVICE_MEMDISK_ID,
> + .iterate = grub_memdisk_iterate,
> + .open = grub_memdisk_open,
> + .close = grub_memdisk_close,
> + .read = grub_memdisk_read,
> + .write = grub_memdisk_write,
> + .next = 0
> + };
> +
> +GRUB_MOD_INIT(memdisk)
> +{
> + if (! grub_arch_memdisk_size ())
> + return;
> + memdisk_addr = grub_arch_memdisk_addr ();
> + grub_disk_dev_register (&grub_memdisk_dev);
> +}
> +
> +GRUB_MOD_FINI(memdisk)
> +{
> + if (! grub_arch_memdisk_size ())
> + return;
> + grub_disk_dev_unregister (&grub_memdisk_dev);
> +}
> diff -x '*.mk' -Nurp grub2/include/grub/disk.h
> grub2.memdisk/include/grub/disk.h
> --- grub2/include/grub/disk.h 2007-11-05 17:15:26.000000000 +0100
> +++ grub2.memdisk/include/grub/disk.h 2007-12-21 17:47:06.000000000 +0100
> @@ -35,7 +35,8 @@ enum grub_disk_dev_id
> GRUB_DISK_DEVICE_RAID_ID,
> GRUB_DISK_DEVICE_LVM_ID,
> GRUB_DISK_DEVICE_HOST_ID,
> - GRUB_DISK_DEVICE_ATA_ID
> + GRUB_DISK_DEVICE_ATA_ID,
> + GRUB_DISK_DEVICE_MEMDISK_ID,
> };
>
> struct grub_disk;
> diff -x '*.mk' -Nurp grub2/include/grub/i386/pc/kernel.h
> grub2.memdisk/include/grub/i386/pc/kernel.h
> --- grub2/include/grub/i386/pc/kernel.h 2007-07-22 01:32:23.000000000
> +0200
> +++ grub2.memdisk/include/grub/i386/pc/kernel.h 2007-12-22
> 13:10:17.000000000 +0100
> @@ -34,8 +34,11 @@
> /* The offset of GRUB_INSTALL_BSD_PART. */
> #define GRUB_KERNEL_MACHINE_INSTALL_BSD_PART 0x18
>
> +/* The offset of GRUB_MEMDISK_IMAGE_SIZE. */
> +#define GRUB_KERNEL_MACHINE_MEMDISK_IMAGE_SIZE 0x1c
> +
> /* The offset of GRUB_PREFIX. */
> -#define GRUB_KERNEL_MACHINE_PREFIX 0x1c
> +#define GRUB_KERNEL_MACHINE_PREFIX 0x20
>
> /* End of the data section. */
> #define GRUB_KERNEL_MACHINE_DATA_END 0x50
> @@ -47,12 +50,21 @@
>
> #include <grub/types.h>
>
> +/* The size of kernel image. */
> +extern grub_int32_t grub_kernel_image_size;
> +
> +/* The total size of module images following the kernel. */
> +extern grub_int32_t grub_total_module_size;
> +
> /* The DOS partition number of the installed partition. */
> extern grub_int32_t grub_install_dos_part;
>
> /* The BSD partition number of the installed partition. */
> extern grub_int32_t grub_install_bsd_part;
>
> +/* The size of memory disk image, if present. */
> +extern grub_int32_t grub_memdisk_image_size;
> +
> /* The prefix which points to the directory where GRUB modules and its
> configuration file are located. */
> extern char grub_prefix[];
> diff -x '*.mk' -Nurp grub2/include/grub/kernel.h
> grub2.memdisk/include/grub/kernel.h
> --- grub2/include/grub/kernel.h 2007-07-22 01:32:21.000000000 +0200
> +++ grub2.memdisk/include/grub/kernel.h 2007-12-22 12:54:18.000000000
> +0100
> @@ -20,6 +20,7 @@
> #define GRUB_KERNEL_HEADER 1
>
> #include <grub/types.h>
> +#include <grub/symbol.h>
>
> /* The module header. */
> struct grub_module_header
> @@ -44,6 +45,8 @@ struct grub_module_info
> };
>
> extern grub_addr_t grub_arch_modules_addr (void);
> +extern grub_addr_t EXPORT_FUNC(grub_arch_memdisk_addr) (void);
> +extern grub_off_t EXPORT_FUNC(grub_arch_memdisk_size) (void);
>
> /* The start point of the C code. */
> void grub_main (void);
> diff -x '*.mk' -Nurp grub2/kern/i386/pc/init.c
> grub2.memdisk/kern/i386/pc/init.c
> --- grub2/kern/i386/pc/init.c 2007-10-22 22:05:27.000000000 +0200
> +++ grub2.memdisk/kern/i386/pc/init.c 2007-12-22 13:07:00.000000000 +0100
> @@ -229,7 +229,7 @@ grub_machine_init (void)
> }
> else
> grub_mm_init_region ((void *) mem_regions[i].addr,
> mem_regions[i].size);
> -
> +
Please be careful with whitespaces...
> if (! grub_os_area_addr)
> grub_fatal ("no upper memory");
> }
> @@ -253,3 +253,17 @@ grub_arch_modules_addr (void)
> {
> return grub_end_addr;
> }
> +
> +/* Return the start of the memdisk image. */
> +grub_addr_t
> +grub_arch_memdisk_addr (void)
> +{
> + return 0x100000 + (grub_kernel_image_size - GRUB_KERNEL_MACHINE_RAW_SIZE)
> + grub_total_module_size;
This line seems way too long.
Isn't there some macro for 0x100000?
> +}
> +
> +/* Return the size of the memdisk image. */
> +grub_off_t
> +grub_arch_memdisk_size (void)
> +{
> + return grub_memdisk_image_size;
> +}
> diff -x '*.mk' -Nurp grub2/kern/i386/pc/startup.S
> grub2.memdisk/kern/i386/pc/startup.S
> --- grub2/kern/i386/pc/startup.S 2007-10-22 22:14:45.000000000 +0200
> +++ grub2.memdisk/kern/i386/pc/startup.S 2007-12-21 17:53:01.000000000
> +0100
> @@ -95,6 +95,8 @@ VARIABLE(grub_install_dos_part)
> .long 0xFFFFFFFF
> VARIABLE(grub_install_bsd_part)
> .long 0xFFFFFFFF
> +VARIABLE(grub_memdisk_image_size)
> + .long 0
> VARIABLE(grub_prefix)
> /* to be filled by grub-mkimage */
>
> diff -x '*.mk' -Nurp grub2/util/i386/pc/grub-mkimage.c
> grub2.memdisk/util/i386/pc/grub-mkimage.c
> --- grub2/util/i386/pc/grub-mkimage.c 2007-07-22 01:32:32.000000000 +0200
> +++ grub2.memdisk/util/i386/pc/grub-mkimage.c 2007-12-21 21:46:35.000000000
> +0100
> @@ -25,6 +25,7 @@
> #include <grub/disk.h>
> #include <grub/util/misc.h>
> #include <grub/util/resolve.h>
> +#include <grub/misc.h>
>
> #include <stdio.h>
> #include <unistd.h>
> @@ -75,11 +76,11 @@ compress_kernel (char *kernel_img, size_
> }
>
> static void
> -generate_image (const char *dir, char *prefix, FILE *out, char *mods[])
> +generate_image (const char *dir, char *prefix, FILE *out, char *mods[], char
> *memdisk_path)
> {
> grub_addr_t module_addr = 0;
> char *kernel_img, *boot_img, *core_img;
> - size_t kernel_size, boot_size, total_module_size, core_size;
> + size_t kernel_size, boot_size, total_module_size, core_size, memdisk_size
> = 0;
> char *kernel_path, *boot_path;
> unsigned num;
> size_t offset;
> @@ -98,7 +99,13 @@ generate_image (const char *dir, char *p
>
> grub_util_info ("the total module size is 0x%x", total_module_size);
>
> - kernel_img = xmalloc (kernel_size + total_module_size);
> + if (memdisk_path)
> + {
> + memdisk_size = ALIGN_UP(grub_util_get_image_size (memdisk_path), 512);
> + grub_util_info ("the size of memory disk is 0x%x", memdisk_size);
> + }
> +
> + kernel_img = xmalloc (kernel_size + total_module_size + memdisk_size);
> grub_util_load_image (kernel_path, kernel_img);
>
> if (GRUB_KERNEL_MACHINE_PREFIX + strlen (prefix) + 1 >
> GRUB_KERNEL_MACHINE_DATA_END)
> @@ -122,13 +129,19 @@ generate_image (const char *dir, char *p
> header = (struct grub_module_header *) (kernel_img + offset);
> header->offset = grub_cpu_to_le32 (sizeof (*header));
> header->size = grub_cpu_to_le32 (mod_size + sizeof (*header));
> -
> - grub_util_load_image (p->name, kernel_img + offset + sizeof (*header));
> + offset += sizeof (*header);
> +
> + grub_util_load_image (p->name, kernel_img + offset);
> + offset += mod_size;
> + }
>
> - offset += sizeof (*header) + mod_size;
> + if (memdisk_path)
> + {
> + grub_util_load_image (memdisk_path, kernel_img + offset);
> + offset += memdisk_size;
> }
>
> - compress_kernel (kernel_img, kernel_size + total_module_size,
> + compress_kernel (kernel_img, kernel_size + total_module_size +
> memdisk_size,
> &core_img, &core_size);
>
> grub_util_info ("the core size is 0x%x", core_size);
> @@ -163,6 +176,8 @@ generate_image (const char *dir, char *p
> = grub_cpu_to_le32 (total_module_size);
> *((grub_uint32_t *) (core_img + GRUB_KERNEL_MACHINE_KERNEL_IMAGE_SIZE))
> = grub_cpu_to_le32 (kernel_size);
> + *((grub_uint32_t *) (core_img + GRUB_KERNEL_MACHINE_MEMDISK_IMAGE_SIZE))
> + = grub_cpu_to_le32 (memdisk_size);
> *((grub_uint32_t *) (core_img + GRUB_KERNEL_MACHINE_COMPRESSED_SIZE))
> = grub_cpu_to_le32 (core_size - GRUB_KERNEL_MACHINE_RAW_SIZE);
>
> @@ -186,6 +201,7 @@ static struct option options[] =
> {
> {"directory", required_argument, 0, 'd'},
> {"prefix", required_argument, 0, 'p'},
> + {"memdisk", required_argument, 0, 'm'},
> {"output", required_argument, 0, 'o'},
> {"help", no_argument, 0, 'h'},
> {"version", no_argument, 0, 'V'},
> @@ -206,6 +222,7 @@ Make a bootable image of GRUB.\n\
> \n\
> -d, --directory=DIR use images and modules under DIR [default=%s]\n\
> -p, --prefix=DIR set grub_prefix directory [default=%s]\n\
> + -m, --memdisk=FILE embed FILE as a memdisk image\n\
> -o, --output=FILE output a generated image to FILE
> [default=stdout]\n\
> -h, --help display this message and exit\n\
> -V, --version print version information and exit\n\
> @@ -223,13 +240,14 @@ main (int argc, char *argv[])
> char *output = NULL;
> char *dir = NULL;
> char *prefix = NULL;
> + char *memdisk = NULL;
> FILE *fp = stdout;
>
> progname = "grub-mkimage";
>
> while (1)
> {
> - int c = getopt_long (argc, argv, "d:p:o:hVv", options, 0);
> + int c = getopt_long (argc, argv, "d:p:m:o:hVv", options, 0);
>
> if (c == -1)
> break;
> @@ -250,6 +268,13 @@ main (int argc, char *argv[])
> dir = xstrdup (optarg);
> break;
>
> + case 'm':
> + if (memdisk)
> + free (memdisk);
> +
> + memdisk = xstrdup (optarg);
> + break;
> +
> case 'h':
> usage (0);
> break;
> @@ -282,7 +307,7 @@ main (int argc, char *argv[])
> grub_util_error ("cannot open %s", output);
> }
>
> - generate_image (dir ? : GRUB_LIBDIR, prefix ? : DEFAULT_DIRECTORY, fp,
> argv + optind);
> + generate_image (dir ? : GRUB_LIBDIR, prefix ? : DEFAULT_DIRECTORY, fp,
> argv + optind, memdisk);
>
> fclose (fp);
>
> _______________________________________________
> Grub-devel mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/grub-devel