Re: [PATCH] gptsync
Commited On Wed, Apr 22, 2009 at 1:38 AM, Vladimir Serbinenko phco...@gmail.comwrote: HFS autodetect added. With changelog this time. Should already be suitable for inclusion On Wed, Apr 22, 2009 at 12:03 AM, Vladimir Serbinenko phco...@gmail.comwrote: On Tue, Apr 21, 2009 at 9:49 PM, Isaac Dupree m...@isaac.cedarswampstudios.org wrote: Peter Cros wrote: I don't think it is compatible with current MBR/GPT hybrid ?partitioning on intel macs for grub-pc booting. well, it doesn't necessarily order the partitions in the same way as e.g. rEFIt gptsync does, but that's because this GRUB implementation gives you more control! You can even pick different MBR-partition-configurations, before booting different OSes. Yes it was written with such possibility in mind. I don't see why grub2 will enforce mbr partitions to be sorted since mbr doesn't require such thing. If you ask grub2 to put partitions in reverse order it does it. As to partition in zeroth slot it spans across the space before the first MBR partition and is so called protective partition and is required for some tools including grub2 itself to recognise gpt disk as such. About compatibiliy: hybrid MBR is against specifications - it's a trick to boot legacy OS. So the only compatibility you can speak about is the ability to boot a legacy OS of your choice. Vladimir Serbinenko wrote: Here there are 2 differences. First partition type for hfs+ isn't autodetected, I will fix this, just I thought it ws unnecessary AFAIK every OS which understands HFS+ understands GPT. At least Mac OS X 10.3 and earlier don't understand GPT, and it actually makes a difference with Apple's target disk mode! And there may be a few other combinations. Ok -Isaac ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel -- Regards Vladimir 'phcoder' Serbinenko ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH] gptsync
Hi, I have been playing with grub gptsync, on apple intel mac with GUID partitioned 8 GB usb stick, 8 partitions. #1 is the standard fat32 EFI system part for macs. I am comparing with the gptsync utility from linux, or rEFIt gptsync, currently used for macs booting pc-bios bootloader. It is working to allow selection of GPT partions for MBR 2, 3, 4 but some of the numbers look wrong. I have not tried setting flags. grub gptsync is not handling MBR partition table 1 the same way as current linux or refit gptsync, which puts GPT partition 1 (EFI system FAT32) in MBR part1. GPT Partions are (512 byte sectors) Current GPT partition table: # Start LBA End LBA Type 1 40 409639 EFI System (FAT) 2 409640 2395367 Mac OS X HFS+ 32395368 4573255 Mac OS X HFS+ 44835400 7141399 Mac OS X HFS+ 57403544 9965767 Mac OS X HFS+ 6 10227912 13046359 Mac OS X HFS+ 7 13308504 15642623 Mac OS X HFS+ 8 15904768 15949783 Mac OS X HFS+ There seems to be agreement about start and end on MBR table partitions 2 3 4, using grub gptsync (hd0) 2 3 4. Other bytes differ (type, flags). This is after grub gptsync (hd0) 2 3 4 (MBR part1 was initially set by linux gptsync) p...@im81:~$ sudo hexdump -Cn80 -s432 /dev/sdb [sudo] password for pxw: 01b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 || 01c0 02 00 ee 7f 0e 19 01 00 00 00 27 40 06 00 00 7f |..'@| 01d0 0f 19 83 1a 2d 95 28 40 06 00 c0 4c 1e 00 00 1a |-.(@...L| 01e0 2e 95 83 ab 57 1c e8 8c 24 00 60 3b 21 00 00 fc |W...$.`;!...| 01f0 59 2c 83 87 63 bc 48 c8 49 00 d0 2f 23 00 55 aa |Y,..c.H.I../#.U.| 0200 Then as seen in linux gptsync, Current MBR partition table: # AStart LBA End LBA Type 1 1 409639 ee EFI Protective 2 409640 2395367 83 Linux 32395368 4573255 83 Linux 44835400 7141399 83 Linux Status: MBR table must be updated. Proposed new MBR partition table: # AStart LBA End LBA Type 1 1 409639 ee EFI Protective 2 * 409640 2395367 af Mac OS X HFS+ 32395368 4573255 af Mac OS X HFS+ 44835400 7141399 af Mac OS X HFS+ May I update the MBR as printed above? [y/N] y Yes p...@im81:~$ sudo hexdump -Cn80 -s432 /dev/sdb 01b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fe || 01c0 ff ff ee fe ff ff 01 00 00 00 27 40 06 00 80 fe |..'@| 01d0 ff ff af fe ff ff 28 40 06 00 c0 4c 1e 00 00 fe |..(@...L| 01e0 ff ff af fe ff ff e8 8c 24 00 60 3b 21 00 00 fe |$.`;!...| 01f0 ff ff af fe ff ff 48 c8 49 00 d0 2f 23 00 55 aa |..H.I../#.U.| 0200 -- Cros (pxw) ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH] gptsync
On Tue, Apr 21, 2009 at 1:29 PM, Peter Cros pxwp...@gmail.com wrote: Hi, I have been playing with grub gptsync, on apple intel mac with GUID partitioned 8 GB usb stick, 8 partitions. #1 is the standard fat32 EFI system part for macs. I am comparing with the gptsync utility from linux, or rEFIt gptsync, currently used for macs booting pc-bios bootloader. It is working to allow selection of GPT partions for MBR 2, 3, 4 but some of the numbers look wrong. I have not tried setting flags. grub gptsync is not handling MBR partition table 1 the same way as current linux or refit gptsync, which puts GPT partition 1 (EFI system FAT32) in MBR part1. I don't understand what you mean. I will not do any special treatment for EFI system partition. As far as I'm concerned it's just a partition. I don't think it's a problem since user can ask which partitions to put in MBR GPT Partions are (512 byte sectors) Current GPT partition table: # Start LBA End LBA Type 1 40 409639 EFI System (FAT) 2 409640 2395367 Mac OS X HFS+ 32395368 4573255 Mac OS X HFS+ 44835400 7141399 Mac OS X HFS+ 57403544 9965767 Mac OS X HFS+ 6 10227912 13046359 Mac OS X HFS+ 7 13308504 15642623 Mac OS X HFS+ 8 15904768 15949783 Mac OS X HFS+ There seems to be agreement about start and end on MBR table partitions 2 3 4, using grub gptsync (hd0) 2 3 4. Other bytes differ (type, flags). This is after grub gptsync (hd0) 2 3 4 (MBR part1 was initially set by linux gptsync) p...@im81:~$ sudo hexdump -Cn80 -s432 /dev/sdb [sudo] password for pxw: 01b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 || 01c0 02 00 ee 7f 0e 19 01 00 00 00 27 40 06 00 00 7f |..'@| 01d0 0f 19 83 1a 2d 95 28 40 06 00 c0 4c 1e 00 00 1a |-.(@...L| 01e0 2e 95 83 ab 57 1c e8 8c 24 00 60 3b 21 00 00 fc |W...$.`;!...| 01f0 59 2c 83 87 63 bc 48 c8 49 00 d0 2f 23 00 55 aa |Y,..c.H.I../#.U.| 0200 Then as seen in linux gptsync, Current MBR partition table: # AStart LBA End LBA Type 1 1 409639 ee EFI Protective 2 409640 2395367 83 Linux 32395368 4573255 83 Linux 44835400 7141399 83 Linux Status: MBR table must be updated. Proposed new MBR partition table: # AStart LBA End LBA Type 1 1 409639 ee EFI Protective 2 * 409640 2395367 af Mac OS X HFS+ 32395368 4573255 af Mac OS X HFS+ 44835400 7141399 af Mac OS X HFS+ May I update the MBR as printed above? [y/N] y Yes Here there are 2 differences. First partition type for hfs+ isn't autodetected, I will fix this, just I thought it ws unnecessary AFAIK every OS which understands HFS+ understands GPT. The second thing is that none of partiion is active. Here you have just to tell which partition is active. You can have the same behavior as OSX gptsync with command gptsync hd0 2+0xaf 3-0xaf 4-0xaf Once I add hfs+ autodetect it will be enough to do gptsync hd0 2+ 3 4 p...@im81:~$ sudo hexdump -Cn80 -s432 /dev/sdb 01b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fe || 01c0 ff ff ee fe ff ff 01 00 00 00 27 40 06 00 80 fe |..'@| 01d0 ff ff af fe ff ff 28 40 06 00 c0 4c 1e 00 00 fe |..(@...L| 01e0 ff ff af fe ff ff e8 8c 24 00 60 3b 21 00 00 fe |$.`;!...| 01f0 ff ff af fe ff ff 48 c8 49 00 d0 2f 23 00 55 aa |..H.I../#.U.| 0200 -- Cros (pxw) ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH] gptsync
There appears to be a small bug there. For example - gptsync (hd0) 4 2 3 will write data for GPT partition 4 2 3 to MBR partition table 2 3 4 but also GPT partition 1 to MBR partition 1 (which is actually what happens now for intel mac.) And similarly for other selections will write the next lower gpt partition number to MBR partition 1 slot. I don't think it is compatible with current MBR/GPT hybrid partitioning on intel macs for grub-pc booting. On Wed, Apr 22, 2009 at 1:10 AM, Vladimir Serbinenko phco...@gmail.comwrote: On Tue, Apr 21, 2009 at 1:29 PM, Peter Cros pxwp...@gmail.com wrote: Hi, I have been playing with grub gptsync, on apple intel mac with GUID partitioned 8 GB usb stick, 8 partitions. #1 is the standard fat32 EFI system part for macs. I am comparing with the gptsync utility from linux, or rEFIt gptsync, currently used for macs booting pc-bios bootloader. It is working to allow selection of GPT partions for MBR 2, 3, 4 but some of the numbers look wrong. I have not tried setting flags. grub gptsync is not handling MBR partition table 1 the same way as current linux or refit gptsync, which puts GPT partition 1 (EFI system FAT32) in MBR part1. I don't understand what you mean. I will not do any special treatment for EFI system partition. As far as I'm concerned it's just a partition. I don't think it's a problem since user can ask which partitions to put in MBR GPT Partions are (512 byte sectors) Current GPT partition table: # Start LBA End LBA Type 1 40 409639 EFI System (FAT) 2 409640 2395367 Mac OS X HFS+ 32395368 4573255 Mac OS X HFS+ 44835400 7141399 Mac OS X HFS+ 57403544 9965767 Mac OS X HFS+ 6 10227912 13046359 Mac OS X HFS+ 7 13308504 15642623 Mac OS X HFS+ 8 15904768 15949783 Mac OS X HFS+ There seems to be agreement about start and end on MBR table partitions 2 3 4, using grub gptsync (hd0) 2 3 4. Other bytes differ (type, flags). This is after grub gptsync (hd0) 2 3 4 (MBR part1 was initially set by linux gptsync) p...@im81:~$ sudo hexdump -Cn80 -s432 /dev/sdb [sudo] password for pxw: 01b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 || 01c0 02 00 ee 7f 0e 19 01 00 00 00 27 40 06 00 00 7f |..'@| 01d0 0f 19 83 1a 2d 95 28 40 06 00 c0 4c 1e 00 00 1a |-.(@...L| 01e0 2e 95 83 ab 57 1c e8 8c 24 00 60 3b 21 00 00 fc |W...$.`;!...| 01f0 59 2c 83 87 63 bc 48 c8 49 00 d0 2f 23 00 55 aa |Y,..c.H.I../#.U.| 0200 Then as seen in linux gptsync, Current MBR partition table: # AStart LBA End LBA Type 1 1 409639 ee EFI Protective 2 409640 2395367 83 Linux 32395368 4573255 83 Linux 44835400 7141399 83 Linux Status: MBR table must be updated. Proposed new MBR partition table: # AStart LBA End LBA Type 1 1 409639 ee EFI Protective 2 * 409640 2395367 af Mac OS X HFS+ 32395368 4573255 af Mac OS X HFS+ 44835400 7141399 af Mac OS X HFS+ May I update the MBR as printed above? [y/N] y Yes Here there are 2 differences. First partition type for hfs+ isn't autodetected, I will fix this, just I thought it ws unnecessary AFAIK every OS which understands HFS+ understands GPT. The second thing is that none of partiion is active. Here you have just to tell which partition is active. You can have the same behavior as OSX gptsync with command gptsync hd0 2+0xaf 3-0xaf 4-0xaf Once I add hfs+ autodetect it will be enough to do gptsync hd0 2+ 3 4 p...@im81:~$ sudo hexdump -Cn80 -s432 /dev/sdb 01b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fe || 01c0 ff ff ee fe ff ff 01 00 00 00 27 40 06 00 80 fe |..'@| 01d0 ff ff af fe ff ff 28 40 06 00 c0 4c 1e 00 00 fe |..(@...L| 01e0 ff ff af fe ff ff e8 8c 24 00 60 3b 21 00 00 fe |$.`;!...| 01f0 ff ff af fe ff ff 48 c8 49 00 d0 2f 23 00 55 aa |..H.I../#.U.| 0200 -- Cros (pxw) ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel -- Cros (pxw) ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH] gptsync
Peter Cros wrote: I don't think it is compatible with current MBR/GPT hybrid ?partitioning on intel macs for grub-pc booting. well, it doesn't necessarily order the partitions in the same way as e.g. rEFIt gptsync does, but that's because this GRUB implementation gives you more control! You can even pick different MBR-partition-configurations, before booting different OSes. Vladimir Serbinenko wrote: Here there are 2 differences. First partition type for hfs+ isn't autodetected, I will fix this, just I thought it ws unnecessary AFAIK every OS which understands HFS+ understands GPT. At least Mac OS X 10.3 and earlier don't understand GPT, and it actually makes a difference with Apple's target disk mode! And there may be a few other combinations. -Isaac ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH] gptsync
On Tue, Apr 21, 2009 at 9:49 PM, Isaac Dupree m...@isaac.cedarswampstudios.org wrote: Peter Cros wrote: I don't think it is compatible with current MBR/GPT hybrid ?partitioning on intel macs for grub-pc booting. well, it doesn't necessarily order the partitions in the same way as e.g. rEFIt gptsync does, but that's because this GRUB implementation gives you more control! You can even pick different MBR-partition-configurations, before booting different OSes. Yes it was written with such possibility in mind. I don't see why grub2 will enforce mbr partitions to be sorted since mbr doesn't require such thing. If you ask grub2 to put partitions in reverse order it does it. As to partition in zeroth slot it spans across the space before the first MBR partition and is so called protective partition and is required for some tools including grub2 itself to recognise gpt disk as such. About compatibiliy: hybrid MBR is against specifications - it's a trick to boot legacy OS. So the only compatibility you can speak about is the ability to boot a legacy OS of your choice. Vladimir Serbinenko wrote: Here there are 2 differences. First partition type for hfs+ isn't autodetected, I will fix this, just I thought it ws unnecessary AFAIK every OS which understands HFS+ understands GPT. At least Mac OS X 10.3 and earlier don't understand GPT, and it actually makes a difference with Apple's target disk mode! And there may be a few other combinations. Ok -Isaac ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH] gptsync
HFS autodetect added. With changelog this time. Should already be suitable for inclusion On Wed, Apr 22, 2009 at 12:03 AM, Vladimir Serbinenko phco...@gmail.comwrote: On Tue, Apr 21, 2009 at 9:49 PM, Isaac Dupree m...@isaac.cedarswampstudios.org wrote: Peter Cros wrote: I don't think it is compatible with current MBR/GPT hybrid ?partitioning on intel macs for grub-pc booting. well, it doesn't necessarily order the partitions in the same way as e.g. rEFIt gptsync does, but that's because this GRUB implementation gives you more control! You can even pick different MBR-partition-configurations, before booting different OSes. Yes it was written with such possibility in mind. I don't see why grub2 will enforce mbr partitions to be sorted since mbr doesn't require such thing. If you ask grub2 to put partitions in reverse order it does it. As to partition in zeroth slot it spans across the space before the first MBR partition and is so called protective partition and is required for some tools including grub2 itself to recognise gpt disk as such. About compatibiliy: hybrid MBR is against specifications - it's a trick to boot legacy OS. So the only compatibility you can speak about is the ability to boot a legacy OS of your choice. Vladimir Serbinenko wrote: Here there are 2 differences. First partition type for hfs+ isn't autodetected, I will fix this, just I thought it ws unnecessary AFAIK every OS which understands HFS+ understands GPT. At least Mac OS X 10.3 and earlier don't understand GPT, and it actually makes a difference with Apple's target disk mode! And there may be a few other combinations. Ok -Isaac ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel diff --git a/ChangeLog b/ChangeLog index ca0ab43..2a2ba20 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2009-04-21 Vladimir Serbinenko phco...@gmail.com + + gptsync + + * commands/gptsync.c: new file + * conf/common.rmk (pkglib_MODULES): add gptsync.mod + (gptsync_mod_SOURCES): new variable + (gptsync_mod_CFLAGS): likewise + (gptsync_mod_LDFLAGS): likewise + * include/grub/pc_partition.h (GRUB_PC_PARTITION_TYPE_NTFS): + new definition + (GRUB_PC_PARTITION_TYPE_HFS): likewise + * conf/i386-coreboot.rmk (grub_emu_SOURCES): add commands/gptsync.c + * conf/i386-ieee1275.rmk: likewise + * conf/i386-pc.rmk: likewise + * conf/powerpc-ieee1275.rmk: likewise + + 2009-04-19 Vladimir Serbinenko phco...@gmail.com Correct GPT definition diff --git a/commands/gptsync.c b/commands/gptsync.c new file mode 100644 index 000..cbedf45 --- /dev/null +++ b/commands/gptsync.c @@ -0,0 +1,255 @@ +/* gptsync.c - fill the mbr based on gpt entries */ +/* XXX: I don't know what to do if sector size isn't 512 bytes */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2009 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/command.h +#include grub/dl.h +#include grub/device.h +#include grub/disk.h +#include grub/pc_partition.h +#include grub/partition.h +#include grub/misc.h +#include grub/mm.h +#include grub/fs.h + +/* Convert a LBA address to a CHS address in the INT 13 format. */ +/* Taken from grub1. */ +/* XXX: use hardcoded geometry of C = 1024, H = 255, S = 63. + Is it a problem? +*/ +static void +lba_to_chs (int lba, grub_uint8_t *cl, grub_uint8_t *ch, + grub_uint8_t *dh) +{ + int cylinder, head, sector; + int sectors = 63, heads = 255, cylinders = 1024; + + sector = lba % sectors + 1; + head = (lba / sectors) % heads; + cylinder = lba / (sectors * heads); + + if (cylinder = cylinders) +{ + *cl = *ch = *dh = 0xff; + return; +} + + *cl = sector | ((cylinder 0x300) 2); + *ch = cylinder 0xFF; + *dh = head; +} + +static grub_err_t +grub_cmd_gptsync (grub_command_t cmd __attribute__ ((unused)), + int argc, char **args) +{ + grub_device_t dev; + struct grub_pc_partition_mbr mbr; + struct grub_partition *partition; + grub_disk_addr_t first_sector; + int numactive = 0; + + if (argc 1) +return grub_error (GRUB_ERR_BAD_ARGUMENT, device name required); + if (argc 4) +return grub_error (GRUB_ERR_BAD_ARGUMENT, only 3 partitions can be + in hybrid MBR); + + if (args[0][0] == '('
Re: [PATCH] gptsync
Hi, Compiled with rev 2121, --with-platform=efi but got no gptsync module. It could be a useful tool for macs, I would like to try it. On Mon, Apr 20, 2009 at 9:17 AM, Vladimir Serbinenko phco...@gmail.comwrote: Hello, this is a common way to boot non GPT-aware OS on GPT systems. For this protective MBR is replaced by a so-called hybrid mbr where first partition entry is a protective entry and the rest contains legal partitions. So here is the syntax: gptsync DISK [PARTITIONSPEC1] [PARTITIONSPEC2] [PARTITIONSPEC3] PARTITIONSPEC says which partitions have to be shown to legacy OS. It always begins with the partition number. Then optionally goes one of the following: nothing. Autodetect partition type, not active partition +. Like preceding but make partition active -TYPE. Use TYPE type as MBR partition type +TYPE. Like preceding but make partition active ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel -- Cros (pxw) ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH] gptsync
My bad. Part of the patch was missing. Here is a corrected version with sanity checks for 2TB limit and some CHS fixes On Mon, Apr 20, 2009 at 11:23 AM, Peter Cros pxwp...@gmail.com wrote: Hi, Compiled with rev 2121, --with-platform=efi but got no gptsync module. It could be a useful tool for macs, I would like to try it. On Mon, Apr 20, 2009 at 9:17 AM, Vladimir Serbinenko phco...@gmail.comwrote: Hello, this is a common way to boot non GPT-aware OS on GPT systems. For this protective MBR is replaced by a so-called hybrid mbr where first partition entry is a protective entry and the rest contains legal partitions. So here is the syntax: gptsync DISK [PARTITIONSPEC1] [PARTITIONSPEC2] [PARTITIONSPEC3] PARTITIONSPEC says which partitions have to be shown to legacy OS. It always begins with the partition number. Then optionally goes one of the following: nothing. Autodetect partition type, not active partition +. Like preceding but make partition active -TYPE. Use TYPE type as MBR partition type +TYPE. Like preceding but make partition active ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel -- Cros (pxw) ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel diff --git a/commands/gptsync.c b/commands/gptsync.c new file mode 100644 index 000..ed72ec3 --- /dev/null +++ b/commands/gptsync.c @@ -0,0 +1,252 @@ +/* gptsync.c - fill the mbr based on gpt entries */ +/* XXX: I don't know what to do if sector size isn't 512 bytes */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2009 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/command.h +#include grub/dl.h +#include grub/device.h +#include grub/disk.h +#include grub/pc_partition.h +#include grub/partition.h +#include grub/misc.h +#include grub/mm.h +#include grub/fs.h + +/* Convert a LBA address to a CHS address in the INT 13 format. */ +/* Taken from grub1. */ +/* XXX: use hardcoded geometry of C = 1024, H = 255, S = 63. + Is it a problem? +*/ +static void +lba_to_chs (int lba, grub_uint8_t *cl, grub_uint8_t *ch, + grub_uint8_t *dh) +{ + int cylinder, head, sector; + int sectors = 63, heads = 255, cylinders = 1024; + + sector = lba % sectors + 1; + head = (lba / sectors) % heads; + cylinder = lba / (sectors * heads); + + if (cylinder = cylinders) +{ + *cl = *ch = *dh = 0xff; + return; +} + + *cl = sector | ((cylinder 0x300) 2); + *ch = cylinder 0xFF; + *dh = head; +} + +static grub_err_t +grub_cmd_gptsync (grub_command_t cmd __attribute__ ((unused)), + int argc, char **args) +{ + grub_device_t dev; + struct grub_pc_partition_mbr mbr; + struct grub_partition *partition; + grub_disk_addr_t first_sector; + int numactive = 0; + + if (argc 1) +return grub_error (GRUB_ERR_BAD_ARGUMENT, device name required); + if (argc 4) +return grub_error (GRUB_ERR_BAD_ARGUMENT, only 3 partitions can be + in hybrid MBR); + + if (args[0][0] == '(' args[0][grub_strlen (args[0]) - 1] == ')') +{ + args[0][grub_strlen (args[0]) - 1] = 0; + dev = grub_device_open (args[0] + 1); + args[0][grub_strlen (args[0]) - 1] = ')'; +} + else +dev = grub_device_open (args[0]); + + if (! dev) +return grub_errno; + + if (! dev-disk) +{ + grub_device_close (dev); + return grub_error (GRUB_ERR_BAD_ARGUMENT, not a disk); +} + + /* Read the protective MBR. */ + if (grub_disk_read (dev-disk, 0, 0, sizeof (mbr), (char *) mbr)) +{ + grub_device_close (dev); + return grub_errno; +} + + /* Check if it is valid. */ + if (mbr.signature != grub_cpu_to_le16 (GRUB_PC_PARTITION_SIGNATURE)) +{ + grub_device_close (dev); + return grub_error (GRUB_ERR_BAD_PART_TABLE, no signature); +} + + /* Make sure the MBR is a protective MBR and not a normal MBR. */ + if (mbr.entries[0].type != GRUB_PC_PARTITION_TYPE_GPT_DISK) +{ + grub_device_close (dev); + return grub_error (GRUB_ERR_BAD_PART_TABLE, no GPT partition map found); +} + + int i; + first_sector = dev-disk-total_sectors; + for (i = 1; i argc; i++) +{ + char *separator, csep = 0; +
[PATCH] gptsync
Hello, this is a common way to boot non GPT-aware OS on GPT systems. For this protective MBR is replaced by a so-called hybrid mbr where first partition entry is a protective entry and the rest contains legal partitions. So here is the syntax: gptsync DISK [PARTITIONSPEC1] [PARTITIONSPEC2] [PARTITIONSPEC3] PARTITIONSPEC says which partitions have to be shown to legacy OS. It always begins with the partition number. Then optionally goes one of the following: nothing. Autodetect partition type, not active partition +. Like preceding but make partition active -TYPE. Use TYPE type as MBR partition type +TYPE. Like preceding but make partition active diff --git a/commands/gptsync.c b/commands/gptsync.c new file mode 100644 index 000..c8b1437 --- /dev/null +++ b/commands/gptsync.c @@ -0,0 +1,240 @@ +/* gptsync.c - fill the mbr based on gpt entries */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2003,2005,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 + * 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/command.h +#include grub/dl.h +#include grub/device.h +#include grub/disk.h +#include grub/pc_partition.h +#include grub/partition.h +#include grub/misc.h +#include grub/mm.h +#include grub/fs.h + +/* Convert a LBA address to a CHS address in the INT 13 format. */ +/* Taken from grub1. */ +/* XXX: use hardcoded geometry of C = 1024, H = 255, S = 63. + Is it a problem? +*/ +static void +lba_to_chs (grub_disk_addr_t lba, grub_uint8_t *cl, grub_uint8_t *ch, + grub_uint8_t *dh) +{ + int cylinder, head, sector; + int sectors = 63, heads = 255, cylinders = 1024; + + sector = lba % sectors + 1; + head = (lba / sectors) % heads; + cylinder = lba / (sectors * heads); + + if (cylinder = cylinders) +{ + *cl = *ch = *dh = 0xff; + return; +} + + *cl = sector | ((cylinder 0x300) 2); + *ch = cylinder 0xFF; + *dh = head; +} + + +static grub_err_t +grub_cmd_gptsync (grub_command_t cmd __attribute__ ((unused)), + int argc, char **args) +{ + grub_device_t dev; + struct grub_pc_partition_mbr mbr; + struct grub_partition *partition; + grub_disk_addr_t first_sector; + int numactive = 0; + + if (argc 1) +return grub_error (GRUB_ERR_BAD_ARGUMENT, device name required); + if (argc 4) +return grub_error (GRUB_ERR_BAD_ARGUMENT, only 3 partitions can be + in hybrid MBR); + + if (args[0][0] == '(' args[0][grub_strlen (args[0]) - 1] == ')') +{ + args[0][grub_strlen (args[0]) - 1] = 0; + dev = grub_device_open (args[0] + 1); + args[0][grub_strlen (args[0]) - 1] = ')'; +} + else +dev = grub_device_open (args[0]); + + if (! dev) +return grub_errno; + + if (! dev-disk) +{ + grub_device_close (dev); + return grub_error (GRUB_ERR_BAD_ARGUMENT, not a disk); +} + + /* Read the protective MBR. */ + if (grub_disk_read (dev-disk, 0, 0, sizeof (mbr), (char *) mbr)) +{ + grub_device_close (dev); + return grub_errno; +} + + /* Check if it is valid. */ + if (mbr.signature != grub_cpu_to_le16 (GRUB_PC_PARTITION_SIGNATURE)) +{ + grub_device_close (dev); + return grub_error (GRUB_ERR_BAD_PART_TABLE, no signature); +} + + /* Make sure the MBR is a protective MBR and not a normal MBR. */ + if (mbr.entries[0].type != GRUB_PC_PARTITION_TYPE_GPT_DISK) +{ + grub_device_close (dev); + return grub_error (GRUB_ERR_BAD_PART_TABLE, no GPT partition map found); +} + + int i; + first_sector = dev-disk-total_sectors; + for (i = 1; i argc; i++) +{ + char *separator, csep = 0; + grub_uint8_t type; + separator = grub_strchr (args[i], '+'); + if (! separator) + separator = grub_strchr (args[i], '-'); + if (separator) + { + csep = *separator; + *separator = 0; + } + partition = grub_partition_probe (dev-disk, args[i]); + if (separator) + *separator = csep; + if (! partition) + { + + grub_device_close (dev); + return grub_error (GRUB_ERR_UNKNOWN_DEVICE, no such partition); + } + + if (first_sector partition-start - 1) + first_sector = partition-start - 1; + + if (separator *(separator + 1)) + type = grub_strtoul (separator + 1, 0, 0); + else + { + grub_fs_t fs = 0; + dev-disk-partition = partition; + fs = grub_fs_probe (dev); + + /* Unknown filesystem isn't fatal. */ + if