summaryrefslogtreecommitdiffstats
blob: d45b99e248727a3a098a8ab5197ca1da59ce004e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* system/core/include/diskconfig/diskconfig.h
 *
 * Copyright 2008, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __LIBS_DISKCONFIG_H
#define __LIBS_DISKCONFIG_H

#include <stdint.h>
#include <sys/types.h>

#ifdef __cplusplus
extern "C" {
#endif

#define MAX_NAME_LEN                 512
#define MAX_NUM_PARTS                16

/* known partition schemes */
#define PART_SCHEME_MBR              0x1
#define PART_SCHEME_GPT              0x2

/* PC Bios partition status */
#define PC_PART_ACTIVE               0x80
#define PC_PART_NORMAL               0x0

/* Known (rather, used by us) partition types */
#define PC_PART_TYPE_LINUX           0x83
#define PC_PART_TYPE_EXTENDED        0x05
#define PC_PART_TYPE_FAT32           0x0c

#define PC_NUM_BOOT_RECORD_PARTS     4

#define PC_EBR_LOGICAL_PART          0
#define PC_EBR_NEXT_PTR_PART         1

#define PC_BIOS_BOOT_SIG             0xAA55

#define PC_MBR_DISK_OFFSET           0
#define PC_MBR_SIZE                  512

#define PART_ACTIVE_FLAG             0x1

struct chs {
    uint8_t head;
    uint8_t sector;
    uint8_t cylinder;
} __attribute__((__packed__));

/* 16 byte pc partition descriptor that sits in MBR and EPBR.
 * Note: multi-byte entities have little-endian layout on disk */
struct pc_partition {
    uint8_t status;     /* byte  0     */
    struct chs start;   /* bytes 1-3   */
    uint8_t type;       /* byte  4     */
    struct chs end;     /* bytes 5-7   */
    uint32_t start_lba; /* bytes 8-11  */
    uint32_t len_lba;   /* bytes 12-15 */
} __attribute__((__packed__));

struct pc_boot_record {
    uint8_t code[440];                                      /* bytes 0-439   */
    uint32_t disk_sig;                                      /* bytes 440-443 */
    uint16_t pad;                                           /* bytes 444-445 */
    struct pc_partition ptable[PC_NUM_BOOT_RECORD_PARTS];   /* bytes 446-509 */
    uint16_t mbr_sig;                                       /* bytes 510-511 */
} __attribute__((__packed__));

struct part_info {
    char *name;
    uint8_t flags;
    uint8_t type;
    uint32_t len_kb;       /* in 1K-bytes */
    uint32_t start_lba;    /* the LBA where this partition begins */
};

struct disk_info {
    char *device;
    uint8_t scheme;
    int sect_size;       /* expected sector size in bytes. MUST BE POWER OF 2 */
    uint32_t skip_lba;   /* in sectors (1 unit of LBA) */
    uint32_t num_lba;    /* the size of the disk in LBA units */
    struct part_info *part_lst;
    int num_parts;
};

struct write_list {
    struct write_list *next;
    loff_t offset;
    uint32_t len;
    uint8_t data[0];
};


struct write_list *alloc_wl(uint32_t data_len);
void free_wl(struct write_list *item);
struct write_list *wlist_add(struct write_list **lst, struct write_list *item);
void wlist_free(struct write_list *lst);
int wlist_commit(int fd, struct write_list *lst, int test);

struct disk_info *load_diskconfig(const char *fn, char *path_override);
int dump_disk_config(struct disk_info *dinfo);
int apply_disk_config(struct disk_info *dinfo, int test);
char *find_part_device(struct disk_info *dinfo, const char *name);
int process_disk_config(struct disk_info *dinfo);
struct part_info *find_part(struct disk_info *dinfo, const char *name);

int write_raw_image(const char *dst, const char *src, loff_t offset, int test);

/* For MBR partition schemes */
struct write_list *config_mbr(struct disk_info *dinfo);
char *find_mbr_part(struct disk_info *dinfo, const char *name);

#ifdef __cplusplus
}
#endif

#endif /* __LIBS_DISKCONFIG_H */