1
/* sunpc.c - Read SUN PC style partition tables. */
3
* GRUB -- GRand Unified Bootloader
4
* Copyright (C) 2002,2005,2006,2007,2009 Free Software Foundation, Inc.
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.
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.
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/>.
20
#include <grub/partition.h>
21
#include <grub/disk.h>
23
#include <grub/misc.h>
25
#include <grub/symbol.h>
26
#include <grub/types.h>
29
#define GRUB_PARTMAP_SUN_PC_MAGIC 0xDABE
30
#define GRUB_PARTMAP_SUN_PC_MAX_PARTS 16
31
#define GRUB_PARTMAP_SUN_PC_WHOLE_DISK_ID 0x05
33
struct grub_sun_pc_partition_descriptor
37
grub_uint32_t start_sector;
38
grub_uint32_t num_sectors;
39
} __attribute__ ((packed));
41
struct grub_sun_pc_block
43
grub_uint8_t unused[72];
44
struct grub_sun_pc_partition_descriptor partitions[GRUB_PARTMAP_SUN_PC_MAX_PARTS];
45
grub_uint8_t unused2[244];
46
grub_uint16_t magic; /* Magic number. */
47
grub_uint16_t csum; /* Label xor'd checksum. */
48
} __attribute__ ((packed));
50
static struct grub_partition_map grub_sun_pc_partition_map;
52
/* Verify checksum (true=ok). */
54
grub_sun_is_valid (struct grub_sun_pc_block *label)
57
grub_uint16_t sum = 0;
59
for (pos = (grub_uint16_t *) label;
60
pos < (grub_uint16_t *) (label + 1);
68
sun_pc_partition_map_iterate (grub_disk_t disk,
69
int (*hook) (grub_disk_t disk,
70
const grub_partition_t partition))
73
struct grub_sun_pc_block block;
77
p = (grub_partition_t) grub_zalloc (sizeof (struct grub_partition));
81
p->partmap = &grub_sun_pc_partition_map;
82
err = grub_disk_read (disk, 1, 0, sizeof (struct grub_sun_pc_block), &block);
89
if (GRUB_PARTMAP_SUN_PC_MAGIC != grub_le_to_cpu16 (block.magic))
92
return grub_error (GRUB_ERR_BAD_PART_TABLE,
93
"not a sun_pc partition table");
96
if (! grub_sun_is_valid (&block))
99
return grub_error (GRUB_ERR_BAD_PART_TABLE, "invalid checksum");
102
/* Maybe another error value would be better, because partition
103
table _is_ recognized but invalid. */
104
for (partnum = 0; partnum < GRUB_PARTMAP_SUN_PC_MAX_PARTS; partnum++)
106
struct grub_sun_pc_partition_descriptor *desc;
108
if (block.partitions[partnum].id == 0
109
|| block.partitions[partnum].id == GRUB_PARTMAP_SUN_PC_WHOLE_DISK_ID)
112
desc = &block.partitions[partnum];
113
p->start = grub_le_to_cpu32 (desc->start_sector);
114
p->len = grub_le_to_cpu32 (desc->num_sectors);
119
partnum = GRUB_PARTMAP_SUN_PC_MAX_PARTS;
128
/* Partition map type. */
129
static struct grub_partition_map grub_sun_pc_partition_map =
132
.iterate = sun_pc_partition_map_iterate,
135
GRUB_MOD_INIT(part_sunpc)
137
grub_partition_map_register (&grub_sun_pc_partition_map);
140
GRUB_MOD_FINI(part_sunpc)
142
grub_partition_map_unregister (&grub_sun_pc_partition_map);