diff --git a/ChangeLog b/ChangeLog index 872fe61ae..0359a19aa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2012-03-26 Vladimir Serbinenko + + Handle big-endian mdraid. + + * Makefile.util.def (libgrubkern): Add mdraid_linux_be.c. + * grub-core/Makefile.core.def (mdraid09_be): New module. + * grub-core/disk/mdraid_linux.c: Use grub_md_to_cpu* and grub_cpu_to_md* + rather than grub_le_to_cpu* and grub_cpu_to_le*. + * grub-core/disk/mdraid_linux_be.c: New file. + 2012-03-26 Vladimir Serbinenko * grub-core/gettext/gettext.c (GRUB_MOD_INIT): Handle errors. diff --git a/Makefile.util.def b/Makefile.util.def index 85e71ed60..8e2c551bd 100644 --- a/Makefile.util.def +++ b/Makefile.util.def @@ -53,6 +53,7 @@ library = { common = grub-core/disk/loopback.c; common = grub-core/disk/lvm.c; common = grub-core/disk/mdraid_linux.c; + common = grub-core/disk/mdraid_linux_be.c; common = grub-core/disk/mdraid1x_linux.c; common = grub-core/disk/raid5_recover.c; common = grub-core/disk/raid6_recover.c; diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def index fe3032f97..e3da9a6e3 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -892,6 +892,11 @@ module = { common = disk/mdraid_linux.c; }; +module = { + name = mdraid09_be; + common = disk/mdraid_linux_be.c; +}; + module = { name = mdraid1x; common = disk/mdraid1x_linux.c; diff --git a/grub-core/disk/mdraid_linux.c b/grub-core/disk/mdraid_linux.c index 7a2551364..961020950 100644 --- a/grub-core/disk/mdraid_linux.c +++ b/grub-core/disk/mdraid_linux.c @@ -29,6 +29,22 @@ GRUB_MOD_LICENSE ("GPLv3+"); +#ifdef MODE_BIGENDIAN +#define grub_md_to_cpu64 grub_be_to_cpu64 +#define grub_md_to_cpu32 grub_be_to_cpu32 +#define grub_md_to_cpu16 grub_be_to_cpu16 +#define grub_cpu_to_md64_compile_time grub_cpu_to_be64 +#define grub_cpu_to_md32_compile_time grub_cpu_to_be32 +#define grub_cpu_to_md16_compile_time grub_cpu_to_be16 +#else +#define grub_md_to_cpu64 grub_le_to_cpu64 +#define grub_md_to_cpu32 grub_le_to_cpu32 +#define grub_md_to_cpu16 grub_le_to_cpu16 +#define grub_cpu_to_md64_compile_time grub_cpu_to_le64 +#define grub_cpu_to_md32_compile_time grub_cpu_to_le32 +#define grub_cpu_to_md16_compile_time grub_cpu_to_le16 +#endif + #define RESERVED_BYTES (64 * 1024) #define RESERVED_SECTORS (RESERVED_BYTES / 512) @@ -183,23 +199,23 @@ grub_mdraid_detect (grub_disk_t disk, return NULL; /* Look whether there is a mdraid 0.90 superblock. */ - if (sb.md_magic != grub_cpu_to_le32_compile_time (SB_MAGIC)) + if (sb.md_magic != grub_cpu_to_md32_compile_time (SB_MAGIC)) /* not 0.9x raid. */ return NULL; - if (sb.major_version != grub_cpu_to_le32_compile_time (0) - || sb.minor_version != grub_cpu_to_le32_compile_time (90)) + if (sb.major_version != grub_cpu_to_md32_compile_time (0) + || sb.minor_version != grub_cpu_to_md32_compile_time (90)) /* Unsupported version. */ return NULL; /* No need for explicit check that sb.size is 0 (unspecified) since 0 >= non-0 is false. */ - if (((grub_disk_addr_t) grub_le_to_cpu32 (sb.size)) * 2 >= size) + if (((grub_disk_addr_t) grub_md_to_cpu32 (sb.size)) * 2 >= size) return NULL; /* FIXME: Check the checksum. */ - level = grub_le_to_cpu32 (sb.level); + level = grub_md_to_cpu32 (sb.level); /* Multipath. */ if ((int) level == -4) level = 1; @@ -211,8 +227,8 @@ grub_mdraid_detect (grub_disk_t disk, "unsupported RAID level: %d", level); return NULL; } - if (grub_le_to_cpu32 (sb.this_disk.number) == 0xffff - || grub_le_to_cpu32 (sb.this_disk.number) == 0xfffe) + if (grub_md_to_cpu32 (sb.this_disk.number) == 0xffff + || grub_md_to_cpu32 (sb.this_disk.number) == 0xfffe) /* Spares aren't implemented. */ return NULL; @@ -228,32 +244,44 @@ grub_mdraid_detect (grub_disk_t disk, *start_sector = 0; id->uuidlen = 0; - id->id = grub_le_to_cpu32 (sb.this_disk.number); + id->id = grub_md_to_cpu32 (sb.this_disk.number); char buf[32]; - grub_snprintf (buf, sizeof (buf), "md%d", grub_le_to_cpu32 (sb.md_minor)); + grub_snprintf (buf, sizeof (buf), "md%d", grub_md_to_cpu32 (sb.md_minor)); return grub_diskfilter_make_raid (16, (char *) uuid, - grub_le_to_cpu32 (sb.raid_disks), buf, + grub_md_to_cpu32 (sb.raid_disks), buf, (sb.size) ? ((grub_disk_addr_t) - grub_le_to_cpu32 (sb.size)) * 2 + grub_md_to_cpu32 (sb.size)) * 2 : sector, - grub_le_to_cpu32 (sb.chunk_size) >> 9, - grub_le_to_cpu32 (sb.layout), + grub_md_to_cpu32 (sb.chunk_size) >> 9, + grub_md_to_cpu32 (sb.layout), level); } static struct grub_diskfilter grub_mdraid_dev = { +#ifdef MODE_BIGENDIAN + .name = "mdraid09_be", +#else .name = "mdraid09", +#endif .detect = grub_mdraid_detect, .next = 0 }; +#ifdef MODE_BIGENDIAN +GRUB_MOD_INIT (mdraid09_be) +#else GRUB_MOD_INIT (mdraid09) +#endif { grub_diskfilter_register (&grub_mdraid_dev); } +#ifdef MODE_BIGENDIAN +GRUB_MOD_FINI (mdraid09_be) +#else GRUB_MOD_FINI (mdraid09) +#endif { grub_diskfilter_unregister (&grub_mdraid_dev); } diff --git a/grub-core/disk/mdraid_linux_be.c b/grub-core/disk/mdraid_linux_be.c new file mode 100644 index 000000000..539bcf469 --- /dev/null +++ b/grub-core/disk/mdraid_linux_be.c @@ -0,0 +1,2 @@ +#define MODE_BIGENDIAN 1 +#include "mdraid_linux.c"