| /* 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 */ |