xref: /OK3568_Linux_fs/external/recovery/update_engine/gpt.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2023 Rockchip Electronics Co., Ltd.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *       http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #ifndef _GPT_H
18*4882a593Smuzhiyun #define _GPT_H
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define MSDOS_MBR_SIGNATURE 0xAA55
21*4882a593Smuzhiyun #define EFI_PMBR_OSTYPE_EFI 0xEF
22*4882a593Smuzhiyun #define EFI_PMBR_OSTYPE_EFI_GPT 0xEE
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define GPT_HEADER_SIGNATURE 0x5452415020494645ULL
25*4882a593Smuzhiyun #define GPT_HEADER_REVISION_V1 0x00010000
26*4882a593Smuzhiyun #define GPT_PRIMARY_PARTITION_TABLE_LBA 1ULL
27*4882a593Smuzhiyun #define GPT_ENTRY_NAME "gpt"
28*4882a593Smuzhiyun #define GPT_ENTRY_NUMBERS        128
29*4882a593Smuzhiyun #define GPT_ENTRY_SIZE            128
30*4882a593Smuzhiyun #define PART_PROPERTY_BOOTABLE (1 << 2)
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
33*4882a593Smuzhiyun     ((efi_guid_t) \
34*4882a593Smuzhiyun     {{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \
35*4882a593Smuzhiyun         (b) & 0xff, ((b) >> 8) & 0xff, \
36*4882a593Smuzhiyun         (c) & 0xff, ((c) >> 8) & 0xff, \
37*4882a593Smuzhiyun         (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }})
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #define PARTITION_IDBLOCK_GUID \
40*4882a593Smuzhiyun     EFI_GUID(0xDA2BB095, 0x390E, 0x48ca, \
41*4882a593Smuzhiyun         0x90, 0x47, 0x05, 0xE8, 0x18, 0xB2, 0x97, 0xCE)
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun typedef unsigned char u8;
44*4882a593Smuzhiyun typedef unsigned short u16;
45*4882a593Smuzhiyun typedef unsigned int  u32;
46*4882a593Smuzhiyun typedef unsigned long long u64;
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define uswap_16(x) \
49*4882a593Smuzhiyun     ((((x) & 0xff00) >> 8) | \
50*4882a593Smuzhiyun      (((x) & 0x00ff) << 8))
51*4882a593Smuzhiyun #define uswap_32(x) \
52*4882a593Smuzhiyun     ((((x) & 0xff000000) >> 24) | \
53*4882a593Smuzhiyun      (((x) & 0x00ff0000) >>  8) | \
54*4882a593Smuzhiyun      (((x) & 0x0000ff00) <<  8) | \
55*4882a593Smuzhiyun      (((x) & 0x000000ff) << 24))
56*4882a593Smuzhiyun #define _uswap_64(x, sfx) \
57*4882a593Smuzhiyun     ((((x) & 0xff00000000000000##sfx) >> 56) | \
58*4882a593Smuzhiyun      (((x) & 0x00ff000000000000##sfx) >> 40) | \
59*4882a593Smuzhiyun      (((x) & 0x0000ff0000000000##sfx) >> 24) | \
60*4882a593Smuzhiyun      (((x) & 0x000000ff00000000##sfx) >>  8) | \
61*4882a593Smuzhiyun      (((x) & 0x00000000ff000000##sfx) <<  8) | \
62*4882a593Smuzhiyun      (((x) & 0x0000000000ff0000##sfx) << 24) | \
63*4882a593Smuzhiyun      (((x) & 0x000000000000ff00##sfx) << 40) | \
64*4882a593Smuzhiyun      (((x) & 0x00000000000000ff##sfx) << 56))
65*4882a593Smuzhiyun #if defined(__GNUC__)
66*4882a593Smuzhiyun # define uswap_64(x) _uswap_64(x, ull)
67*4882a593Smuzhiyun #else
68*4882a593Smuzhiyun # define uswap_64(x) _uswap_64(x, )
69*4882a593Smuzhiyun #endif
70*4882a593Smuzhiyun #define __LITTLE_ENDIAN__ 1
71*4882a593Smuzhiyun #ifdef __LITTLE_ENDIAN__
72*4882a593Smuzhiyun # define cpu_to_le16(x)        (x)
73*4882a593Smuzhiyun # define cpu_to_le32(x)        (x)
74*4882a593Smuzhiyun # define cpu_to_le64(x)        (x)
75*4882a593Smuzhiyun # define le16_to_cpu(x)        (x)
76*4882a593Smuzhiyun # define le32_to_cpu(x)        (x)
77*4882a593Smuzhiyun # define le64_to_cpu(x)        (x)
78*4882a593Smuzhiyun # define cpu_to_be16(x)        uswap_16(x)
79*4882a593Smuzhiyun # define cpu_to_be32(x)        uswap_32(x)
80*4882a593Smuzhiyun # define cpu_to_be64(x)        uswap_64(x)
81*4882a593Smuzhiyun # define be16_to_cpu(x)        uswap_16(x)
82*4882a593Smuzhiyun # define be32_to_cpu(x)        uswap_32(x)
83*4882a593Smuzhiyun # define be64_to_cpu(x)        uswap_64(x)
84*4882a593Smuzhiyun #else
85*4882a593Smuzhiyun # define cpu_to_le16(x)        uswap_16(x)
86*4882a593Smuzhiyun # define cpu_to_le32(x)        uswap_32(x)
87*4882a593Smuzhiyun # define cpu_to_le64(x)        uswap_64(x)
88*4882a593Smuzhiyun # define le16_to_cpu(x)        uswap_16(x)
89*4882a593Smuzhiyun # define le32_to_cpu(x)        uswap_32(x)
90*4882a593Smuzhiyun # define le64_to_cpu(x)        uswap_64(x)
91*4882a593Smuzhiyun # define cpu_to_be16(x)        (x)
92*4882a593Smuzhiyun # define cpu_to_be32(x)        (x)
93*4882a593Smuzhiyun # define cpu_to_be64(x)        (x)
94*4882a593Smuzhiyun # define be16_to_cpu(x)        (x)
95*4882a593Smuzhiyun # define be32_to_cpu(x)        (x)
96*4882a593Smuzhiyun # define be64_to_cpu(x)        (x)
97*4882a593Smuzhiyun #endif
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun typedef union {
101*4882a593Smuzhiyun     struct {
102*4882a593Smuzhiyun         unsigned int time_low;
103*4882a593Smuzhiyun         unsigned short time_mid;
104*4882a593Smuzhiyun         unsigned short time_hi_and_version;
105*4882a593Smuzhiyun         unsigned char clock_seq_hi_and_reserved;
106*4882a593Smuzhiyun         unsigned char clock_seq_low;
107*4882a593Smuzhiyun         unsigned char node[6];
108*4882a593Smuzhiyun     } uuid;
109*4882a593Smuzhiyun     u8 raw[16];
110*4882a593Smuzhiyun } efi_guid_t;
111*4882a593Smuzhiyun #pragma pack(1)
112*4882a593Smuzhiyun typedef struct {
113*4882a593Smuzhiyun     u16 usTag;/*0xEEEE*/
114*4882a593Smuzhiyun     u16 usBackupGpt;/*0:no backup,1:has backup*/
115*4882a593Smuzhiyun     u16 usEntryCount;
116*4882a593Smuzhiyun     u64 entryDataSize[32];
117*4882a593Smuzhiyun } gpt_compact_info;
118*4882a593Smuzhiyun /* based on linux/include/genhd.h */
119*4882a593Smuzhiyun typedef struct {
120*4882a593Smuzhiyun     u8 boot_ind;        /* 0x80 - active */
121*4882a593Smuzhiyun     u8 head;        /* starting head */
122*4882a593Smuzhiyun     u8 sector;        /* starting sector */
123*4882a593Smuzhiyun     u8 cyl;            /* starting cylinder */
124*4882a593Smuzhiyun     u8 sys_ind;        /* What partition type */
125*4882a593Smuzhiyun     u8 end_head;        /* end head */
126*4882a593Smuzhiyun     u8 end_sector;        /* end sector */
127*4882a593Smuzhiyun     u8 end_cyl;        /* end cylinder */
128*4882a593Smuzhiyun     u32 start_sect;    /* starting sector counting from 0 */
129*4882a593Smuzhiyun     u32 nr_sects;    /* nr of sectors in partition */
130*4882a593Smuzhiyun } mbr_partition ;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun /* based on linux/fs/partitions/efi.h */
133*4882a593Smuzhiyun typedef struct _gpt_header {
134*4882a593Smuzhiyun     u64 signature;                          //固定字符串“EFI PART”
135*4882a593Smuzhiyun     u32 revision;                           //GPT版本号
136*4882a593Smuzhiyun     u32 header_size;                        //主GPT头大小
137*4882a593Smuzhiyun     u32 header_crc32;                       //主GPT头的CRC32校验数据,注意不是累加和校验
138*4882a593Smuzhiyun     u32 reserved1;                          //保留位
139*4882a593Smuzhiyun     u64 my_lba;                             //主GPT头起始扇区号,LBA1
140*4882a593Smuzhiyun     u64 alternate_lba;                      //主GPT头备份位置扇区号 LBA-1
141*4882a593Smuzhiyun     u64 first_usable_lba;                   //GPT分区起始扇区号,LBA34
142*4882a593Smuzhiyun     u64 last_usable_lba;                    //GPT分区结束扇区号,LBA-34
143*4882a593Smuzhiyun     efi_guid_t disk_guid;                   //磁盘的GUID,唯一标识,这也意味着全硬盘复制是行不通的.
144*4882a593Smuzhiyun     u64 partition_entry_lba;                //分区表起始扇区号,LBA2
145*4882a593Smuzhiyun     u32 num_partition_entries;              //分区表项数目,MS强行给128
146*4882a593Smuzhiyun     u32 sizeof_partition_entry;             //每个分区表占用字节数,128
147*4882a593Smuzhiyun     u32 partition_entry_array_crc32;        //分区表CRC校验数据
148*4882a593Smuzhiyun } gpt_header;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun typedef union _gpt_entry_attributes {
151*4882a593Smuzhiyun     struct {
152*4882a593Smuzhiyun         u64 required_to_function: 1;
153*4882a593Smuzhiyun         u64 no_block_io_protocol: 1;
154*4882a593Smuzhiyun         u64 legacy_bios_bootable: 1;
155*4882a593Smuzhiyun         u64 reserved: 45;
156*4882a593Smuzhiyun         u64 type_guid_specific: 16;
157*4882a593Smuzhiyun     } fields;
158*4882a593Smuzhiyun     unsigned long long raw;
159*4882a593Smuzhiyun } gpt_entry_attributes;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun #define PARTNAME_SZ    72
162*4882a593Smuzhiyun typedef struct _gpt_entry {
163*4882a593Smuzhiyun     efi_guid_t partition_type_guid;
164*4882a593Smuzhiyun     efi_guid_t unique_partition_guid;
165*4882a593Smuzhiyun     u64 starting_lba;
166*4882a593Smuzhiyun     u64 ending_lba;
167*4882a593Smuzhiyun     gpt_entry_attributes attributes;
168*4882a593Smuzhiyun     u16 partition_name[PARTNAME_SZ / sizeof(u16)];
169*4882a593Smuzhiyun } gpt_entry;
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun typedef struct _legacy_mbr {
172*4882a593Smuzhiyun     u8 boot_code[440];
173*4882a593Smuzhiyun     u32 unique_mbr_signature;
174*4882a593Smuzhiyun     u16 unknown;
175*4882a593Smuzhiyun     mbr_partition partition_record[4];
176*4882a593Smuzhiyun     u16 signature;
177*4882a593Smuzhiyun } legacy_mbr;
178*4882a593Smuzhiyun #pragma pack()
179*4882a593Smuzhiyun #endif    /* _GPT_H */
180