xref: /rkdeveloptool/gpt.h (revision c30d921c26f1105311971e7cc3731cac267aae66)
1*c30d921cSKever Yang #ifndef _GPT_H
2*c30d921cSKever Yang #define _GPT_H
3*c30d921cSKever Yang 
4*c30d921cSKever Yang #define MSDOS_MBR_SIGNATURE 0xAA55
5*c30d921cSKever Yang #define EFI_PMBR_OSTYPE_EFI 0xEF
6*c30d921cSKever Yang #define EFI_PMBR_OSTYPE_EFI_GPT 0xEE
7*c30d921cSKever Yang 
8*c30d921cSKever Yang #define GPT_HEADER_SIGNATURE 0x5452415020494645ULL
9*c30d921cSKever Yang #define GPT_HEADER_REVISION_V1 0x00010000
10*c30d921cSKever Yang #define GPT_PRIMARY_PARTITION_TABLE_LBA 1ULL
11*c30d921cSKever Yang #define GPT_ENTRY_NAME "gpt"
12*c30d921cSKever Yang #define GPT_ENTRY_NUMBERS		128
13*c30d921cSKever Yang #define GPT_ENTRY_SIZE			128
14*c30d921cSKever Yang #define PART_PROPERTY_BOOTABLE (1 << 2)
15*c30d921cSKever Yang 
16*c30d921cSKever Yang #define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
17*c30d921cSKever Yang 	((efi_guid_t) \
18*c30d921cSKever Yang 	{{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \
19*c30d921cSKever Yang 		(b) & 0xff, ((b) >> 8) & 0xff, \
20*c30d921cSKever Yang 		(c) & 0xff, ((c) >> 8) & 0xff, \
21*c30d921cSKever Yang 		(d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }})
22*c30d921cSKever Yang 
23*c30d921cSKever Yang #define PARTITION_IDBLOCK_GUID \
24*c30d921cSKever Yang 	EFI_GUID(0xDA2BB095, 0x390E, 0x48ca, \
25*c30d921cSKever Yang 		0x90, 0x47, 0x05, 0xE8, 0x18, 0xB2, 0x97, 0xCE)
26*c30d921cSKever Yang 
27*c30d921cSKever Yang typedef unsigned char u8;
28*c30d921cSKever Yang typedef unsigned short u16;
29*c30d921cSKever Yang typedef unsigned int  u32;
30*c30d921cSKever Yang typedef unsigned long long u64;
31*c30d921cSKever Yang 
32*c30d921cSKever Yang #define uswap_16(x) \
33*c30d921cSKever Yang 	((((x) & 0xff00) >> 8) | \
34*c30d921cSKever Yang 	 (((x) & 0x00ff) << 8))
35*c30d921cSKever Yang #define uswap_32(x) \
36*c30d921cSKever Yang 	((((x) & 0xff000000) >> 24) | \
37*c30d921cSKever Yang 	 (((x) & 0x00ff0000) >>  8) | \
38*c30d921cSKever Yang 	 (((x) & 0x0000ff00) <<  8) | \
39*c30d921cSKever Yang 	 (((x) & 0x000000ff) << 24))
40*c30d921cSKever Yang #define _uswap_64(x, sfx) \
41*c30d921cSKever Yang 	((((x) & 0xff00000000000000##sfx) >> 56) | \
42*c30d921cSKever Yang 	 (((x) & 0x00ff000000000000##sfx) >> 40) | \
43*c30d921cSKever Yang 	 (((x) & 0x0000ff0000000000##sfx) >> 24) | \
44*c30d921cSKever Yang 	 (((x) & 0x000000ff00000000##sfx) >>  8) | \
45*c30d921cSKever Yang 	 (((x) & 0x00000000ff000000##sfx) <<  8) | \
46*c30d921cSKever Yang 	 (((x) & 0x0000000000ff0000##sfx) << 24) | \
47*c30d921cSKever Yang 	 (((x) & 0x000000000000ff00##sfx) << 40) | \
48*c30d921cSKever Yang 	 (((x) & 0x00000000000000ff##sfx) << 56))
49*c30d921cSKever Yang #if defined(__GNUC__)
50*c30d921cSKever Yang # define uswap_64(x) _uswap_64(x, ull)
51*c30d921cSKever Yang #else
52*c30d921cSKever Yang # define uswap_64(x) _uswap_64(x, )
53*c30d921cSKever Yang #endif
54*c30d921cSKever Yang #define __LITTLE_ENDIAN__ 1
55*c30d921cSKever Yang #ifdef __LITTLE_ENDIAN__
56*c30d921cSKever Yang # define cpu_to_le16(x)		(x)
57*c30d921cSKever Yang # define cpu_to_le32(x)		(x)
58*c30d921cSKever Yang # define cpu_to_le64(x)		(x)
59*c30d921cSKever Yang # define le16_to_cpu(x)		(x)
60*c30d921cSKever Yang # define le32_to_cpu(x)		(x)
61*c30d921cSKever Yang # define le64_to_cpu(x)		(x)
62*c30d921cSKever Yang # define cpu_to_be16(x)		uswap_16(x)
63*c30d921cSKever Yang # define cpu_to_be32(x)		uswap_32(x)
64*c30d921cSKever Yang # define cpu_to_be64(x)		uswap_64(x)
65*c30d921cSKever Yang # define be16_to_cpu(x)		uswap_16(x)
66*c30d921cSKever Yang # define be32_to_cpu(x)		uswap_32(x)
67*c30d921cSKever Yang # define be64_to_cpu(x)		uswap_64(x)
68*c30d921cSKever Yang #else
69*c30d921cSKever Yang # define cpu_to_le16(x)		uswap_16(x)
70*c30d921cSKever Yang # define cpu_to_le32(x)		uswap_32(x)
71*c30d921cSKever Yang # define cpu_to_le64(x)		uswap_64(x)
72*c30d921cSKever Yang # define le16_to_cpu(x)		uswap_16(x)
73*c30d921cSKever Yang # define le32_to_cpu(x)		uswap_32(x)
74*c30d921cSKever Yang # define le64_to_cpu(x)		uswap_64(x)
75*c30d921cSKever Yang # define cpu_to_be16(x)		(x)
76*c30d921cSKever Yang # define cpu_to_be32(x)		(x)
77*c30d921cSKever Yang # define cpu_to_be64(x)		(x)
78*c30d921cSKever Yang # define be16_to_cpu(x)		(x)
79*c30d921cSKever Yang # define be32_to_cpu(x)		(x)
80*c30d921cSKever Yang # define be64_to_cpu(x)		(x)
81*c30d921cSKever Yang #endif
82*c30d921cSKever Yang 
83*c30d921cSKever Yang 
84*c30d921cSKever Yang typedef union {
85*c30d921cSKever Yang 	struct {
86*c30d921cSKever Yang 	unsigned int time_low;
87*c30d921cSKever Yang 	unsigned short time_mid;
88*c30d921cSKever Yang 	unsigned short time_hi_and_version;
89*c30d921cSKever Yang 	unsigned char clock_seq_hi_and_reserved;
90*c30d921cSKever Yang 	unsigned char clock_seq_low;
91*c30d921cSKever Yang 	unsigned char node[6];
92*c30d921cSKever Yang 	} uuid;
93*c30d921cSKever Yang 	u8 raw[16];
94*c30d921cSKever Yang } efi_guid_t;
95*c30d921cSKever Yang #pragma pack(1)
96*c30d921cSKever Yang typedef struct {
97*c30d921cSKever Yang 	u16 usTag;/*0xEEEE*/
98*c30d921cSKever Yang 	u16 usBackupGpt;/*0:no backup,1:has backup*/
99*c30d921cSKever Yang 	u16 usEntryCount;
100*c30d921cSKever Yang 	u64 entryDataSize[32];
101*c30d921cSKever Yang } gpt_compact_info;
102*c30d921cSKever Yang /* based on linux/include/genhd.h */
103*c30d921cSKever Yang typedef struct {
104*c30d921cSKever Yang 	u8 boot_ind;		/* 0x80 - active */
105*c30d921cSKever Yang 	u8 head;		/* starting head */
106*c30d921cSKever Yang 	u8 sector;		/* starting sector */
107*c30d921cSKever Yang 	u8 cyl;			/* starting cylinder */
108*c30d921cSKever Yang 	u8 sys_ind;		/* What partition type */
109*c30d921cSKever Yang 	u8 end_head;		/* end head */
110*c30d921cSKever Yang 	u8 end_sector;		/* end sector */
111*c30d921cSKever Yang 	u8 end_cyl;		/* end cylinder */
112*c30d921cSKever Yang 	u32 start_sect;	/* starting sector counting from 0 */
113*c30d921cSKever Yang 	u32 nr_sects;	/* nr of sectors in partition */
114*c30d921cSKever Yang } mbr_partition ;
115*c30d921cSKever Yang 
116*c30d921cSKever Yang /* based on linux/fs/partitions/efi.h */
117*c30d921cSKever Yang typedef struct _gpt_header {
118*c30d921cSKever Yang 	u64 signature;
119*c30d921cSKever Yang 	u32 revision;
120*c30d921cSKever Yang 	u32 header_size;
121*c30d921cSKever Yang 	u32 header_crc32;
122*c30d921cSKever Yang 	u32 reserved1;
123*c30d921cSKever Yang 	u64 my_lba;
124*c30d921cSKever Yang 	u64 alternate_lba;
125*c30d921cSKever Yang 	u64 first_usable_lba;
126*c30d921cSKever Yang 	u64 last_usable_lba;
127*c30d921cSKever Yang 	efi_guid_t disk_guid;
128*c30d921cSKever Yang 	u64 partition_entry_lba;
129*c30d921cSKever Yang 	u32 num_partition_entries;
130*c30d921cSKever Yang 	u32 sizeof_partition_entry;
131*c30d921cSKever Yang 	u32 partition_entry_array_crc32;
132*c30d921cSKever Yang } gpt_header;
133*c30d921cSKever Yang 
134*c30d921cSKever Yang typedef union _gpt_entry_attributes {
135*c30d921cSKever Yang 	struct {
136*c30d921cSKever Yang 		u64 required_to_function:1;
137*c30d921cSKever Yang 		u64 no_block_io_protocol:1;
138*c30d921cSKever Yang 		u64 legacy_bios_bootable:1;
139*c30d921cSKever Yang 		u64 reserved:45;
140*c30d921cSKever Yang 		u64 type_guid_specific:16;
141*c30d921cSKever Yang 	} fields;
142*c30d921cSKever Yang 	unsigned long long raw;
143*c30d921cSKever Yang } gpt_entry_attributes;
144*c30d921cSKever Yang 
145*c30d921cSKever Yang #define PARTNAME_SZ	72
146*c30d921cSKever Yang typedef struct _gpt_entry {
147*c30d921cSKever Yang 	efi_guid_t partition_type_guid;
148*c30d921cSKever Yang 	efi_guid_t unique_partition_guid;
149*c30d921cSKever Yang 	u64 starting_lba;
150*c30d921cSKever Yang 	u64 ending_lba;
151*c30d921cSKever Yang 	gpt_entry_attributes attributes;
152*c30d921cSKever Yang 	u16 partition_name[PARTNAME_SZ / sizeof(u16)];
153*c30d921cSKever Yang } gpt_entry;
154*c30d921cSKever Yang 
155*c30d921cSKever Yang typedef struct _legacy_mbr {
156*c30d921cSKever Yang 	u8 boot_code[440];
157*c30d921cSKever Yang 	u32 unique_mbr_signature;
158*c30d921cSKever Yang 	u16 unknown;
159*c30d921cSKever Yang 	mbr_partition partition_record[4];
160*c30d921cSKever Yang 	u16 signature;
161*c30d921cSKever Yang } legacy_mbr;
162*c30d921cSKever Yang #pragma pack()
163*c30d921cSKever Yang #endif	/* _GPT_H */
164