18
18
/* http://www.snia.org/standards/home */
19
19
#define DDF_GUID_LENGTH 24
20
20
#define DDF_REV_LENGTH 8
21
#define DDF_MAGIC 0xDE11DE11
22
24
struct ddf_header {
25
27
uint8_t guid[DDF_GUID_LENGTH];
26
uint8_t ddf_rev[DDF_REV_LENGTH];
28
char ddf_rev[8]; /* 01.02.00 */
29
uint32_t seq; /* starts at '1' */
33
uint8_t enforcegroups;
34
uint8_t pad0; /* 0xff */
35
uint8_t pad1[12]; /* 12 * 0xff */
37
uint8_t header_ext[32]; /* reserved: fill with 0xff */
39
uint64_t secondary_lba;
41
uint8_t pad2[3]; /* 0xff */
42
uint32_t workspace_len; /* sectors for vendor space -
43
* at least 32768(sectors) */
44
uint64_t workspace_lba;
45
uint16_t max_pd_entries; /* one of 15, 63, 255, 1023, 4095 */
46
uint16_t max_vd_entries; /* 2^(4,6,8,10,12)-1 : i.e. as above */
47
uint16_t max_partitions; /* i.e. max num of configuration
48
record entries per disk */
49
uint16_t config_record_len; /* 1 +ROUNDUP(max_primary_element_entries
51
uint16_t max_primary_element_entries; /* 16, 64, 256, 1024, or 4096 */
52
uint8_t pad3[54]; /* 0xff */
53
/* 192 bytes so far */
54
uint32_t controller_section_offset;
55
uint32_t controller_section_length;
56
uint32_t phys_section_offset;
57
uint32_t phys_section_length;
58
uint32_t virt_section_offset;
59
uint32_t virt_section_length;
60
uint32_t config_section_offset;
61
uint32_t config_section_length;
62
uint32_t data_section_offset;
63
uint32_t data_section_length;
64
uint32_t bbm_section_offset;
65
uint32_t bbm_section_length;
66
uint32_t diag_space_offset;
67
uint32_t diag_space_length;
68
uint32_t vendor_offset;
69
uint32_t vendor_length;
70
/* 256 bytes so far */
71
uint8_t pad4[256]; /* 0xff */
27
72
} __attribute__((packed));
29
74
static int probe_ddf(blkid_probe pr, const struct blkid_idmag *mag)
33
78
struct ddf_header *ddf = NULL;
34
79
char version[DDF_REV_LENGTH + 1];
36
82
if (pr->size < 0x30000)
39
85
for (i = 0; i < ARRAY_SIZE(hdrs); i++) {
40
uint64_t off = ((pr->size / 0x200) - hdrs[i]) * 0x200;
86
off = ((pr->size / 0x200) - hdrs[i]) * 0x200;
42
88
ddf = (struct ddf_header *) blkid_probe_get_buffer(pr,
48
if (memcmp(ddf->signature, "\x11\xde\x11\xde", 4) == 0 ||
49
memcmp(ddf->signature, "\xde\x11\xde\x11", 4) == 0)
94
if (ddf->signature == cpu_to_be32(DDF_MAGIC) ||
95
ddf->signature == cpu_to_le32(DDF_MAGIC))
103
lba = ddf->signature == cpu_to_be32(DDF_MAGIC) ?
104
be64_to_cpu(ddf->primary_lba) :
105
le64_to_cpu(ddf->primary_lba);
108
/* check primary header */
111
buf = blkid_probe_get_buffer(pr,
112
lba << 9, sizeof(ddf->signature));
113
if (!buf || memcmp(buf, &ddf->signature, 4))
57
117
blkid_probe_strncpy_uuid(pr, ddf->guid, sizeof(ddf->guid));
59
119
memcpy(version, ddf->ddf_rev, sizeof(ddf->ddf_rev));