Re: [PATCH] gptsync

2009-05-09 Thread Vladimir 'phcoder' Serbinenko
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

2009-04-21 Thread Peter Cros
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

2009-04-21 Thread Vladimir Serbinenko
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

2009-04-21 Thread Peter Cros
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

2009-04-21 Thread Isaac Dupree
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

2009-04-21 Thread Vladimir Serbinenko
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

2009-04-21 Thread Vladimir Serbinenko
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

2009-04-20 Thread Peter Cros
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

2009-04-20 Thread Vladimir Serbinenko
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

2009-04-19 Thread Vladimir Serbinenko
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