Home | History | Annotate | Download | only in cgpt

Lines Matching refs:gpt

5  * Utility for ChromeOS-specific GPT partitions, Please see corresponding .c
55 if ((drive->gpt.valid_headers != MASK_BOTH) ||
56 (drive->gpt.valid_entries != MASK_BOTH)) {
57 Warning("One of the GPT headers/entries is invalid\n\n");
149 drive->gpt.sector_bytes = sector_bytes;
150 if (drive->size % drive->gpt.sector_bytes) {
152 (long long unsigned int)drive->size, drive->gpt.sector_bytes);
155 drive->gpt.streaming_drive_sectors = drive->size / drive->gpt.sector_bytes;
158 if (!(drive->gpt.flags & GPT_FLAG_EXTERNAL)) {
159 drive->gpt.gpt_drive_sectors = drive->gpt.streaming_drive_sectors;
160 } /* Else, we trust gpt.gpt_drive_sectors. */
163 if (CGPT_OK != Load(drive, &drive->gpt.primary_header,
165 drive->gpt.sector_bytes, GPT_HEADER_SECTORS)) {
166 Error("Cannot read primary GPT header\n");
169 if (CGPT_OK != Load(drive, &drive->gpt.secondary_header,
170 drive->gpt.gpt_drive_sectors - GPT_PMBR_SECTORS,
171 drive->gpt.sector_bytes, GPT_HEADER_SECTORS)) {
172 Error("Cannot read secondary GPT header\n");
175 GptHeader* primary_header = (GptHeader*)drive->gpt.primary_header;
176 if (CheckHeader(primary_header, 0, drive->gpt.streaming_drive_sectors,
177 drive->gpt.gpt_drive_sectors,
178 drive->gpt.flags) == 0) {
179 if (CGPT_OK != Load(drive, &drive->gpt.primary_entries,
181 drive->gpt.sector_bytes,
187 Warning("Primary GPT header is invalid\n");
189 GptHeader* secondary_header = (GptHeader*)drive->gpt.secondary_header;
190 if (CheckHeader(secondary_header, 1, drive->gpt.streaming_drive_sectors,
191 drive->gpt.gpt_drive_sectors,
192 drive->gpt.flags) == 0) {
193 if (CGPT_OK != Load(drive, &drive->gpt.secondary_entries,
195 drive->gpt.sector_bytes,
201 Warning("Secondary GPT header is invalid\n");
208 if (drive->gpt.modified & GPT_MODIFIED_HEADER1) {
209 if (CGPT_OK != Save(drive, drive->gpt.primary_header,
211 drive->gpt.sector_bytes, GPT_HEADER_SECTORS)) {
217 if (drive->gpt.modified & GPT_MODIFIED_HEADER2) {
218 if(CGPT_OK != Save(drive, drive->gpt.secondary_header,
219 drive->gpt.gpt_drive_sectors - GPT_PMBR_SECTORS,
220 drive->gpt.sector_bytes, GPT_HEADER_SECTORS)) {
225 GptHeader* primary_header = (GptHeader*)drive->gpt.primary_header;
226 if (drive->gpt.modified & GPT_MODIFIED_ENTRIES1) {
227 if (CGPT_OK != Save(drive, drive->gpt.primary_entries,
229 drive->gpt.sector_bytes,
235 GptHeader* secondary_header = (GptHeader*)drive->gpt.secondary_header;
236 if (drive->gpt.modified & GPT_MODIFIED_ENTRIES2) {
237 if (CGPT_OK != Save(drive, drive->gpt.secondary_entries,
239 drive->gpt.sector_bytes,
246 if (drive->gpt.primary_header)
247 free(drive->gpt.primary_header);
248 drive->gpt.primary_header = 0;
249 if (drive->gpt.primary_entries)
250 free(drive->gpt.primary_entries);
251 drive->gpt.primary_entries = 0;
252 if (drive->gpt.secondary_header)
253 free(drive->gpt.secondary_header);
254 drive->gpt.secondary_header = 0;
255 if (drive->gpt.secondary_entries)
256 free(drive->gpt.secondary_entries);
257 drive->gpt.secondary_entries = 0;
317 drive->gpt.gpt_drive_sectors = gpt_drive_size / sector_bytes;
320 drive->gpt.flags = 0;
323 drive->gpt.flags = GPT_FLAG_EXTERNAL;
653 /* Resolves human-readable GPT type.
688 static GptHeader* GetGptHeader(const GptData *gpt) {
689 if (gpt->valid_headers & MASK_PRIMARY)
690 return (GptHeader*)gpt->primary_header;
691 else if (gpt->valid_headers & MASK_SECONDARY)
692 return (GptHeader*)gpt->secondary_header;
698 GptHeader *header = GetGptHeader(&drive->gpt);
705 GptEntry *GetEntry(GptData *gpt, int secondary, uint32_t entry_index) {
706 GptHeader *header = GetGptHeader(gpt);
713 entries = gpt->primary_entries;
715 entries = gpt->secondary_entries;
718 if (gpt->valid_entries & MASK_PRIMARY) {
719 entries = gpt->primary_entries;
721 require(gpt->valid_entries & MASK_SECONDARY);
722 entries = gpt->secondary_entries;
733 entry = GetEntry(&drive->gpt, secondary, entry_index);
739 entry = GetEntry(&drive->gpt, secondary, entry_index);
747 entry = GetEntry(&drive->gpt, secondary, entry_index);
753 entry = GetEntry(&drive->gpt, secondary, entry_index);
761 entry = GetEntry(&drive->gpt, secondary, entry_index);
767 entry = GetEntry(&drive->gpt, secondary, entry_index);
774 entry = GetEntry(&drive->gpt, secondary, entry_index);
779 RepairEntries(&drive->gpt, MASK_PRIMARY);
780 RepairHeader(&drive->gpt, MASK_PRIMARY);
782 drive->gpt.modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 |
784 UpdateCrc(&drive->gpt);
789 entry = GetEntry(&drive->gpt, secondary, index);
795 entry = GetEntry(&drive->gpt, secondary, index);
817 void UpdateCrc(GptData *gpt) {
820 primary_header = (GptHeader*)gpt->primary_header;
821 secondary_header = (GptHeader*)gpt->secondary_header;
823 if (gpt->modified & GPT_MODIFIED_ENTRIES1 &&
829 Crc32(gpt->primary_entries, entries_size);
831 if (gpt->modified & GPT_MODIFIED_ENTRIES2) {
835 Crc32(gpt->secondary_entries, entries_size);
837 if (gpt->modified & GPT_MODIFIED_HEADER1) {
842 if (gpt->modified & GPT_MODIFIED_HEADER2) {
880 uint8_t RepairEntries(GptData *gpt, const uint32_t valid_entries) {
881 /* If we have an alternate GPT header signature, don't overwrite
882 * the secondary GPT with the primary one as that might wipe the
885 GptHeader* h = (GptHeader*)(gpt->primary_header);
889 if (gpt->valid_headers & MASK_PRIMARY) {
890 h = (GptHeader*)gpt->primary_header;
891 } else if (gpt->valid_headers & MASK_SECONDARY) {
892 h = (GptHeader*)gpt->secondary_header;
900 if (memcmp(gpt->primary_entries, gpt->secondary_entries, entries_size)) {
901 memcpy(gpt->secondary_entries, gpt->primary_entries, entries_size);
905 memcpy(gpt->secondary_entries, gpt->primary_entries, entries_size);
908 memcpy(gpt->primary_entries, gpt->secondary_entries, entries_size);
937 uint8_t RepairHeader(GptData *gpt, const uint32_t valid_headers) {
940 primary_header = (GptHeader*)gpt->primary_header;
941 secondary_header = (GptHeader*)gpt->secondary_header;
950 secondary_header->my_lba = gpt->gpt_drive_sectors - 1; /* the last sector */
979 if (GPT_SUCCESS != (gpt_retval = GptSanityCheck(&drive.gpt))) {
990 GptEntry *entry = GetEntry(&drive.gpt, ANY_VALID, i);