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