1e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki/* 2e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * Copyright (c) 2009-2013, Google Inc. 3e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * All rights reserved. 4e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * 5e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * Redistribution and use in source and binary forms, with or without 6e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * modification, are permitted provided that the following conditions 7e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * are met: 8e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * * Redistributions of source code must retain the above copyright 9e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * notice, this list of conditions and the following disclaimer. 10e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * * Redistributions in binary form must reproduce the above copyright 11e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * notice, this list of conditions and the following disclaimer in 12e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * the documentation and/or other materials provided with the 13e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * distribution. 14e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * * Neither the name of Google, Inc. nor the names of its contributors 15e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * may be used to endorse or promote products derived from this 16e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * software without specific prior written permission. 17e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * 18e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 24e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 25e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 26e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 28e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki * SUCH DAMAGE. 30e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki */ 31e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 32e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 33e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki#ifndef __FASTBOOTD_PATITIONS_ 34e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki#define __FASTBOOTD_PATITIONS_ 35e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 36e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki#include <stdint.h> 37e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 38e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki#define GPT_ENTRIES 128 39e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki#define GPT_NAMELEN 36 40e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 41bc7cbfd4e35a143540d9971c788d62ceda934efdSzymon Starzycki#define GPT_FLAG_SYSTEM (1ULL << 0) 42bc7cbfd4e35a143540d9971c788d62ceda934efdSzymon Starzycki#define GPT_FLAG_BOOTABLE (1ULL << 2) 43bc7cbfd4e35a143540d9971c788d62ceda934efdSzymon Starzycki#define GPT_FLAG_READONLY (1ULL << 60) 44bc7cbfd4e35a143540d9971c788d62ceda934efdSzymon Starzycki#define GPT_FLAG_DOAUTOMOUNT (1ULL << 63) 45bc7cbfd4e35a143540d9971c788d62ceda934efdSzymon Starzycki 46e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki// it should be passed in little endian order 47e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckistruct GPT_entry_raw { 48e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint8_t type_guid[16]; 49e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint8_t partition_guid[16]; 50e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint64_t first_lba; // little endian 51e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint64_t last_lba; 52e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint64_t flags; 53e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint16_t name[GPT_NAMELEN]; // UTF-16 LE 54e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki}; 55e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 56e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckistruct GPT_mapping { 57e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki void *map_ptr; 58e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki void *ptr; 59e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki unsigned size; 60e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki}; 61e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 62e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckistruct GPT_entry_table { 63e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki int fd; 64e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 65e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki struct GPT_mapping header_map; 66e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki struct GPT_mapping entries_map; 67e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki struct GPT_mapping sec_header_map; 68e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki struct GPT_mapping sec_entries_map; 69e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 70e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki struct GPT_header *header; 71e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki struct GPT_entry_raw *entries; 72e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki struct GPT_header *second_header; 73e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki struct GPT_entry_raw *second_entries; 74e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 75e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki unsigned sector_size; 76e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki unsigned partition_table_size; 77e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki int second_valid; 78e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki}; 79e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 80e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckistruct GPT_header { 81e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint8_t signature[8]; 82e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint32_t revision; 83e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint32_t header_size; 84e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint32_t header_checksum; 85e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint32_t reserved_zeros; 86e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint64_t current_lba; 87e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint64_t backup_lba; 88e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint64_t first_usable_lba; 89e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint64_t last_usable_lba; 90e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint8_t disk_guid[16]; 91e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint64_t entries_lba; 92e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint32_t entries_count; 93e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint32_t entry_size; 94e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki uint32_t partition_array_checksum; 95e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki // the rest should be filled with zeros 96e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki} __attribute__((packed)); 97e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 98e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckistruct GPT_content { 99e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki struct GPT_header header; 100e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki struct GPT_entry_raw *entries; 101e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki}; 102e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 103e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 104e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckistruct GPT_entry_table* GPT_get_device(const char *, unsigned lba); 105e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 106e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckivoid GPT_release_device(struct GPT_entry_table *); 107e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 108e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckivoid GPT_edit_entry(struct GPT_entry_table *table, 109e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki struct GPT_entry_raw *old_entry, 110e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki struct GPT_entry_raw *new_entry); 111e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 112e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckiint GPT_delete_entry(struct GPT_entry_table *table, struct GPT_entry_raw *entry); 113e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 114e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckivoid GPT_add_entry(struct GPT_entry_table *table, struct GPT_entry_raw *entry); 115e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 116e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckistruct GPT_entry_raw *GPT_get_pointer(struct GPT_entry_table *table, struct GPT_entry_raw *entry); 117e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckistruct GPT_entry_raw *GPT_get_pointer_by_guid(struct GPT_entry_table *, const char *); 118e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckistruct GPT_entry_raw *GPT_get_pointer_by_name(struct GPT_entry_table *, const char *); 119e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 120e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki//Use after every edit operation 121e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckivoid GPT_sync(); 122e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 123e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckivoid GPT_to_UTF16(uint16_t *, const char *, int ); 124e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckivoid GPT_from_UTF16(char *, const uint16_t *, int); 125e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 126e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckiint GPT_parse_entry(char *string, struct GPT_entry_raw *entry); 127e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 128e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckivoid GPT_default_content(struct GPT_content *content, struct GPT_entry_table *table); 129e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 130e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckivoid GPT_release_content(struct GPT_content *content); 131e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 132e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckiint GPT_parse_file(int fd, struct GPT_content *content); 133e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 134e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckiint GPT_write_content(const char *device, struct GPT_content *content); 135e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 136e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckiint gpt_mmap(struct GPT_mapping *mapping, uint64_t location, int size, int fd); 137e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 138e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzyckivoid gpt_unmap(struct GPT_mapping *mapping); 139e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki 140e160f81713034e1b5cfa6f8d8b47870b47ae84c8Szymon Starzycki#endif 141