1 /* system/core/include/diskconfig/diskconfig.h
2  *
3  * Copyright 2008, The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef __LIBS_DISKCONFIG_H
19 #define __LIBS_DISKCONFIG_H
20 
21 #include <stdint.h>
22 #include <sys/types.h>
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 #define MAX_NAME_LEN                 512
29 #define MAX_NUM_PARTS                16
30 
31 /* known partition schemes */
32 #define PART_SCHEME_MBR              0x1
33 #define PART_SCHEME_GPT              0x2
34 
35 /* PC Bios partition status */
36 #define PC_PART_ACTIVE               0x80
37 #define PC_PART_NORMAL               0x0
38 
39 /* Known (rather, used by us) partition types */
40 #define PC_PART_TYPE_LINUX           0x83
41 #define PC_PART_TYPE_EXTENDED        0x05
42 #define PC_PART_TYPE_FAT32           0x0c
43 
44 #define PC_NUM_BOOT_RECORD_PARTS     4
45 
46 #define PC_EBR_LOGICAL_PART          0
47 #define PC_EBR_NEXT_PTR_PART         1
48 
49 #define PC_BIOS_BOOT_SIG             0xAA55
50 
51 #define PC_MBR_DISK_OFFSET           0
52 #define PC_MBR_SIZE                  512
53 
54 #define PART_ACTIVE_FLAG             0x1
55 
56 struct chs {
57     uint8_t head;
58     uint8_t sector;
59     uint8_t cylinder;
60 } __attribute__((__packed__));
61 
62 /* 16 byte pc partition descriptor that sits in MBR and EPBR.
63  * Note: multi-byte entities have little-endian layout on disk */
64 struct pc_partition {
65     uint8_t status;     /* byte  0     */
66     struct chs start;   /* bytes 1-3   */
67     uint8_t type;       /* byte  4     */
68     struct chs end;     /* bytes 5-7   */
69     uint32_t start_lba; /* bytes 8-11  */
70     uint32_t len_lba;   /* bytes 12-15 */
71 } __attribute__((__packed__));
72 
73 struct pc_boot_record {
74     uint8_t code[440];                                      /* bytes 0-439   */
75     uint32_t disk_sig;                                      /* bytes 440-443 */
76     uint16_t pad;                                           /* bytes 444-445 */
77     struct pc_partition ptable[PC_NUM_BOOT_RECORD_PARTS];   /* bytes 446-509 */
78     uint16_t mbr_sig;                                       /* bytes 510-511 */
79 } __attribute__((__packed__));
80 
81 struct part_info {
82     char *name;
83     uint8_t flags;
84     uint8_t type;
85     uint32_t len_kb;       /* in 1K-bytes */
86     uint32_t start_lba;    /* the LBA where this partition begins */
87 };
88 
89 struct disk_info {
90     char *device;
91     uint8_t scheme;
92     int sect_size;       /* expected sector size in bytes. MUST BE POWER OF 2 */
93     uint32_t skip_lba;   /* in sectors (1 unit of LBA) */
94     uint32_t num_lba;    /* the size of the disk in LBA units */
95     struct part_info *part_lst;
96     int num_parts;
97 };
98 
99 struct write_list {
100     struct write_list *next;
101     loff_t offset;
102     uint32_t len;
103     uint8_t data[0];
104 };
105 
106 
107 struct write_list *alloc_wl(uint32_t data_len);
108 void free_wl(struct write_list *item);
109 struct write_list *wlist_add(struct write_list **lst, struct write_list *item);
110 void wlist_free(struct write_list *lst);
111 int wlist_commit(int fd, struct write_list *lst, int test);
112 
113 struct disk_info *load_diskconfig(const char *fn, char *path_override);
114 int dump_disk_config(struct disk_info *dinfo);
115 int apply_disk_config(struct disk_info *dinfo, int test);
116 char *find_part_device(struct disk_info *dinfo, const char *name);
117 int process_disk_config(struct disk_info *dinfo);
118 struct part_info *find_part(struct disk_info *dinfo, const char *name);
119 
120 int write_raw_image(const char *dst, const char *src, loff_t offset, int test);
121 
122 /* For MBR partition schemes */
123 struct write_list *config_mbr(struct disk_info *dinfo);
124 char *find_mbr_part(struct disk_info *dinfo, const char *name);
125 
126 #ifdef __cplusplus
127 }
128 #endif
129 
130 #endif /* __LIBS_DISKCONFIG_H */
131