2
* mac partitions parsing code
4
* Copyright (C) 2009 Karel Zak <kzak@redhat.com>
6
* This file may be redistributed under the terms of the
7
* GNU Lesser General Public License.
15
#include "partitions.h"
17
#define MAC_PARTITION_MAGIC 0x504d
18
#define MAC_PARTITION_MAGIC_OLD 0x5453
22
* http://developer.apple.com/legacy/mac/library/documentation/mac/Devices/Devices-126.html
24
struct mac_partition {
25
uint16_t signature; /* expected to be MAC_PARTITION_MAGIC */
26
uint16_t reserved; /* reserved */
27
uint32_t map_count; /* # blocks in partition map */
28
uint32_t start_block; /* absolute starting block # of partition */
29
uint32_t block_count; /* number of blocks in partition */
30
char name[32]; /* partition name */
31
char type[32]; /* string type description */
32
uint32_t data_start; /* rel block # of first data block */
33
uint32_t data_count; /* number of data blocks */
34
uint32_t status; /* partition status bits */
35
uint32_t boot_start; /* first logical block of boot code */
36
uint32_t boot_size; /* size of boot code, in bytes */
37
uint32_t boot_load; /* boot code load address */
38
uint32_t boot_load2; /* reserved */
39
uint32_t boot_entry; /* boot code entry point */
40
uint32_t boot_entry2; /* reserved */
41
uint32_t boot_cksum; /* boot code checksum */
42
char processor[16]; /* identifies ISA of boot */
44
/* there is more stuff after this that we don't need */
45
} __attribute__((packed));
48
* Driver descriptor structure, in block 0
49
* http://developer.apple.com/legacy/mac/library/documentation/mac/Devices/Devices-121.html
51
struct mac_driver_desc {
52
uint16_t signature; /* expected to be MAC_DRIVER_MAGIC */
53
uint16_t block_size; /* block size of the device */
54
uint32_t block_count; /* number of blocks on the device */
56
/* there is more stuff after this that we don't need */
57
} __attribute__((packed));
59
static inline unsigned char *get_mac_block(
61
struct mac_driver_desc *md,
64
return blkid_probe_get_buffer(pr,
65
(blkid_loff_t) num * md->block_size, num);
68
static inline int has_part_signature(struct mac_partition *p)
70
return be16_to_cpu(p->signature) == MAC_PARTITION_MAGIC ||
71
be16_to_cpu(p->signature) == MAC_PARTITION_MAGIC_OLD;
74
static int probe_mac_pt(blkid_probe pr, const struct blkid_idmag *mag)
76
struct mac_driver_desc *md;
77
struct mac_partition *p;
78
blkid_parttable tab = NULL;
81
uint16_t ssf; /* sector size fragment */
85
/* The driver descriptor record is always located at physical block 0,
86
* the first block on the disk.
88
md = (struct mac_driver_desc *) blkid_probe_get_sector(pr, 0);
93
/* The partition map always begins at physical block 1,
94
* the second block on the disk.
96
p = (struct mac_partition *) get_mac_block(pr, md, 1);
100
/* check the first partition signature */
101
if (!has_part_signature(p))
104
if (blkid_partitions_need_typeonly(pr))
105
/* caller does not ask for details about partitions */
108
ls = blkid_probe_get_partlist(pr);
112
tab = blkid_partlist_new_parttable(ls, "mac", 0);
116
ssf = md->block_size / 512;
117
nblks = be32_to_cpu(p->map_count);
119
for (i = 1; i <= nblks; ++i) {
124
p = (struct mac_partition *) get_mac_block(pr, md, i);
127
if (!has_part_signature(p))
130
if (be32_to_cpu(p->map_count) != nblks) {
131
DBG(DEBUG_LOWPROBE, printf(
132
"mac: inconsisten map_count in partition map, "
133
"entry[0]: %d, entry[%d]: %d\n",
135
be32_to_cpu(p->map_count)));
139
* note that libparted ignores some mac partitions according to
140
* the partition name (e.g. "Apple_Free" or "Apple_Void"). We
141
* follows Linux kernel and all partitions are visible
144
start = be32_to_cpu(p->start_block) * ssf;
145
size = be32_to_cpu(p->block_count) * ssf;
147
par = blkid_partlist_add_partition(ls, tab, start, size);
151
blkid_partition_set_name(par, (unsigned char *) p->name,
154
blkid_partition_set_type_string(par, (unsigned char *) p->type,
167
* Mac disk always begin with "Driver Descriptor Record"
168
* (struct mac_driver_desc) and magic 0x4552.
170
const struct blkid_idinfo mac_pt_idinfo =
173
.probefunc = probe_mac_pt,
176
/* big-endian magic string */
177
{ .magic = "\x45\x52", .len = 2 },