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