| San Mehat | a6391f1 | 2010-03-10 12:46:00 -0800 | [diff] [blame] | 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> | 
| Andrew Boie | 41dfa9b | 2012-07-10 15:05:45 -0700 | [diff] [blame] | 22 | #include <sys/types.h> | 
| San Mehat | a6391f1 | 2010-03-10 12:46:00 -0800 | [diff] [blame] | 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 */ |