[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Partition modules
From: |
Marco Gerards |
Subject: |
Re: Partition modules |
Date: |
Wed, 24 Nov 2004 19:15:35 +0000 |
User-agent: |
Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux) |
Marco Gerards <address@hidden> writes:
> Here is a patch to modulize partition support. At the moment it will
> create pc.mod, amiga.mod and apple.mod. Loading one of these modules
> will give support for that specific partition map.
And here is version 2 of the patch. I have made the requested
changes.
The grub_partition structure was split up. I've added a member `data'
so per partition map type additional information can be added. This
is used in biosdisk.c and in grub-setup.c, for example. Although I
have tested this patch as much as I can, the grub-setup changes were
not tested. I've just added a test to check if the right partition
map type is used and the installer fails if this is not the case.
Can I check in this patch?
Thanks,
Marco
2004-11-24 Marco Gerards <address@hidden>
* commands/ls.c: Include <grub/partition.h> instead of
<grub/machine/partition.h>.
* kern/disk.c: Likewise.
* kern/rescue.c: Likewise.
* loader/i386/pc/chainloader.c: Likewise.
* normal/cmdline.c: Likewise.
* kern/powerpc/ieee1275/init.c: Likewise.
(grub_machine_init): Call `grub_pc_partition_map_init',
`grub_amiga_partition_map_init' and
`grub_apple_partition_map_init'.
* conf/i386-pc.rmk (kernel_img_SOURCES): Remove
`disk/i386/pc/partition.c'. Add `kern/partition.c'.
(kernel_img_HEADERS): Remove `machine/partition.h'. Add
`partition.h' and `pc_partition.h'.
(grub_setup_SOURCES): Remove
`disk/i386/pc/partition.c'. Add `kern/partition.c',
`partmap/amiga.c', `partmap/apple.c' and `partmap/pc.c'.
(grub_emu_SOURCES): Likewise.
(pkgdata_MODULES): Add `amiga.mod', `apple.mod' and `pc.mod'.
(amiga_mod_SOURCES, amiga_mod_CFLAGS, apple_mod_SOURCES)
(apple_mod_CFLAGS, pc_mod_SOURCES, pc_mod_CFLAGS): New variables.
* conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Remove
`disk/powerpc/ieee1275/partition.c'. Add `kern/partition.c',
`partmap/amiga.c', `partmap/apple.c' and `partmap/pc.c'.
(grubof_SOURCES): Likewise.
* disk/i386/pc/partition.c: Removed.
* disk/powerpc/ieee1275/partition.c: Likewise.
* include/grub/partition.h: Removed.
* include/grub/pc_partition.h: Likewise.
* include/grub/powerpc/ieee1275/partition.h: Likewise.
* kern/partition.c: New file.
* partmap/amiga.c: Likewise.
* partmap/apple.c: Likewise.
* partmap/pc.c: Likewise.
* util/grub-emu.c: Include <grub/partition.h> instead of
<grub/machine/partition.h>.
(main): Call `grub_pc_partition_map_init',
`grub_amiga_partition_map_init' and
`grub_apple_partition_map_init' and deinitialize afterwards.
* util/i386/pc/biosdisk.c: Include `#include
<grub/partition.h>' and `include <grub/pc_partition.h>' instead of
`<grub/machine/partition.h>'.
* util/i386/pc/grub-setup.c: Likewise.
* util/i386/pc/biosdisk.c: Likewise.
(grub_util_biosdisk_get_grub_dev): Only access the PC specific
partition information in case of a PC partition.
* util/i386/pc/grub-setup.c: Include `#include
<grub/partition.h>' and `include <grub/pc_partition.h>' instead of
`<grub/machine/partition.h>'.
(setup): Only access the PC specific partition information in case
of a PC partition.
Index: commands/ls.c
===================================================================
RCS file: /cvsroot/grub/grub2/commands/ls.c,v
retrieving revision 1.3
diff -u -p -u -p -r1.3 ls.c
--- commands/ls.c 22 Sep 2004 18:26:16 -0000 1.3
+++ commands/ls.c 24 Nov 2004 19:02:48 -0000
@@ -28,7 +28,7 @@
#include <grub/disk.h>
#include <grub/device.h>
#include <grub/term.h>
-#include <grub/machine/partition.h>
+#include <grub/partition.h>
#include <grub/file.h>
static const struct grub_arg_option options[] =
Index: conf/i386-pc.rmk
===================================================================
RCS file: /cvsroot/grub/grub2/conf/i386-pc.rmk,v
retrieving revision 1.22
diff -u -p -u -p -r1.22 i386-pc.rmk
--- conf/i386-pc.rmk 1 Nov 2004 16:14:15 -0000 1.22
+++ conf/i386-pc.rmk 24 Nov 2004 19:02:48 -0000
@@ -25,7 +25,7 @@ diskboot_img_LDFLAGS = -nostdlib -Wl,-N,
kernel_img_SOURCES = kern/i386/pc/startup.S kern/main.c kern/device.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \
- kern/i386/dl.c kern/i386/pc/init.c disk/i386/pc/partition.c \
+ kern/i386/dl.c kern/i386/pc/init.c kern/partition.c \
kern/env.c disk/i386/pc/biosdisk.c \
term/i386/pc/console.c \
symlist.c
@@ -33,7 +33,7 @@ kernel_img_HEADERS = arg.h boot.h device
file.h fs.h kernel.h loader.h misc.h mm.h net.h rescue.h symbol.h \
term.h types.h machine/biosdisk.h machine/boot.h \
machine/console.h machine/init.h machine/memory.h \
- machine/loader.h machine/partition.h machine/time.h machine/vga.h
+ machine/loader.h partition.h pc_partition.h machine/time.h machine/vga.h
kernel_img_CFLAGS = $(COMMON_CFLAGS)
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
kernel_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,8200
@@ -60,14 +60,16 @@ grub_mkimage_LDFLAGS = -llzo
# For grub-setup.
grub_setup_SOURCES = util/i386/pc/grub-setup.c util/i386/pc/biosdisk.c \
util/misc.c util/i386/pc/getroot.c kern/device.c kern/disk.c \
- kern/err.c kern/misc.c disk/i386/pc/partition.c fs/fat.c fs/ext2.c \
+ kern/err.c kern/misc.c fs/fat.c fs/ext2.c \
+ kern/partition.c partmap/amiga.c partmap/apple.c partmap/pc.c \
fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c kern/file.c kern/fs.c kern/env.c
fs/fshelp.c
# For grub
grub_emu_SOURCES = kern/main.c kern/device.c fs/fshelp.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
kern/misc.c kern/loader.c kern/rescue.c kern/term.c \
- disk/i386/pc/partition.c kern/env.c commands/ls.c \
+ kern/partition.c kern/env.c commands/ls.c partmap/amiga.c \
+ partmap/pc.c partmap/apple.c \
commands/terminal.c commands/boot.c commands/cmp.c commands/cat.c
\
util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c fs/ufs.c fs/minix.c fs/hfs.c
fs/jfs.c fs/iso9660.c \
normal/cmdline.c normal/command.c normal/main.c normal/menu.c
normal/arg.c \
@@ -80,7 +82,8 @@ genmoddep_SOURCES = util/genmoddep.c
# Modules.
pkgdata_MODULES = _chain.mod _linux.mod linux.mod fat.mod ufs.mod ext2.mod
minix.mod \
hfs.mod jfs.mod normal.mod hello.mod vga.mod font.mod _multiboot.mod
ls.mod \
- boot.mod cmp.mod cat.mod terminal.mod fshelp.mod chain.mod multiboot.mod
+ boot.mod cmp.mod cat.mod terminal.mod fshelp.mod chain.mod
multiboot.mod \
+ amiga.mod apple.mod pc.mod
# For _chain.mod.
_chain_mod_SOURCES = loader/i386/pc/chainloader.c
@@ -175,3 +178,15 @@ _multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
# For multiboot.mod.
multiboot_mod_SOURCES = loader/i386/pc/multiboot_normal.c
multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
+
+# For amiga.mod
+amiga_mod_SOURCES = partmap/amiga.c
+amiga_mod_CFLAGS = $(COMMON_CFLAGS)
+
+# For apple.mod
+apple_mod_SOURCES = partmap/apple.c
+apple_mod_CFLAGS = $(COMMON_CFLAGS)
+
+# For pc.mod
+pc_mod_SOURCES = partmap/pc.c
+pc_mod_CFLAGS = $(COMMON_CFLAGS)
Index: conf/powerpc-ieee1275.rmk
===================================================================
RCS file: /cvsroot/grub/grub2/conf/powerpc-ieee1275.rmk,v
retrieving revision 1.14
diff -u -p -u -p -r1.14 powerpc-ieee1275.rmk
--- conf/powerpc-ieee1275.rmk 16 Nov 2004 23:34:44 -0000 1.14
+++ conf/powerpc-ieee1275.rmk 24 Nov 2004 19:02:48 -0000
@@ -24,11 +24,11 @@ noinst_UTILITIES = genmoddep
grub_emu_SOURCES = kern/main.c kern/device.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
kern/misc.c kern/loader.c kern/rescue.c kern/term.c \
- disk/powerpc/ieee1275/partition.c fs/fshelp.c \
+ partmap/amiga.c partmap/pc.c partmap/apple.c fs/fshelp.c \
util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c fs/ufs.c fs/minix.c fs/hfs.c
\
fs/jfs.c fs/iso9660.c \
normal/cmdline.c normal/command.c normal/main.c normal/menu.c \
- normal/arg.c \
+ normal/arg.c kern/partition.c \
util/console.c util/grub-emu.c util/misc.c util/i386/pc/getroot.c \
kern/env.c commands/ls.c \
commands/terminal.c commands/boot.c commands/cmp.c commands/cat.c
@@ -41,7 +41,8 @@ grubof_SOURCES = boot/powerpc/ieee1275/c
kern/powerpc/ieee1275/init.c term/powerpc/ieee1275/ofconsole.c \
kern/powerpc/ieee1275/openfw.c fs/ext2.c fs/ufs.c fs/minix.c fs/hfs.c \
fs/jfs.c normal/cmdline.c normal/command.c normal/main.c normal/menu.c \
- disk/powerpc/ieee1275/ofdisk.c disk/powerpc/ieee1275/partition.c \
+ disk/powerpc/ieee1275/ofdisk.c partmap/amiga.c partmap/pc.c \
+ partmap/apple.c kern/partition.c \
kern/env.c normal/arg.c loader/powerpc/ieee1275/linux.c \
loader/powerpc/ieee1275/linux_normal.c commands/boot.c \
normal/powerpc/setjmp.S
Index: disk/i386/pc/partition.c
===================================================================
RCS file: disk/i386/pc/partition.c
diff -N disk/i386/pc/partition.c
--- disk/i386/pc/partition.c 4 Apr 2004 13:46:00 -0000 1.3
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,248 +0,0 @@
-/*
- * GRUB -- GRand Unified Bootloader
- * Copyright (C) 2002 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 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <grub/machine/partition.h>
-#include <grub/disk.h>
-#include <grub/mm.h>
-#include <grub/misc.h>
-
-/* Parse the partition representation in STR and return a partition. */
-static grub_partition_t
-grub_partition_parse (const char *str)
-{
- grub_partition_t p;
- char *s = (char *) str;
-
- p = (grub_partition_t) grub_malloc (sizeof (*p));
- if (! p)
- return 0;
-
- /* Initialize some of the fields with invalid values. */
- p->bsd_part = p->dos_type = p->bsd_type = p->index = -1;
-
- /* Get the DOS partition number. */
- p->dos_part = grub_strtoul (s, &s, 0);
-
- if (grub_errno)
- {
- /* Not found. Maybe only a BSD label is specified. */
- p->dos_part = -1;
- grub_errno = GRUB_ERR_NONE;
- }
- else if (*s == ',')
- s++;
-
- if (*s)
- {
- if (*s >= 'a' && *s <= 'h')
- {
- p->bsd_part = *s - 'a';
- s++;
- }
-
- if (*s)
- goto fail;
- }
-
- if (p->dos_part == -1 && p->bsd_part == -1)
- goto fail;
-
- return p;
-
- fail:
- grub_free (p);
- grub_error (GRUB_ERR_BAD_FILENAME, "invalid partition");
- return 0;
-}
-
-grub_err_t
-grub_partition_iterate (grub_disk_t disk,
- int (*hook) (const grub_partition_t partition))
-{
- struct grub_partition p;
- struct grub_partition_mbr mbr;
- struct grub_partition_disk_label label;
- struct grub_disk raw;
-
- /* Enforce raw disk access. */
- raw = *disk;
- raw.partition = 0;
-
- p.offset = 0;
- p.ext_offset = 0;
- p.dos_part = -1;
-
- while (1)
- {
- int i;
- struct grub_partition_entry *e;
-
- /* Read the MBR. */
- if (grub_disk_read (&raw, p.offset, 0, sizeof (mbr), (char *) &mbr))
- goto finish;
-
- /* Check if it is valid. */
- if (mbr.signature != grub_cpu_to_le16 (GRUB_PARTITION_SIGNATURE))
- return grub_error (GRUB_ERR_BAD_PART_TABLE, "no signature");
-
- /* Analyze DOS partitions. */
- for (p.index = 0; p.index < 4; p.index++)
- {
- e = mbr.entries + p.index;
-
- p.start = p.offset + grub_le_to_cpu32 (e->start);
- p.len = grub_le_to_cpu32 (e->length);
- p.bsd_part = -1;
- p.dos_type = e->type;
- p.bsd_type = -1;
-
- /* If this partition is a normal one, call the hook. */
- if (! grub_partition_is_empty (e->type)
- && ! grub_partition_is_extended (e->type))
- {
- p.dos_part++;
-
- if (hook (&p))
- goto finish;
-
- /* Check if this is a BSD partition. */
- if (grub_partition_is_bsd (e->type))
- {
- /* Check if the BSD label is within the DOS partition. */
- if (p.len <= GRUB_PARTITION_BSD_LABEL_SECTOR)
- return grub_error (GRUB_ERR_BAD_PART_TABLE,
- "no space for disk label");
-
- /* Read the BSD label. */
- if (grub_disk_read (&raw,
- (p.start
- + GRUB_PARTITION_BSD_LABEL_SECTOR),
- 0,
- sizeof (label),
- (char *) &label))
- goto finish;
-
- /* Check if it is valid. */
- if (label.magic
- != grub_cpu_to_le32 (GRUB_PARTITION_BSD_LABEL_MAGIC))
- return grub_error (GRUB_ERR_BAD_PART_TABLE,
- "invalid disk label magic");
-
- for (p.bsd_part = 0;
- p.bsd_part < grub_cpu_to_le16 (label.num_partitions);
- p.bsd_part++)
- {
- struct grub_partition_bsd_entry *be
- = label.entries + p.bsd_part;
-
- p.start = grub_le_to_cpu32 (be->offset);
- p.len = grub_le_to_cpu32 (be->size);
- p.bsd_type = be->fs_type;
-
- if (be->fs_type != GRUB_PARTITION_BSD_TYPE_UNUSED)
- if (hook (&p))
- goto finish;
- }
- }
- }
- else if (p.dos_part < 4)
- /* If this partition is a logical one, shouldn't increase the
- partition number. */
- p.dos_part++;
- }
-
- /* Find an extended partition. */
- for (i = 0; i < 4; i++)
- {
- e = mbr.entries + i;
-
- if (grub_partition_is_extended (e->type))
- {
- p.offset = p.ext_offset + grub_le_to_cpu32 (e->start);
- if (! p.ext_offset)
- p.ext_offset = p.offset;
-
- break;
- }
- }
-
- /* If no extended partition, the end. */
- if (i == 4)
- break;
- }
-
- finish:
- return grub_errno;
-}
-
-grub_partition_t
-grub_partition_probe (grub_disk_t disk, const char *str)
-{
- grub_partition_t p;
- auto int find_func (const grub_partition_t partition);
-
- int find_func (const grub_partition_t partition)
- {
- if ((p->dos_part == partition->dos_part || p->dos_part == -1)
- && p->bsd_part == partition->bsd_part)
- {
- grub_memcpy (p, partition, sizeof (*p));
- return 1;
- }
-
- return 0;
- }
-
- p = grub_partition_parse (str);
- if (! p)
- return 0;
-
-
- if (grub_partition_iterate (disk, find_func))
- goto fail;
-
- if (p->index < 0)
- {
- grub_error (GRUB_ERR_BAD_DEVICE, "no such partition");
- goto fail;
- }
-
- return p;
-
- fail:
- grub_free (p);
- return 0;
-}
-
-char *
-grub_partition_get_name (const grub_partition_t p)
-{
- char *name;
-
- name = grub_malloc (13);
- if (! name)
- return 0;
-
- if (p->bsd_part < 0)
- grub_sprintf (name, "%d", p->dos_part);
- else
- grub_sprintf (name, "%d,%c", p->dos_part, p->bsd_part + 'a');
-
- return name;
-}
Index: disk/powerpc/ieee1275/partition.c
===================================================================
RCS file: disk/powerpc/ieee1275/partition.c
diff -N disk/powerpc/ieee1275/partition.c
--- disk/powerpc/ieee1275/partition.c 11 Jul 2004 14:24:54 -0000 1.3
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,120 +0,0 @@
-/* partiton.c - Read macintosh partition tables. */
-/*
- * GRUB -- GRand Unified Bootloader
- * Copyright (C) 2004 Free Software Foundation, Inc.
- *
- * This program 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 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <grub/disk.h>
-#include <grub/misc.h>
-#include <grub/mm.h>
-#include <grub/machine/partition.h>
-
-grub_err_t
-grub_partition_iterate (grub_disk_t disk,
- int (*hook) (const grub_partition_t partition))
-{
- struct grub_partition part;
- struct grub_apple_part apart;
- struct grub_disk raw;
- int partno = 0;
- int pos = GRUB_DISK_SECTOR_SIZE;
-
- /* Enforce raw disk access. */
- raw = *disk;
- raw.partition = 0;
-
- for (;;)
- {
- if (grub_disk_read (&raw, pos / GRUB_DISK_SECTOR_SIZE,
- pos % GRUB_DISK_SECTOR_SIZE,
- sizeof (struct grub_apple_part), (char *) &apart))
- return grub_errno;
-
- if (apart.magic != GRUB_APPLE_PART_MAGIC)
- break;
-
- part.start = apart.first_phys_block;
- part.len = apart.blockcnt;
- part.offset = pos;
- part.index = partno;
-
- if (hook (&part))
- return grub_errno;
-
- if (apart.first_phys_block == GRUB_DISK_SECTOR_SIZE * 2)
- return 0;
-
- pos += sizeof (struct grub_apple_part);
- partno++;
- }
-
- return 0;
-}
-
-grub_partition_t
-grub_partition_probe (grub_disk_t disk, const char *str)
-{
- grub_partition_t p = 0;
- int partnum = 0;
- char *s = (char *) str;
-
- int find_func (const grub_partition_t partition)
- {
- if (partnum == partition->index)
- {
- p = (grub_partition_t) grub_malloc (sizeof (*p));
- if (! p)
- return 1;
-
- grub_memcpy (p, partition, sizeof (*p));
- return 1;
- }
-
- return 0;
- }
-
- /* Get the partition number. */
- partnum = grub_strtoul (s, 0, 10);
- if (grub_errno)
- {
- grub_error (GRUB_ERR_BAD_FILENAME, "invalid partition");
- return 0;
- }
-
- if (grub_partition_iterate (disk, find_func))
- goto fail;
-
- return p;
-
- fail:
- grub_free (p);
- return 0;
-
-}
-
-char *
-grub_partition_get_name (const grub_partition_t p)
-{
- char *name;
-
- name = grub_malloc (13);
- if (! name)
- return 0;
-
- grub_sprintf (name, "%d", p->index);
- return name;
-}
Index: include/grub/partition.h
===================================================================
RCS file: include/grub/partition.h
diff -N include/grub/partition.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ include/grub/partition.h 24 Nov 2004 19:02:48 -0000
@@ -0,0 +1,106 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2004 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef GRUB_PART_HEADER
+#define GRUB_PART_HEADER 1
+
+#include <grub/dl.h>
+
+struct grub_disk;
+
+typedef struct grub_partition *grub_partition_t;
+
+/* Partition map type. */
+struct grub_partition_map
+{
+ /* The name of the partition map type. */
+ const char *name;
+
+ /* Call HOOK with each partition, until HOOK returns non-zero. */
+ grub_err_t (*iterate) (struct grub_disk *disk,
+ int (*hook) (const grub_partition_t partition));
+
+ /* Return the partition named STR on the disk DISK. */
+ grub_partition_t (*probe) (struct grub_disk *disk,
+ const char *str);
+
+ /* Return the name of the partition PARTITION. */
+ char *(*get_name) (const grub_partition_t partition);
+
+ /* The next partition map type. */
+ struct grub_partition_map *next;
+};
+typedef struct grub_partition_map *grub_partition_map_t;
+
+/* Partition description. */
+struct grub_partition
+{
+ /* The start sector. */
+ unsigned long start;
+
+ /* The length in sector units. */
+ unsigned long len;
+
+ /* The offset of the partition table. */
+ unsigned long offset;
+
+ /* The index of this partition in the partition table. */
+ int index;
+
+ /* Partition map type specific data. */
+ void *data;
+
+ /* The type partition map. */
+ grub_partition_map_t partmap;
+};
+
+grub_partition_t EXPORT_FUNC(grub_partition_probe) (struct grub_disk *disk,
+ const char *str);
+grub_err_t EXPORT_FUNC(grub_partition_iterate) (struct grub_disk *disk,
+ int (*hook) (const
grub_partition_t partition));
+char *EXPORT_FUNC(grub_partition_get_name) (const grub_partition_t partition);
+
+void EXPORT_FUNC(grub_partition_map_iterate) (int (*hook) (const
grub_partition_map_t partmap));
+
+void EXPORT_FUNC(grub_partition_map_register) (grub_partition_map_t partmap);
+
+void EXPORT_FUNC(grub_partition_map_unregister) (grub_partition_map_t partmap);
+
+#ifdef GRUB_UTIL
+void grub_pc_partition_map_init (void);
+void grub_pc_partition_map_fini (void);
+void grub_amiga_partition_map_init (void);
+void grub_amiga_partition_map_fini (void);
+void grub_apple_partition_map_init (void);
+void grub_apple_partition_map_fini (void);
+#endif
+
+static inline unsigned long
+grub_partition_get_start (const grub_partition_t p)
+{
+ return p->start;
+}
+
+static inline unsigned long
+grub_partition_get_len (const grub_partition_t p)
+{
+ return p->len;
+}
+
+#endif /* ! GRUB_PART_HEADER */
Index: include/grub/pc_partition.h
===================================================================
RCS file: include/grub/pc_partition.h
diff -N include/grub/pc_partition.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ include/grub/pc_partition.h 24 Nov 2004 19:02:48 -0000
@@ -0,0 +1,209 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 1999,2000,2001,2002 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef GRUB_PC_PARTITION_HEADER
+#define GRUB_PC_PARTITION_HEADER 1
+
+#include <grub/symbol.h>
+#include <grub/types.h>
+#include <grub/err.h>
+
+/* The signature. */
+#define GRUB_PC_PARTITION_SIGNATURE 0xaa55
+
+/* This is not a flag actually, but used as if it were a flag. */
+#define GRUB_PC_PARTITION_TYPE_HIDDEN_FLAG 0x10
+
+/* DOS partition types. */
+#define GRUB_PC_PARTITION_TYPE_NONE 0
+#define GRUB_PC_PARTITION_TYPE_FAT12 1
+#define GRUB_PC_PARTITION_TYPE_FAT16_LT32M 4
+#define GRUB_PC_PARTITION_TYPE_EXTENDED 5
+#define GRUB_PC_PARTITION_TYPE_FAT16_GT32M 6
+#define GRUB_PC_PARTITION_TYPE_FAT32 0xb
+#define GRUB_PC_PARTITION_TYPE_FAT32_LBA 0xc
+#define GRUB_PC_PARTITION_TYPE_FAT16_LBA 0xe
+#define GRUB_PC_PARTITION_TYPE_WIN95_EXTENDED 0xf
+#define GRUB_PC_PARTITION_TYPE_EZD 0x55
+#define GRUB_PC_PARTITION_TYPE_MINIX 0x80
+#define GRUB_PC_PARTITION_TYPE_LINUX_MINIX 0x81
+#define GRUB_PC_PARTITION_TYPE_EXT2FS 0x83
+#define GRUB_PC_PARTITION_TYPE_LINUX_EXTENDED 0x85
+#define GRUB_PC_PARTITION_TYPE_VSTAFS 0x9e
+#define GRUB_PC_PARTITION_TYPE_FREEBSD 0xa5
+#define GRUB_PC_PARTITION_TYPE_OPENBSD 0xa6
+#define GRUB_PC_PARTITION_TYPE_NETBSD 0xa9
+#define GRUB_PC_PARTITION_TYPE_LINUX_RAID 0xfd
+
+/* Constants for BSD disk label. */
+#define GRUB_PC_PARTITION_BSD_LABEL_SECTOR 1
+#define GRUB_PC_PARTITION_BSD_LABEL_MAGIC 0x82564557
+#define GRUB_PC_PARTITION_BSD_MAX_ENTRIES 8
+
+/* BSD partition types. */
+#define GRUB_PC_PARTITION_BSD_TYPE_UNUSED 0
+#define GRUB_PC_PARTITION_BSD_TYPE_SWAP 1
+#define GRUB_PC_PARTITION_BSD_TYPE_V6 2
+#define GRUB_PC_PARTITION_BSD_TYPE_V7 3
+#define GRUB_PC_PARTITION_BSD_TYPE_SYSV 4
+#define GRUB_PC_PARTITION_BSD_TYPE_V71K 5
+#define GRUB_PC_PARTITION_BSD_TYPE_V8 6
+#define GRUB_PC_PARTITION_BSD_TYPE_BSDFFS 7
+#define GRUB_PC_PARTITION_BSD_TYPE_MSDOS 8
+#define GRUB_PC_PARTITION_BSD_TYPE_BSDLFS 9
+#define GRUB_PC_PARTITION_BSD_TYPE_OTHER 10
+#define GRUB_PC_PARTITION_BSD_TYPE_HPFS 11
+#define GRUB_PC_PARTITION_BSD_TYPE_ISO9660 12
+#define GRUB_PC_PARTITION_BSD_TYPE_BOOT 13
+
+/* FreeBSD-specific types. */
+#define GRUB_PC_PARTITION_FREEBSD_TYPE_VINUM 14
+#define GRUB_PC_PARTITION_FREEBSD_TYPE_RAID 15
+#define GRUB_PC_PARTITION_FREEBSD_TYPE_JFS2 21
+
+/* NetBSD-specific types. */
+#define GRUB_PC_PARTITION_NETBSD_TYPE_ADOS 14
+#define GRUB_PC_PARTITION_NETBSD_TYPE_HFS 15
+#define GRUB_PC_PARTITION_NETBSD_TYPE_FILECORE 16
+#define GRUB_PC_PARTITION_NETBSD_TYPE_EXT2FS 17
+#define GRUB_PC_PARTITION_NETBSD_TYPE_NTFS 18
+#define GRUB_PC_PARTITION_NETBSD_TYPE_RAID 19
+#define GRUB_PC_PARTITION_NETBSD_TYPE_CCD 20
+#define GRUB_PC_PARTITION_NETBSD_TYPE_JFS2 21
+#define GRUB_PC_PARTITION_NETBSD_TYPE_APPLEUFS 22
+
+/* OpenBSD-specific types. */
+#define GRUB_PC_PARTITION_OPENBSD_TYPE_ADOS 14
+#define GRUB_PC_PARTITION_OPENBSD_TYPE_HFS 15
+#define GRUB_PC_PARTITION_OPENBSD_TYPE_FILECORE 16
+#define GRUB_PC_PARTITION_OPENBSD_TYPE_EXT2FS 17
+#define GRUB_PC_PARTITION_OPENBSD_TYPE_NTFS 18
+#define GRUB_PC_PARTITION_OPENBSD_TYPE_RAID 19
+
+/* The BSD partition entry. */
+struct grub_pc_partition_bsd_entry
+{
+ grub_uint32_t size;
+ grub_uint32_t offset;
+ grub_uint32_t fragment_size;
+ grub_uint8_t fs_type;
+ grub_uint8_t fs_fragments;
+ grub_uint16_t fs_cylinders;
+} __attribute__ ((packed));
+
+/* The BSD disk label. Only define members useful for GRUB. */
+struct grub_pc_partition_disk_label
+{
+ grub_uint32_t magic;
+ grub_uint8_t padding[128];
+ grub_uint32_t magic2;
+ grub_uint16_t checksum;
+ grub_uint16_t num_partitions;
+ grub_uint32_t boot_size;
+ grub_uint32_t superblock_size;
+ struct grub_pc_partition_bsd_entry
entries[GRUB_PC_PARTITION_BSD_MAX_ENTRIES];
+} __attribute__ ((packed));
+
+/* The partition entry. */
+struct grub_pc_partition_entry
+{
+ /* If active, 0x80, otherwise, 0x00. */
+ grub_uint8_t flag;
+
+ /* The head of the start. */
+ grub_uint8_t start_head;
+
+ /* (S | ((C >> 2) & 0xC0)) where S is the sector of the start and C
+ is the cylinder of the start. Note that S is counted from one. */
+ grub_uint8_t start_sector;
+
+ /* (C & 0xFF) where C is the cylinder of the start. */
+ grub_uint8_t start_cylinder;
+
+ /* The partition type. */
+ grub_uint8_t type;
+
+ /* The end versions of start_head, start_sector and start_cylinder,
+ respectively. */
+ grub_uint8_t end_head;
+ grub_uint8_t end_sector;
+ grub_uint8_t end_cylinder;
+
+ /* The start sector. Note that this is counted from zero. */
+ grub_uint32_t start;
+
+ /* The length in sector units. */
+ grub_uint32_t length;
+} __attribute__ ((packed));
+
+/* The structure of MBR. */
+struct grub_pc_partition_mbr
+{
+ /* The code area (actually, including BPB). */
+ grub_uint8_t code[446];
+
+ /* Four partition entries. */
+ struct grub_pc_partition_entry entries[4];
+
+ /* The signature 0xaa55. */
+ grub_uint16_t signature;
+} __attribute__ ((packed));
+
+
+struct grub_pc_partition
+{
+ /* The DOS partition number. */
+ int dos_part;
+
+ /* The BSD partition number (a == 0). */
+ int bsd_part;
+
+ /* The DOS partition type. */
+ int dos_type;
+
+ /* The BSD partition type. */
+ int bsd_type;
+
+ /* The offset of the extended partition. */
+ unsigned long ext_offset;
+};
+
+static inline int
+grub_pc_partition_is_empty (int type)
+{
+ return (type == GRUB_PC_PARTITION_TYPE_NONE);
+}
+
+static inline int
+grub_pc_partition_is_extended (int type)
+{
+ return (type == GRUB_PC_PARTITION_TYPE_EXTENDED
+ || type == GRUB_PC_PARTITION_TYPE_WIN95_EXTENDED
+ || type == GRUB_PC_PARTITION_TYPE_LINUX_EXTENDED);
+}
+
+static inline int
+grub_pc_partition_is_bsd (int type)
+{
+ return (type == GRUB_PC_PARTITION_TYPE_FREEBSD
+ || type == GRUB_PC_PARTITION_TYPE_OPENBSD
+ || type == GRUB_PC_PARTITION_TYPE_NETBSD);
+}
+
+#endif /* ! GRUB_PC_PARTITION_HEADER */
Index: include/grub/i386/pc/partition.h
===================================================================
RCS file: include/grub/i386/pc/partition.h
diff -N include/grub/i386/pc/partition.h
--- include/grub/i386/pc/partition.h 4 Apr 2004 13:46:01 -0000 1.3
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,242 +0,0 @@
-/*
- * GRUB -- GRand Unified Bootloader
- * Copyright (C) 1999,2000,2001,2002 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 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef GRUB_PARTITION_HEADER
-#define GRUB_PARTITION_HEADER 1
-
-#include <grub/symbol.h>
-#include <grub/types.h>
-#include <grub/err.h>
-
-/* The signature. */
-#define GRUB_PARTITION_SIGNATURE 0xaa55
-
-/* This is not a flag actually, but used as if it were a flag. */
-#define GRUB_PARTITION_TYPE_HIDDEN_FLAG 0x10
-
-/* DOS partition types. */
-#define GRUB_PARTITION_TYPE_NONE 0
-#define GRUB_PARTITION_TYPE_FAT12 1
-#define GRUB_PARTITION_TYPE_FAT16_LT32M 4
-#define GRUB_PARTITION_TYPE_EXTENDED 5
-#define GRUB_PARTITION_TYPE_FAT16_GT32M 6
-#define GRUB_PARTITION_TYPE_FAT32 0xb
-#define GRUB_PARTITION_TYPE_FAT32_LBA 0xc
-#define GRUB_PARTITION_TYPE_FAT16_LBA 0xe
-#define GRUB_PARTITION_TYPE_WIN95_EXTENDED 0xf
-#define GRUB_PARTITION_TYPE_EZD 0x55
-#define GRUB_PARTITION_TYPE_MINIX 0x80
-#define GRUB_PARTITION_TYPE_LINUX_MINIX 0x81
-#define GRUB_PARTITION_TYPE_EXT2FS 0x83
-#define GRUB_PARTITION_TYPE_LINUX_EXTENDED 0x85
-#define GRUB_PARTITION_TYPE_VSTAFS 0x9e
-#define GRUB_PARTITION_TYPE_FREEBSD 0xa5
-#define GRUB_PARTITION_TYPE_OPENBSD 0xa6
-#define GRUB_PARTITION_TYPE_NETBSD 0xa9
-#define GRUB_PARTITION_TYPE_LINUX_RAID 0xfd
-
-/* Constants for BSD disk label. */
-#define GRUB_PARTITION_BSD_LABEL_SECTOR 1
-#define GRUB_PARTITION_BSD_LABEL_MAGIC 0x82564557
-#define GRUB_PARTITION_BSD_MAX_ENTRIES 8
-
-/* BSD partition types. */
-#define GRUB_PARTITION_BSD_TYPE_UNUSED 0
-#define GRUB_PARTITION_BSD_TYPE_SWAP 1
-#define GRUB_PARTITION_BSD_TYPE_V6 2
-#define GRUB_PARTITION_BSD_TYPE_V7 3
-#define GRUB_PARTITION_BSD_TYPE_SYSV 4
-#define GRUB_PARTITION_BSD_TYPE_V71K 5
-#define GRUB_PARTITION_BSD_TYPE_V8 6
-#define GRUB_PARTITION_BSD_TYPE_BSDFFS 7
-#define GRUB_PARTITION_BSD_TYPE_MSDOS 8
-#define GRUB_PARTITION_BSD_TYPE_BSDLFS 9
-#define GRUB_PARTITION_BSD_TYPE_OTHER 10
-#define GRUB_PARTITION_BSD_TYPE_HPFS 11
-#define GRUB_PARTITION_BSD_TYPE_ISO9660 12
-#define GRUB_PARTITION_BSD_TYPE_BOOT 13
-
-/* FreeBSD-specific types. */
-#define GRUB_PARTITION_FREEBSD_TYPE_VINUM 14
-#define GRUB_PARTITION_FREEBSD_TYPE_RAID 15
-#define GRUB_PARTITION_FREEBSD_TYPE_JFS2 21
-
-/* NetBSD-specific types. */
-#define GRUB_PARTITION_NETBSD_TYPE_ADOS 14
-#define GRUB_PARTITION_NETBSD_TYPE_HFS 15
-#define GRUB_PARTITION_NETBSD_TYPE_FILECORE 16
-#define GRUB_PARTITION_NETBSD_TYPE_EXT2FS 17
-#define GRUB_PARTITION_NETBSD_TYPE_NTFS 18
-#define GRUB_PARTITION_NETBSD_TYPE_RAID 19
-#define GRUB_PARTITION_NETBSD_TYPE_CCD 20
-#define GRUB_PARTITION_NETBSD_TYPE_JFS2 21
-#define GRUB_PARTITION_NETBSD_TYPE_APPLEUFS 22
-
-/* OpenBSD-specific types. */
-#define GRUB_PARTITION_OPENBSD_TYPE_ADOS 14
-#define GRUB_PARTITION_OPENBSD_TYPE_HFS 15
-#define GRUB_PARTITION_OPENBSD_TYPE_FILECORE 16
-#define GRUB_PARTITION_OPENBSD_TYPE_EXT2FS 17
-#define GRUB_PARTITION_OPENBSD_TYPE_NTFS 18
-#define GRUB_PARTITION_OPENBSD_TYPE_RAID 19
-
-/* The BSD partition entry. */
-struct grub_partition_bsd_entry
-{
- grub_uint32_t size;
- grub_uint32_t offset;
- grub_uint32_t fragment_size;
- grub_uint8_t fs_type;
- grub_uint8_t fs_fragments;
- grub_uint16_t fs_cylinders;
-} __attribute__ ((packed));
-
-/* The BSD disk label. Only define members useful for GRUB. */
-struct grub_partition_disk_label
-{
- grub_uint32_t magic;
- grub_uint8_t padding[128];
- grub_uint32_t magic2;
- grub_uint16_t checksum;
- grub_uint16_t num_partitions;
- grub_uint32_t boot_size;
- grub_uint32_t superblock_size;
- struct grub_partition_bsd_entry entries[GRUB_PARTITION_BSD_MAX_ENTRIES];
-} __attribute__ ((packed));
-
-/* The partition entry. */
-struct grub_partition_entry
-{
- /* If active, 0x80, otherwise, 0x00. */
- grub_uint8_t flag;
-
- /* The head of the start. */
- grub_uint8_t start_head;
-
- /* (S | ((C >> 2) & 0xC0)) where S is the sector of the start and C
- is the cylinder of the start. Note that S is counted from one. */
- grub_uint8_t start_sector;
-
- /* (C & 0xFF) where C is the cylinder of the start. */
- grub_uint8_t start_cylinder;
-
- /* The partition type. */
- grub_uint8_t type;
-
- /* The end versions of start_head, start_sector and start_cylinder,
- respectively. */
- grub_uint8_t end_head;
- grub_uint8_t end_sector;
- grub_uint8_t end_cylinder;
-
- /* The start sector. Note that this is counted from zero. */
- grub_uint32_t start;
-
- /* The length in sector units. */
- grub_uint32_t length;
-} __attribute__ ((packed));
-
-/* The structure of MBR. */
-struct grub_partition_mbr
-{
- /* The code area (actually, including BPB). */
- grub_uint8_t code[446];
-
- /* Four partition entries. */
- struct grub_partition_entry entries[4];
-
- /* The signature 0xaa55. */
- grub_uint16_t signature;
-} __attribute__ ((packed));
-
-/* Partition description. */
-struct grub_partition
-{
- /* The start sector. */
- unsigned long start;
-
- /* The length in sector units. */
- unsigned long len;
-
- /* The offset of the partition table. */
- unsigned long offset;
-
- /* The offset of the extended partition. */
- unsigned long ext_offset;
-
- /* The index of this partition in the partition table. */
- int index;
-
- /* The DOS partition number. */
- int dos_part;
-
- /* The BSD partition number (a == 0). */
- int bsd_part;
-
- /* The DOS partition type. */
- int dos_type;
-
- /* The BSD partition type. */
- int bsd_type;
-};
-typedef struct grub_partition *grub_partition_t;
-
-struct grub_disk;
-
-grub_partition_t EXPORT_FUNC(grub_partition_probe) (struct grub_disk *disk,
- const char *str);
-grub_err_t EXPORT_FUNC(grub_partition_iterate) (struct grub_disk *disk,
- int (*hook) (const
grub_partition_t partition));
-char *EXPORT_FUNC(grub_partition_get_name) (const grub_partition_t partition);
-
-static inline unsigned long
-grub_partition_get_start (const grub_partition_t p)
-{
- return p->start;
-}
-
-static inline unsigned long
-grub_partition_get_len (const grub_partition_t p)
-{
- return p->len;
-}
-
-static inline int
-grub_partition_is_empty (int type)
-{
- return (type == GRUB_PARTITION_TYPE_NONE);
-}
-
-static inline int
-grub_partition_is_extended (int type)
-{
- return (type == GRUB_PARTITION_TYPE_EXTENDED
- || type == GRUB_PARTITION_TYPE_WIN95_EXTENDED
- || type == GRUB_PARTITION_TYPE_LINUX_EXTENDED);
-}
-
-static inline int
-grub_partition_is_bsd (int type)
-{
- return (type == GRUB_PARTITION_TYPE_FREEBSD
- || type == GRUB_PARTITION_TYPE_OPENBSD
- || type == GRUB_PARTITION_TYPE_NETBSD);
-}
-
-#endif /* ! GRUB_PARTITION_HEADER */
Index: include/grub/powerpc/ieee1275/partition.h
===================================================================
RCS file: include/grub/powerpc/ieee1275/partition.h
diff -N include/grub/powerpc/ieee1275/partition.h
--- include/grub/powerpc/ieee1275/partition.h 4 Apr 2004 13:46:01 -0000
1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,140 +0,0 @@
-/*
- * GRUB -- GRand Unified Bootloader
- * Copyright (C) 1999,2000,2001,2002,2004 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 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef GRUB_PARTITION_HEADER
-#define GRUB_PARTITION_HEADER 1
-
-#include <grub/symbol.h>
-#include <grub/types.h>
-#include <grub/err.h>
-
-#define GRUB_APPLE_PART_MAGIC 0x504D
-
-struct grub_apple_part
-{
- /* The magic number to idenify this as a partition, it should have
- the value `0x504D'. */
- grub_uint16_t magic;
-
- /* Reserved. */
- grub_uint16_t reserved;
-
- /* The size of the partition map in blocks. */
- grub_uint32_t partmap_size;
-
- /* The first physical block of the partition. */
- grub_uint32_t first_phys_block;
-
- /* The amount of blocks. */
- grub_uint32_t blockcnt;
-
- /* The partition name. */
- char partname[32];
-
- /* The partition type. */
- char parttype[32];
-
- /* The first datablock of the partition. */
- grub_uint32_t datablocks_first;
-
- /* The amount datablocks. */
- grub_uint32_t datablocks_count;
-
- /* The status of the partition. (???) */
- grub_uint32_t status;
-
- /* The first block on which the bootcode can be found. */
- grub_uint32_t bootcode_pos;
-
- /* The size of the bootcode in bytes. */
- grub_uint32_t bootcode_size;
-
- /* The load address of the bootcode. */
- grub_uint32_t bootcode_loadaddr;
-
- /* Reserved. */
- grub_uint32_t reserved2;
-
- /* The entrypoint of the bootcode. */
- grub_uint32_t bootcode_entrypoint;
-
- /* Reserved. */
- grub_uint32_t reserved3;
-
- /* A checksum of the bootcode. */
- grub_uint32_t bootcode_checksum;
-
- /* The processor type. */
- char processor[16];
-
- /* Padding. */
- grub_uint16_t pad[187];
-};
-
-/* Partition description. */
-struct grub_partition
-{
- /* The start sector. */
- unsigned long start;
-
- /* The length in sector units. */
- unsigned long len;
-
- /* The offset of the partition table. */
- unsigned long offset;
-
- /* The index of this partition in the partition table. */
- int index;
-
- /* The DOS partition number. */
- int dos_part;
-
- /* The BSD partition number (a == 0). */
- int bsd_part;
-
- /* The DOS partition type. */
- int dos_type;
-
- /* The BSD partition type. */
- int bsd_type;
-};
-typedef struct grub_partition *grub_partition_t;
-
-struct grub_disk;
-
-grub_partition_t EXPORT_FUNC(grub_partition_probe) (struct grub_disk *disk,
- const char *str);
-grub_err_t EXPORT_FUNC(grub_partition_iterate) (struct grub_disk *disk,
- int (*hook) (const
grub_partition_t partition));
-char *EXPORT_FUNC(grub_partition_get_name) (const grub_partition_t partition);
-
-
-static inline unsigned long
-grub_partition_get_start (const grub_partition_t p)
-{
- return p->start;
-}
-
-static inline unsigned long
-grub_partition_get_len (const grub_partition_t p)
-{
- return p->len;
-}
-
-#endif /* ! GRUB_PARTITION_HEADER */
Index: kern/disk.c
===================================================================
RCS file: /cvsroot/grub/grub2/kern/disk.c,v
retrieving revision 1.8
diff -u -p -u -p -r1.8 disk.c
--- kern/disk.c 21 Aug 2004 13:54:22 -0000 1.8
+++ kern/disk.c 24 Nov 2004 19:02:48 -0000
@@ -21,7 +21,7 @@
#include <grub/err.h>
#include <grub/mm.h>
#include <grub/types.h>
-#include <grub/machine/partition.h>
+#include <grub/partition.h>
#include <grub/misc.h>
#include <grub/machine/time.h>
#include <grub/file.h>
Index: kern/partition.c
===================================================================
RCS file: kern/partition.c
diff -N kern/partition.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ kern/partition.c 24 Nov 2004 19:02:48 -0000
@@ -0,0 +1,95 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2004 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <grub/partition.h>
+#include <grub/disk.h>
+
+static grub_partition_map_t grub_partition_map_list;
+
+void
+grub_partition_map_register (grub_partition_map_t partmap)
+{
+ partmap->next = grub_partition_map_list;
+ grub_partition_map_list = partmap;
+}
+
+void
+grub_partition_map_unregister (grub_partition_map_t partmap)
+{
+ grub_partition_map_t *p, q;
+
+ for (p = &grub_partition_map_list, q = *p; q; p = &(q->next), q = q->next)
+ if (q == partmap)
+ {
+ *p = q->next;
+ break;
+ }
+}
+
+void
+grub_partition_map_iterate (int (*hook) (const grub_partition_map_t partmap))
+{
+ grub_partition_map_t p;
+
+ for (p = grub_partition_map_list; p; p = p->next)
+ if (hook (p))
+ break;
+}
+
+grub_partition_t
+grub_partition_probe (struct grub_disk *disk, const char *str)
+{
+ grub_partition_t part;
+
+ auto int part_map_probe (const grub_partition_map_t partmap);
+
+ int part_map_probe (const grub_partition_map_t partmap)
+ {
+ part = partmap->probe (disk, str);
+ if (part)
+ return 1;
+ return 0;
+ }
+
+ /* Use the first partition map type found. */
+ grub_partition_map_iterate (part_map_probe);
+
+ return part;
+}
+
+grub_err_t
+grub_partition_iterate (struct grub_disk *disk,
+ int (*hook) (const grub_partition_t partition))
+{
+ auto int part_map_iterate (const grub_partition_map_t partmap);
+
+ int part_map_iterate (const grub_partition_map_t partmap)
+ {
+ return partmap->iterate (disk, hook);
+ }
+
+ grub_partition_map_iterate (part_map_iterate);
+ return grub_errno;
+}
+
+char *
+grub_partition_get_name (const grub_partition_t partition)
+{
+ return partition->partmap->get_name (partition);
+}
Index: kern/rescue.c
===================================================================
RCS file: /cvsroot/grub/grub2/kern/rescue.c,v
retrieving revision 1.10
diff -u -p -u -p -r1.10 rescue.c
--- kern/rescue.c 22 Sep 2004 18:26:16 -0000 1.10
+++ kern/rescue.c 24 Nov 2004 19:02:48 -0000
@@ -28,7 +28,7 @@
#include <grub/err.h>
#include <grub/loader.h>
#include <grub/dl.h>
-#include <grub/machine/partition.h>
+#include <grub/partition.h>
#include <grub/env.h>
#define GRUB_RESCUE_BUF_SIZE 256
Index: kern/powerpc/ieee1275/init.c
===================================================================
RCS file: /cvsroot/grub/grub2/kern/powerpc/ieee1275/init.c,v
retrieving revision 1.8
diff -u -p -u -p -r1.8 init.c
--- kern/powerpc/ieee1275/init.c 16 Nov 2004 23:34:44 -0000 1.8
+++ kern/powerpc/ieee1275/init.c 24 Nov 2004 19:02:48 -0000
@@ -22,7 +22,7 @@
#include <grub/dl.h>
#include <grub/disk.h>
#include <grub/mm.h>
-#include <grub/machine/partition.h>
+#include <grub/partition.h>
#include <grub/machine/ieee1275.h>
#include <grub/normal.h>
#include <grub/fs.h>
@@ -78,6 +78,9 @@ grub_machine_init (void)
grub_boot_init ();
grub_linux_init ();
grub_linux_normal_init ();
+ grub_pc_partition_map_init ();
+ grub_amiga_partition_map_init ();
+ grub_apple_partition_map_init ();
grub_ofdisk_init ();
}
Index: loader/i386/pc/chainloader.c
===================================================================
RCS file: /cvsroot/grub/grub2/loader/i386/pc/chainloader.c,v
retrieving revision 1.7
diff -u -p -u -p -r1.7 chainloader.c
--- loader/i386/pc/chainloader.c 12 Sep 2004 12:20:52 -0000 1.7
+++ loader/i386/pc/chainloader.c 24 Nov 2004 19:02:48 -0000
@@ -28,7 +28,7 @@
#include <grub/misc.h>
#include <grub/types.h>
#include <grub/machine/init.h>
-#include <grub/machine/partition.h>
+#include <grub/partition.h>
#include <grub/machine/memory.h>
#include <grub/rescue.h>
#include <grub/dl.h>
Index: normal/cmdline.c
===================================================================
RCS file: /cvsroot/grub/grub2/normal/cmdline.c,v
retrieving revision 1.8
diff -u -p -u -p -r1.8 cmdline.c
--- normal/cmdline.c 27 Jun 2004 11:03:24 -0000 1.8
+++ normal/cmdline.c 24 Nov 2004 19:02:48 -0000
@@ -23,7 +23,7 @@
#include <grub/err.h>
#include <grub/types.h>
#include <grub/mm.h>
-#include <grub/machine/partition.h>
+#include <grub/partition.h>
#include <grub/disk.h>
#include <grub/file.h>
#include <grub/env.h>
Index: partmap/amiga.c
===================================================================
RCS file: partmap/amiga.c
diff -N partmap/amiga.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ partmap/amiga.c 24 Nov 2004 19:02:48 -0000
@@ -0,0 +1,229 @@
+/* amiga.c - Read amiga partition tables (RDB). */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2004 Free Software Foundation, Inc.
+ *
+ * This program 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <grub/disk.h>
+#include <grub/misc.h>
+#include <grub/mm.h>
+#include <grub/partition.h>
+#include <grub/dl.h>
+
+struct grub_amiga_rdsk
+{
+ /* "RDSK". */
+ grub_uint8_t magic[4];
+ grub_uint32_t size;
+ grub_int32_t checksum;
+ grub_uint32_t scsihost;
+ grub_uint32_t blksz;
+ grub_uint32_t flags;
+ grub_uint32_t badblcklst;
+ grub_uint32_t partitionlst;
+ grub_uint32_t fslst;
+
+ /* The other information is not important for us. */
+} __attribute__ ((packed));
+
+struct grub_amiga_partition
+{
+ /* "PART". */
+ grub_uint8_t magic[4];
+ grub_int32_t size;
+ grub_int32_t checksum;
+ grub_uint32_t scsihost;
+ grub_uint32_t next;
+ grub_uint32_t flags;
+ grub_uint32_t unused1[2];
+ grub_uint32_t devflags;
+ grub_uint8_t namelen;
+ grub_uint8_t name[31];
+ grub_uint32_t unused2[15];
+
+ grub_uint32_t unused3[3];
+ grub_uint32_t heads;
+ grub_uint32_t unused4;
+ grub_uint32_t block_per_track;
+ grub_uint32_t unused5[3];
+ grub_uint32_t lowcyl;
+ grub_uint32_t highcyl;
+
+ grub_uint32_t firstcyl;
+} __attribute__ ((packed));
+
+static struct grub_partition_map grub_amiga_partition_map;
+
+#ifndef GRUB_UTIL
+static grub_dl_t my_mod;
+#endif
+
+static grub_err_t
+amiga_partition_map_iterate (grub_disk_t disk,
+ int (*hook) (const grub_partition_t partition))
+{
+ struct grub_partition part;
+ struct grub_amiga_rdsk rdsk;
+ struct grub_disk raw;
+ int partno = 0;
+ int next = -1;
+ int pos;
+
+ /* Enforce raw disk access. */
+ raw = *disk;
+ raw.partition = 0;
+
+ /* The RDSK block is one of the first 15 blocks. */
+ for (pos = 0; pos < 15; pos++)
+ {
+ /* Read the RDSK block which is a descriptor for the entire disk. */
+ if (grub_disk_read (&raw, pos, 0,
+ sizeof (rdsk), (char *) &rdsk))
+ return grub_errno;
+
+ if (!grub_strcmp (rdsk.magic, "RDSK"))
+ {
+ /* Found the first PART block. */
+ next = grub_be_to_cpu32 (rdsk.partitionlst);
+ break;
+ }
+ }
+
+ /* The end of the partition list is marked using "-1". */
+ while (next != -1)
+ {
+ struct grub_amiga_partition apart;
+
+ /* Read the RDSK block which is a descriptor for the entire disk. */
+ if (grub_disk_read (&raw, next, 0,
+ sizeof (apart), (char *) &apart))
+ return grub_errno;
+
+ /* Calculate the first block and the size of the partition. */
+ part.start = (grub_be_to_cpu32 (apart.lowcyl)
+ * grub_be_to_cpu32 (apart.heads)
+ * grub_be_to_cpu32 (apart.block_per_track));
+ part.len = ((grub_be_to_cpu32 (apart.highcyl)
+ - grub_be_to_cpu32 (apart.lowcyl) + 1)
+ * grub_be_to_cpu32 (apart.heads)
+ * grub_be_to_cpu32 (apart.block_per_track));
+
+ part.offset = next * 512;
+ part.index = partno;
+ part.partmap = &grub_amiga_partition_map;
+
+ if (hook (&part))
+ return grub_errno;
+
+ next = grub_be_to_cpu32 (apart.next);
+ partno++;
+ }
+
+ return 0;
+}
+
+
+static grub_partition_t
+amiga_partition_map_probe (grub_disk_t disk, const char *str)
+{
+ grub_partition_t p = 0;
+ int partnum = 0;
+ char *s = (char *) str;
+
+ auto int find_func (const grub_partition_t partition);
+
+ int find_func (const grub_partition_t partition)
+ {
+ if (partnum == partition->index)
+ {
+ p = (grub_partition_t) grub_malloc (sizeof (*p));
+ if (! p)
+ return 1;
+
+ grub_memcpy (p, partition, sizeof (*p));
+ return 1;
+ }
+
+ return 0;
+ }
+
+ /* Get the partition number. */
+ partnum = grub_strtoul (s, 0, 10);
+ if (grub_errno)
+ {
+ grub_error (GRUB_ERR_BAD_FILENAME, "invalid partition");
+ return 0;
+ }
+
+ if (amiga_partition_map_iterate (disk, find_func))
+ goto fail;
+
+ return p;
+
+ fail:
+ grub_free (p);
+ return 0;
+}
+
+
+static char *
+amiga_partition_map_get_name (const grub_partition_t p)
+{
+ char *name;
+
+ name = grub_malloc (13);
+ if (! name)
+ return 0;
+
+ grub_sprintf (name, "%d", p->index);
+ return name;
+}
+
+
+/* Partition map type. */
+static struct grub_partition_map grub_amiga_partition_map =
+ {
+ .name = "amiga_partition_map",
+ .iterate = amiga_partition_map_iterate,
+ .probe = amiga_partition_map_probe,
+ .get_name = amiga_partition_map_get_name
+ };
+
+#ifdef GRUB_UTIL
+void
+grub_amiga_partition_map_init (void)
+{
+ grub_partition_map_register (&grub_amiga_partition_map);
+}
+
+void
+grub_amiga_partition_map_fini (void)
+{
+ grub_partition_map_unregister (&grub_amiga_partition_map);
+}
+#else
+GRUB_MOD_INIT
+{
+ grub_partition_map_register (&grub_amiga_partition_map);
+ my_mod = mod;
+}
+
+GRUB_MOD_FINI
+{
+ grub_partition_map_unregister (&grub_amiga_partition_map);
+}
+#endif
Index: partmap/apple.c
===================================================================
RCS file: partmap/apple.c
diff -N partmap/apple.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ partmap/apple.c 24 Nov 2004 19:02:48 -0000
@@ -0,0 +1,231 @@
+/* apple.c - Read macintosh partition tables. */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2004 Free Software Foundation, Inc.
+ *
+ * This program 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <grub/disk.h>
+#include <grub/misc.h>
+#include <grub/mm.h>
+#include <grub/partition.h>
+
+#define GRUB_APPLE_PART_MAGIC 0x504D
+
+struct grub_apple_part
+{
+ /* The magic number to idenify this as a partition, it should have
+ the value `0x504D'. */
+ grub_uint16_t magic;
+
+ /* Reserved. */
+ grub_uint16_t reserved;
+
+ /* The size of the partition map in blocks. */
+ grub_uint32_t partmap_size;
+
+ /* The first physical block of the partition. */
+ grub_uint32_t first_phys_block;
+
+ /* The amount of blocks. */
+ grub_uint32_t blockcnt;
+
+ /* The partition name. */
+ char partname[32];
+
+ /* The partition type. */
+ char parttype[32];
+
+ /* The first datablock of the partition. */
+ grub_uint32_t datablocks_first;
+
+ /* The amount datablocks. */
+ grub_uint32_t datablocks_count;
+
+ /* The status of the partition. (???) */
+ grub_uint32_t status;
+
+ /* The first block on which the bootcode can be found. */
+ grub_uint32_t bootcode_pos;
+
+ /* The size of the bootcode in bytes. */
+ grub_uint32_t bootcode_size;
+
+ /* The load address of the bootcode. */
+ grub_uint32_t bootcode_loadaddr;
+
+ /* Reserved. */
+ grub_uint32_t reserved2;
+
+ /* The entrypoint of the bootcode. */
+ grub_uint32_t bootcode_entrypoint;
+
+ /* Reserved. */
+ grub_uint32_t reserved3;
+
+ /* A checksum of the bootcode. */
+ grub_uint32_t bootcode_checksum;
+
+ /* The processor type. */
+ char processor[16];
+
+ /* Padding. */
+ grub_uint16_t pad[187];
+};
+
+static struct grub_partition_map grub_apple_partition_map;
+
+#ifndef GRUB_UTIL
+static grub_dl_t my_mod;
+#endif
+
+
+static grub_err_t
+apple_partition_map_iterate (grub_disk_t disk,
+ int (*hook) (const grub_partition_t partition))
+{
+ struct grub_partition part;
+ struct grub_apple_part apart;
+ struct grub_disk raw;
+ int partno = 0;
+ int pos = GRUB_DISK_SECTOR_SIZE;
+
+ /* Enforce raw disk access. */
+ raw = *disk;
+ raw.partition = 0;
+
+ part.partmap = &grub_apple_partition_map;
+
+ for (;;)
+ {
+ if (grub_disk_read (&raw, pos / GRUB_DISK_SECTOR_SIZE,
+ pos % GRUB_DISK_SECTOR_SIZE,
+ sizeof (struct grub_apple_part), (char *) &apart))
+ return grub_errno;
+
+ if (apart.magic != GRUB_APPLE_PART_MAGIC)
+ break;
+
+ part.start = apart.first_phys_block;
+ part.len = apart.blockcnt;
+ part.offset = pos;
+ part.index = partno;
+
+ if (hook (&part))
+ return grub_errno;
+
+ if (apart.first_phys_block == GRUB_DISK_SECTOR_SIZE * 2)
+ return 0;
+
+ pos += sizeof (struct grub_apple_part);
+ partno++;
+ }
+
+ return 0;
+}
+
+
+static grub_partition_t
+apple_partition_map_probe (grub_disk_t disk, const char *str)
+{
+ grub_partition_t p = 0;
+ int partnum = 0;
+ char *s = (char *) str;
+
+ auto int find_func (const grub_partition_t partition);
+
+ int find_func (const grub_partition_t partition)
+ {
+ if (partnum == partition->index)
+ {
+ p = (grub_partition_t) grub_malloc (sizeof (*p));
+ if (! p)
+ return 1;
+
+ grub_memcpy (p, partition, sizeof (*p));
+ return 1;
+ }
+
+ return 0;
+ }
+
+ /* Get the partition number. */
+ partnum = grub_strtoul (s, 0, 10);
+ if (grub_errno)
+ {
+ grub_error (GRUB_ERR_BAD_FILENAME, "invalid partition");
+ return 0;
+ }
+
+ if (apple_partition_map_iterate (disk, find_func))
+ goto fail;
+
+ return p;
+
+ fail:
+ grub_free (p);
+ return 0;
+
+}
+
+
+static char *
+apple_partition_map_get_name (const grub_partition_t p)
+{
+ char *name;
+
+ name = grub_malloc (13);
+ if (! name)
+ return 0;
+
+ grub_sprintf (name, "%d", p->index);
+ return name;
+}
+
+
+/* Partition map type. */
+static struct grub_partition_map grub_apple_partition_map =
+ {
+ .name = "apple_partition_map",
+ .iterate = apple_partition_map_iterate,
+ .probe = apple_partition_map_probe,
+ .get_name = apple_partition_map_get_name
+ };
+
+#ifdef GRUB_UTIL
+void
+grub_apple_partition_map_init (void)
+{
+ grub_partition_map_register (&grub_apple_partition_map);
+}
+
+void
+grub_apple_partition_map_fini (void)
+{
+ grub_partition_map_unregister (&grub_apple_partition_map);
+}
+#else
+GRUB_MOD_INIT
+{
+ grub_partition_map_register (&grub_apple_partition_map);
+ my_mod = mod;
+}
+
+GRUB_MOD_FINI
+{
+ grub_partition_map_unregister (&grub_apple_partition_map);
+}
+#endif
Index: partmap/pc.c
===================================================================
RCS file: partmap/pc.c
diff -N partmap/pc.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ partmap/pc.c 24 Nov 2004 19:02:48 -0000
@@ -0,0 +1,314 @@
+/* pc.c - Read PC style partition tables. */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002, 2004 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <grub/partition.h>
+#include <grub/pc_partition.h>
+#include <grub/disk.h>
+#include <grub/mm.h>
+#include <grub/misc.h>
+#include <grub/dl.h>
+
+static struct grub_partition_map grub_pc_partition_map;
+
+#ifndef GRUB_UTIL
+static grub_dl_t my_mod;
+#endif
+
+
+/* Parse the partition representation in STR and return a partition. */
+static grub_partition_t
+grub_partition_parse (const char *str)
+{
+ grub_partition_t p;
+ struct grub_pc_partition *pcdata;
+
+ char *s = (char *) str;
+
+ p = (grub_partition_t) grub_malloc (sizeof (*p));
+ if (! p)
+ return 0;
+
+ pcdata = (struct grub_pc_partition *) grub_malloc (sizeof (*pcdata));
+ if (! pcdata)
+ goto fail;
+
+ p->data = pcdata;
+ p->partmap = &grub_pc_partition_map;
+
+ /* Initialize some of the fields with invalid values. */
+ pcdata->bsd_part = pcdata->dos_type = pcdata->bsd_type = p->index = -1;
+
+ /* Get the DOS partition number. */
+ pcdata->dos_part = grub_strtoul (s, &s, 0);
+
+ if (grub_errno)
+ {
+ /* Not found. Maybe only a BSD label is specified. */
+ pcdata->dos_part = -1;
+ grub_errno = GRUB_ERR_NONE;
+ }
+ else if (*s == ',')
+ s++;
+
+ if (*s)
+ {
+ if (*s >= 'a' && *s <= 'h')
+ {
+ pcdata->bsd_part = *s - 'a';
+ s++;
+ }
+
+ if (*s)
+ goto fail;
+ }
+
+ if (pcdata->dos_part == -1 && pcdata->bsd_part == -1)
+ goto fail;
+
+ return p;
+
+ fail:
+ grub_free (p);
+ grub_free (pcdata);
+ grub_error (GRUB_ERR_BAD_FILENAME, "invalid partition");
+ return 0;
+}
+
+static grub_err_t
+pc_partition_map_iterate (grub_disk_t disk,
+ int (*hook) (const grub_partition_t partition))
+{
+ struct grub_partition p;
+ struct grub_pc_partition pcdata;
+ struct grub_pc_partition_mbr mbr;
+ struct grub_pc_partition_disk_label label;
+ struct grub_disk raw;
+
+ /* Enforce raw disk access. */
+ raw = *disk;
+ raw.partition = 0;
+
+ p.offset = 0;
+ pcdata.ext_offset = 0;
+ pcdata.dos_part = -1;
+ p.data = &pcdata;
+ p.partmap = &grub_pc_partition_map;
+
+ while (1)
+ {
+ int i;
+ struct grub_pc_partition_entry *e;
+
+ /* Read the MBR. */
+ if (grub_disk_read (&raw, p.offset, 0, sizeof (mbr), (char *) &mbr))
+ goto finish;
+
+ /* Check if it is valid. */
+ if (mbr.signature != grub_cpu_to_le16 (GRUB_PC_PARTITION_SIGNATURE))
+ return grub_error (GRUB_ERR_BAD_PART_TABLE, "no signature");
+
+ /* Analyze DOS partitions. */
+ for (p.index = 0; p.index < 4; p.index++)
+ {
+ e = mbr.entries + p.index;
+
+ p.start = p.offset + grub_le_to_cpu32 (e->start);
+ p.len = grub_le_to_cpu32 (e->length);
+ pcdata.bsd_part = -1;
+ pcdata.dos_type = e->type;
+ pcdata.bsd_type = -1;
+
+ /* If this partition is a normal one, call the hook. */
+ if (! grub_pc_partition_is_empty (e->type)
+ && ! grub_pc_partition_is_extended (e->type))
+ {
+ pcdata.dos_part++;
+
+ if (hook (&p))
+ goto finish;
+
+ /* Check if this is a BSD partition. */
+ if (grub_pc_partition_is_bsd (e->type))
+ {
+ /* Check if the BSD label is within the DOS partition. */
+ if (p.len <= GRUB_PC_PARTITION_BSD_LABEL_SECTOR)
+ return grub_error (GRUB_ERR_BAD_PART_TABLE,
+ "no space for disk label");
+
+ /* Read the BSD label. */
+ if (grub_disk_read (&raw,
+ (p.start
+ + GRUB_PC_PARTITION_BSD_LABEL_SECTOR),
+ 0,
+ sizeof (label),
+ (char *) &label))
+ goto finish;
+
+ /* Check if it is valid. */
+ if (label.magic
+ != grub_cpu_to_le32 (GRUB_PC_PARTITION_BSD_LABEL_MAGIC))
+ return grub_error (GRUB_ERR_BAD_PART_TABLE,
+ "invalid disk label magic");
+
+ for (pcdata.bsd_part = 0;
+ pcdata.bsd_part < grub_cpu_to_le16
(label.num_partitions);
+ pcdata.bsd_part++)
+ {
+ struct grub_pc_partition_bsd_entry *be
+ = label.entries + pcdata.bsd_part;
+
+ p.start = grub_le_to_cpu32 (be->offset);
+ p.len = grub_le_to_cpu32 (be->size);
+ pcdata.bsd_type = be->fs_type;
+
+ if (be->fs_type != GRUB_PC_PARTITION_BSD_TYPE_UNUSED)
+ if (hook (&p))
+ goto finish;
+ }
+ }
+ }
+ else if (pcdata.dos_part < 4)
+ /* If this partition is a logical one, shouldn't increase the
+ partition number. */
+ pcdata.dos_part++;
+ }
+
+ /* Find an extended partition. */
+ for (i = 0; i < 4; i++)
+ {
+ e = mbr.entries + i;
+
+ if (grub_pc_partition_is_extended (e->type))
+ {
+ p.offset = pcdata.ext_offset + grub_le_to_cpu32 (e->start);
+ if (! pcdata.ext_offset)
+ pcdata.ext_offset = p.offset;
+
+ break;
+ }
+ }
+
+ /* If no extended partition, the end. */
+ if (i == 4)
+ break;
+ }
+
+ finish:
+ return grub_errno;
+}
+
+
+static grub_partition_t
+pc_partition_map_probe (grub_disk_t disk, const char *str)
+{
+ grub_partition_t p;
+ struct grub_pc_partition *pcdata;
+
+ auto int find_func (const grub_partition_t partition);
+
+ int find_func (const grub_partition_t partition)
+ {
+ struct grub_pc_partition *partdata = partition->data;
+ if ((pcdata->dos_part == partdata->dos_part || pcdata->dos_part == -1)
+ && pcdata->bsd_part == partdata->bsd_part)
+ {
+ grub_memcpy (p, partition, sizeof (*p));
+ grub_memcpy (pcdata, partdata, sizeof (*pcdata));
+ return 1;
+ }
+
+ return 0;
+ }
+
+ p = grub_partition_parse (str);
+ if (! p)
+ return 0;
+
+ pcdata = p->data;
+ if (pc_partition_map_iterate (disk, find_func))
+ goto fail;
+
+ if (p->index < 0)
+ {
+ grub_error (GRUB_ERR_BAD_DEVICE, "no such partition");
+ goto fail;
+ }
+
+ return p;
+
+ fail:
+ grub_free (p);
+ grub_free (pcdata);
+ return 0;
+}
+
+
+static char *
+pc_partition_map_get_name (const grub_partition_t p)
+{
+ char *name;
+ struct grub_pc_partition *pcdata = p->data;
+
+ name = grub_malloc (13);
+ if (! name)
+ return 0;
+
+ if (pcdata->bsd_part < 0)
+ grub_sprintf (name, "%d", pcdata->dos_part);
+ else
+ grub_sprintf (name, "%d,%c", pcdata->dos_part, pcdata->bsd_part + 'a');
+
+ return name;
+}
+
+
+/* Partition map type. */
+static struct grub_partition_map grub_pc_partition_map =
+ {
+ .name = "pc_partition_map",
+ .iterate = pc_partition_map_iterate,
+ .probe = pc_partition_map_probe,
+ .get_name = pc_partition_map_get_name
+ };
+
+#ifdef GRUB_UTIL
+void
+grub_pc_partition_map_init (void)
+{
+ grub_partition_map_register (&grub_pc_partition_map);
+}
+
+void
+grub_pc_partition_map_fini (void)
+{
+ grub_partition_map_unregister (&grub_pc_partition_map);
+}
+#else
+GRUB_MOD_INIT
+{
+ grub_partition_map_register (&grub_pc_partition_map);
+ my_mod = mod;
+}
+
+GRUB_MOD_FINI
+{
+ grub_partition_map_unregister (&grub_pc_partition_map);
+}
+#endif
Index: util/grub-emu.c
===================================================================
RCS file: /cvsroot/grub/grub2/util/grub-emu.c,v
retrieving revision 1.8
diff -u -p -u -p -r1.8 grub-emu.c
--- util/grub-emu.c 1 Nov 2004 16:14:16 -0000 1.8
+++ util/grub-emu.c 24 Nov 2004 19:02:49 -0000
@@ -34,6 +34,7 @@
#include <grub/normal.h>
#include <grub/util/getroot.h>
#include <grub/env.h>
+#include <grub/partition.h>
#ifdef __NetBSD__
/* NetBSD uses /boot for its boot block. */
@@ -154,6 +155,9 @@ main (int argc, char *argv[])
/* XXX: This is a bit unportable. */
grub_util_biosdisk_init (args.dev_map);
+ grub_pc_partition_map_init ();
+ grub_amiga_partition_map_init ();
+ grub_apple_partition_map_init ();
/* Initialize the default modules. */
grub_iso9660_init ();
@@ -187,6 +191,9 @@ main (int argc, char *argv[])
grub_cmp_fini ();
grub_cat_fini ();
grub_terminal_fini ();
-
+ grub_amiga_partition_map_fini ();
+ grub_pc_partition_map_fini ();
+ grub_apple_partition_map_fini ();
+
return 0;
}
Index: util/i386/pc/biosdisk.c
===================================================================
RCS file: /cvsroot/grub/grub2/util/i386/pc/biosdisk.c,v
retrieving revision 1.8
diff -u -p -u -p -r1.8 biosdisk.c
--- util/i386/pc/biosdisk.c 21 Aug 2004 13:54:22 -0000 1.8
+++ util/i386/pc/biosdisk.c 24 Nov 2004 19:02:49 -0000
@@ -20,7 +20,8 @@
#include <grub/machine/biosdisk.h>
#include <grub/disk.h>
-#include <grub/machine/partition.h>
+#include <grub/partition.h>
+#include <grub/pc_partition.h>
#include <grub/types.h>
#include <grub/err.h>
#include <grub/util/misc.h>
@@ -736,18 +737,34 @@ grub_util_biosdisk_get_grub_dev (const c
int find_partition (const grub_partition_t partition)
{
- if (partition->bsd_part < 0)
- grub_util_info ("DOS partition %d starts from %lu",
- partition->dos_part, partition->start);
- else
- grub_util_info ("BSD partition %d,%c starts from %lu",
- partition->dos_part, partition->bsd_part + 'a',
- partition->start);
+ struct grub_pc_partition *pcdata = 0;
+
+ if (!strcmp (partition->partmap->name, "pc"))
+ pcdata = partition->data;
+
+ if (pcdata)
+ {
+ if (pcdata->bsd_part < 0)
+ grub_util_info ("DOS partition %d starts from %lu",
+ pcdata->dos_part, partition->start);
+ else
+ grub_util_info ("BSD partition %d,%c starts from %lu",
+ pcdata->dos_part, pcdata->bsd_part + 'a',
+ partition->start);
+ }
if (hdg.start == partition->start)
{
- dos_part = partition->dos_part;
- bsd_part = partition->bsd_part;
+ if (pcdata)
+ {
+ dos_part = pcdata->dos_part;
+ bsd_part = pcdata->bsd_part;
+ }
+ else
+ {
+ dos_part = 0;
+ bsd_part = 0;
+ }
return 1;
}
Index: util/i386/pc/grub-setup.c
===================================================================
RCS file: /cvsroot/grub/grub2/util/i386/pc/grub-setup.c,v
retrieving revision 1.8
diff -u -p -u -p -r1.8 grub-setup.c
--- util/i386/pc/grub-setup.c 4 Apr 2004 13:46:03 -0000 1.8
+++ util/i386/pc/grub-setup.c 24 Nov 2004 19:02:49 -0000
@@ -25,7 +25,8 @@
#include <grub/disk.h>
#include <grub/file.h>
#include <grub/fs.h>
-#include <grub/machine/partition.h>
+#include <grub/partition.h>
+#include <grub/pc_partition.h>
#include <grub/machine/util/biosdisk.h>
#include <grub/machine/boot.h>
#include <grub/machine/kernel.h>
@@ -107,8 +108,10 @@ setup (const char *prefix, const char *d
int find_first_partition_start (const grub_partition_t p)
{
- if (! grub_partition_is_empty (p->dos_type)
- && ! grub_partition_is_bsd (p->dos_type)
+ struct grub_pc_partition *pcdata = p->data;
+
+ if (! grub_pc_partition_is_empty (pcdata->dos_type)
+ && ! grub_pc_partition_is_bsd (pcdata->dos_type)
&& first_start > p->start)
first_start = p->start;
@@ -252,10 +255,16 @@ setup (const char *prefix, const char *d
/* Embed information about the installed location. */
if (root_dev->disk->partition)
{
+ struct grub_pc_partition *pcdata =
+ root_dev->disk->partition->data;
+
+ if (strcmp (root_dev->disk->partition->partmap->name, "pc"))
+ grub_util_error ("No PC style partitions found");
+
*install_dos_part
- = grub_cpu_to_le32 (root_dev->disk->partition->dos_part);
+ = grub_cpu_to_le32 (pcdata->dos_part);
*install_bsd_part
- = grub_cpu_to_le32 (root_dev->disk->partition->bsd_part);
+ = grub_cpu_to_le32 (pcdata->bsd_part);
}
else
*install_dos_part = *install_bsd_part = grub_cpu_to_le32 (-1);
@@ -400,10 +409,16 @@ setup (const char *prefix, const char *d
/* Embed information about the installed location. */
if (root_dev->disk->partition)
{
+ struct grub_pc_partition *pcdata =
+ root_dev->disk->partition->data;
+
+ if (strcmp (root_dev->disk->partition->partmap->name, "pc"))
+ grub_util_error ("No PC style partitions found");
+
*install_dos_part
- = grub_cpu_to_le32 (root_dev->disk->partition->dos_part);
+ = grub_cpu_to_le32 (pcdata->dos_part);
*install_bsd_part
- = grub_cpu_to_le32 (root_dev->disk->partition->bsd_part);
+ = grub_cpu_to_le32 (pcdata->bsd_part);
}
else
*install_dos_part = *install_bsd_part = grub_cpu_to_le32 (-1);
- Re: Partition modules, (continued)
Re: Partition modules, Yoshinori K. Okuji, 2004/11/18
Re: Partition modules, Timothy Baldwin, 2004/11/22
Re: Partition modules,
Marco Gerards <=