commit-grub
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[2463] 2009-08-01 Vladimir Serbinenko <address@hidden>


From: Vladimir Serbinenko
Subject: [2463] 2009-08-01 Vladimir Serbinenko <address@hidden>
Date: Sat, 01 Aug 2009 14:40:31 +0000

Revision: 2463
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2463
Author:   phcoder
Date:     2009-08-01 14:40:30 +0000 (Sat, 01 Aug 2009)
Log Message:
-----------
2009-08-01  Vladimir Serbinenko  <address@hidden>

        Support Apple partition map with sector size different from 512 bytes.

        * partmap/apple.c (grub_apple_header): New field 'blocksize'.
        (apple_partition_map_iterate): Respect 'aheader.blocksize'
        and 'apart.partmap_size'.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/partmap/apple.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog       2009-08-01 14:30:59 UTC (rev 2462)
+++ trunk/grub2/ChangeLog       2009-08-01 14:40:30 UTC (rev 2463)
@@ -1,4 +1,12 @@
 2009-08-01  Vladimir Serbinenko  <address@hidden>
+
+       Support Apple partition map with sector size different from 512 bytes.
+
+       * partmap/apple.c (grub_apple_header): New field 'blocksize'.
+       (apple_partition_map_iterate): Respect 'aheader.blocksize'
+       and 'apart.partmap_size'.
+
+2009-08-01  Vladimir Serbinenko  <address@hidden>
 2009-08-01  Robert Millan  <address@hidden>
 
        Fix cpuid command.

Modified: trunk/grub2/partmap/apple.c
===================================================================
--- trunk/grub2/partmap/apple.c 2009-08-01 14:30:59 UTC (rev 2462)
+++ trunk/grub2/partmap/apple.c 2009-08-01 14:40:30 UTC (rev 2463)
@@ -30,6 +30,7 @@
   /* The magic number to identify the partition map, it should have
      the value `0x4552'.  */
   grub_uint16_t magic;
+  grub_uint16_t blocksize;
 };
 
 struct grub_apple_part
@@ -105,8 +106,8 @@
   struct grub_apple_header aheader;
   struct grub_apple_part apart;
   struct grub_disk raw;
-  int partno = 0;
-  unsigned pos = GRUB_DISK_SECTOR_SIZE;
+  int partno = 0, partnum = 0;
+  unsigned pos;
 
   /* Enforce raw disk access.  */
   raw = *disk;
@@ -126,7 +127,9 @@
       goto fail;
     }
 
-  for (;;)
+  pos = grub_be_to_cpu16 (aheader.blocksize);
+
+  do
     {
       if (grub_disk_read (&raw, pos / GRUB_DISK_SECTOR_SIZE,
                          pos % GRUB_DISK_SECTOR_SIZE,
@@ -142,8 +145,15 @@
          break;
        }
 
-      part.start = grub_be_to_cpu32 (apart.first_phys_block);
-      part.len = grub_be_to_cpu32 (apart.blockcnt);
+      if (partnum == 0)
+       partnum = grub_be_to_cpu32 (apart.partmap_size);
+
+      part.start = ((grub_disk_addr_t) grub_be_to_cpu32 
(apart.first_phys_block)
+                   * grub_be_to_cpu16 (aheader.blocksize))
+       / GRUB_DISK_SECTOR_SIZE;
+      part.len = ((grub_disk_addr_t) grub_be_to_cpu32 (apart.blockcnt)
+                 * grub_be_to_cpu16 (aheader.blocksize))
+       / GRUB_DISK_SECTOR_SIZE;
       part.offset = pos;
       part.index = partno;
 
@@ -156,15 +166,12 @@
       if (hook (disk, &part))
        return grub_errno;
 
-      if (grub_be_to_cpu32 (apart.first_phys_block)
-         == GRUB_DISK_SECTOR_SIZE * 2)
-       return 0;
-
-      pos += sizeof (struct grub_apple_part);
+      pos += grub_be_to_cpu16 (aheader.blocksize);
       partno++;
     }
+  while (partno < partnum);
 
-  if (pos != GRUB_DISK_SECTOR_SIZE)
+  if (partno != 0)
     return 0;
 
  fail:





reply via email to

[Prev in Thread] Current Thread [Next in Thread]