~ubuntu-branches/ubuntu/trusty/grub2/trusty-updates

« back to all changes in this revision

Viewing changes to grub-core/partmap/amiga.c

  • Committer: Bazaar Package Importer
  • Author(s): Colin Watson
  • Date: 2011-02-08 11:39:26 UTC
  • mfrom: (17.6.26 experimental)
  • mto: (17.6.27 experimental)
  • mto: This revision was merged to the branch mainline in revision 104.
  • Revision ID: james.westby@ubuntu.com-20110208113926-clfs90haboyk9zip
Tags: 1.99~rc1-2
* Merge 1.98+20100804-13 and 1.98+20100804-14, updating translations:
  - Kazakh (Baurzhan Muftakhidinov / Timur Birsh).
* mkconfig_skip_dmcrypt.patch: Refer to GRUB_PRELOAD_MODULES rather than
  suggesting people write a /etc/grub.d/01_modules script (thanks, Jordan
  Uggla).
* Handle empty dir passed to grub_find_root_device_from_mountinfo; fixes
  grub-mkrelpath on btrfs subvolumes (LP: #712029).
* Add rootflags=subvol=<name> if / is on a btrfs subvolume (LP: #712029).
* Upload to unstable.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* amiga.c - Read amiga partition tables (RDB).  */
 
2
/*
 
3
 *  GRUB  --  GRand Unified Bootloader
 
4
 *  Copyright (C) 2002,2004,2005,2006,2007  Free Software Foundation, Inc.
 
5
 *
 
6
 *  GRUB is free software: you can redistribute it and/or modify
 
7
 *  it under the terms of the GNU General Public License as published by
 
8
 *  the Free Software Foundation, either version 3 of the License, or
 
9
 *  (at your option) any later version.
 
10
 *
 
11
 *  GRUB is distributed in the hope that it will be useful,
 
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
 *  GNU General Public License for more details.
 
15
 *
 
16
 *  You should have received a copy of the GNU General Public License
 
17
 *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 
18
 */
 
19
 
 
20
#include <grub/disk.h>
 
21
#include <grub/misc.h>
 
22
#include <grub/mm.h>
 
23
#include <grub/partition.h>
 
24
#include <grub/dl.h>
 
25
 
 
26
struct grub_amiga_rdsk
 
27
{
 
28
  /* "RDSK".  */
 
29
  grub_uint8_t magic[4];
 
30
#define GRUB_AMIGA_RDSK_MAGIC "RDSK"
 
31
  grub_uint32_t size;
 
32
  grub_int32_t checksum;
 
33
  grub_uint32_t scsihost;
 
34
  grub_uint32_t blksz;
 
35
  grub_uint32_t flags;
 
36
  grub_uint32_t badblcklst;
 
37
  grub_uint32_t partitionlst;
 
38
  grub_uint32_t fslst;
 
39
 
 
40
  /* The other information is not important for us.  */
 
41
} __attribute__ ((packed));
 
42
 
 
43
struct grub_amiga_partition
 
44
{
 
45
  /* "PART".  */
 
46
  grub_uint8_t magic[4];
 
47
#define GRUB_AMIGA_PART_MAGIC "PART"
 
48
  grub_int32_t size;
 
49
  grub_int32_t checksum;
 
50
  grub_uint32_t scsihost;
 
51
  grub_uint32_t next;
 
52
  grub_uint32_t flags;
 
53
  grub_uint32_t unused1[2];
 
54
  grub_uint32_t devflags;
 
55
  grub_uint8_t namelen;
 
56
  grub_uint8_t name[31];
 
57
  grub_uint32_t unused2[15];
 
58
 
 
59
  grub_uint32_t unused3[3];
 
60
  grub_uint32_t heads;
 
61
  grub_uint32_t unused4;
 
62
  grub_uint32_t block_per_track;
 
63
  grub_uint32_t unused5[3];
 
64
  grub_uint32_t lowcyl;
 
65
  grub_uint32_t highcyl;
 
66
 
 
67
  grub_uint32_t firstcyl;
 
68
} __attribute__ ((packed));
 
69
 
 
70
static struct grub_partition_map grub_amiga_partition_map;
 
71
 
 
72
 
 
73
 
 
74
static grub_err_t
 
75
amiga_partition_map_iterate (grub_disk_t disk,
 
76
                             int (*hook) (grub_disk_t disk,
 
77
                                          const grub_partition_t partition))
 
78
{
 
79
  struct grub_partition part;
 
80
  struct grub_amiga_rdsk rdsk;
 
81
  int partno = 0;
 
82
  int next = -1;
 
83
  unsigned pos;
 
84
 
 
85
  /* The RDSK block is one of the first 15 blocks.  */
 
86
  for (pos = 0; pos < 15; pos++)
 
87
    {
 
88
      /* Read the RDSK block which is a descriptor for the entire disk.  */
 
89
      if (grub_disk_read (disk, pos, 0, sizeof (rdsk), &rdsk))
 
90
        return grub_errno;
 
91
 
 
92
      if (grub_memcmp (rdsk.magic, GRUB_AMIGA_RDSK_MAGIC,
 
93
                       sizeof (rdsk.magic)) == 0)
 
94
        {
 
95
          /* Found the first PART block.  */
 
96
          next = grub_be_to_cpu32 (rdsk.partitionlst);
 
97
          break;
 
98
        }
 
99
    }
 
100
 
 
101
  if (next == -1)
 
102
    return grub_error (GRUB_ERR_BAD_PART_TABLE,
 
103
                       "Amiga partition map not found");
 
104
 
 
105
  /* The end of the partition list is marked using "-1".  */
 
106
  while (next != -1)
 
107
    {
 
108
      struct grub_amiga_partition apart;
 
109
 
 
110
      /* Read the RDSK block which is a descriptor for the entire disk.  */
 
111
      if (grub_disk_read (disk, next, 0, sizeof (apart), &apart))
 
112
        return grub_errno;
 
113
 
 
114
      if (grub_memcmp (apart.magic, GRUB_AMIGA_PART_MAGIC,
 
115
                       sizeof (apart.magic)) == 0)
 
116
 
 
117
      /* Calculate the first block and the size of the partition.  */
 
118
      part.start = (grub_be_to_cpu32 (apart.lowcyl)
 
119
                    * grub_be_to_cpu32 (apart.heads)
 
120
                    * grub_be_to_cpu32 (apart.block_per_track));
 
121
      part.len = ((grub_be_to_cpu32 (apart.highcyl)
 
122
                   - grub_be_to_cpu32 (apart.lowcyl) + 1)
 
123
                  * grub_be_to_cpu32 (apart.heads)
 
124
                  * grub_be_to_cpu32 (apart.block_per_track));
 
125
 
 
126
      part.offset = (grub_off_t) next * 512;
 
127
      part.number = partno;
 
128
      part.index = 0;
 
129
      part.partmap = &grub_amiga_partition_map;
 
130
 
 
131
      if (hook (disk, &part))
 
132
        return grub_errno;
 
133
 
 
134
      next = grub_be_to_cpu32 (apart.next);
 
135
      partno++;
 
136
    }
 
137
 
 
138
  return 0;
 
139
}
 
140
 
 
141
 
 
142
/* Partition map type.  */
 
143
static struct grub_partition_map grub_amiga_partition_map =
 
144
  {
 
145
    .name = "amiga",
 
146
    .iterate = amiga_partition_map_iterate,
 
147
  };
 
148
 
 
149
GRUB_MOD_INIT(part_amiga)
 
150
{
 
151
  grub_partition_map_register (&grub_amiga_partition_map);
 
152
}
 
153
 
 
154
GRUB_MOD_FINI(part_amiga)
 
155
{
 
156
  grub_partition_map_unregister (&grub_amiga_partition_map);
 
157
}