Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 * Use of this source code is governed by a BSD-style license that can be | 2 * Use of this source code is governed by a BSD-style license that can be |
| 3 * found in the LICENSE file. | 3 * found in the LICENSE file. |
| 4 * | 4 * |
| 5 * Utility for ChromeOS-specific GPT partitions, Please see corresponding .c | 5 * Utility for ChromeOS-specific GPT partitions, Please see corresponding .c |
| 6 * files for more details. | 6 * files for more details. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "cgpt.h" | 9 #include "cgpt.h" |
| 10 | 10 |
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 473 } | 473 } |
| 474 | 474 |
| 475 GptEntry *GetEntry(GptData *gpt, int secondary, uint32_t entry_index) { | 475 GptEntry *GetEntry(GptData *gpt, int secondary, uint32_t entry_index) { |
| 476 uint8_t *entries; | 476 uint8_t *entries; |
| 477 uint32_t stride = GetSizeOfEntries(gpt); | 477 uint32_t stride = GetSizeOfEntries(gpt); |
| 478 require(stride); | 478 require(stride); |
| 479 require(entry_index < GetNumberOfEntries(gpt)); | 479 require(entry_index < GetNumberOfEntries(gpt)); |
| 480 | 480 |
| 481 if (secondary == PRIMARY) { | 481 if (secondary == PRIMARY) { |
| 482 entries = gpt->primary_entries; | 482 entries = gpt->primary_entries; |
| 483 } else { | 483 } else if (secondary == SECONDARY) { |
| 484 entries = gpt->secondary_entries; | 484 entries = gpt->secondary_entries; |
| 485 } else { /* ANY_VALID */ | |
| 486 require(ANY_VALID); | |
|
Bill Richardson
2010/11/17 18:06:24
'require' is just 'assert' that doesn't compile aw
Louis
2010/11/18 01:51:29
This is a typo. Should be "require(secondary==ANY_
| |
| 487 if (gpt->valid_entries & MASK_PRIMARY) { | |
| 488 entries = gpt->primary_entries; | |
| 489 } else { | |
| 490 require(gpt->valid_entries & MASK_SECONDARY); | |
| 491 entries = gpt->secondary_entries; | |
| 492 } | |
| 485 } | 493 } |
| 486 | 494 |
| 487 return (GptEntry*)(&entries[stride * entry_index]); | 495 return (GptEntry*)(&entries[stride * entry_index]); |
| 488 } | 496 } |
| 489 | 497 |
| 490 void SetPriority(GptData *gpt, int secondary, uint32_t entry_index, | 498 void SetPriority(GptData *gpt, int secondary, uint32_t entry_index, |
| 491 int priority) { | 499 int priority) { |
| 492 GptEntry *entry; | 500 GptEntry *entry; |
| 493 entry = GetEntry(gpt, secondary, entry_index); | 501 entry = GetEntry(gpt, secondary, entry_index); |
| 494 require(priority >= 0 && priority <= CGPT_ATTRIBUTE_MAX_PRIORITY); | 502 require(priority >= 0 && priority <= CGPT_ATTRIBUTE_MAX_PRIORITY); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 563 primary_header->entries_crc32 = | 571 primary_header->entries_crc32 = |
| 564 Crc32(gpt->primary_entries, TOTAL_ENTRIES_SIZE); | 572 Crc32(gpt->primary_entries, TOTAL_ENTRIES_SIZE); |
| 565 } | 573 } |
| 566 if (gpt->modified & GPT_MODIFIED_ENTRIES2) { | 574 if (gpt->modified & GPT_MODIFIED_ENTRIES2) { |
| 567 secondary_header->entries_crc32 = | 575 secondary_header->entries_crc32 = |
| 568 Crc32(gpt->secondary_entries, TOTAL_ENTRIES_SIZE); | 576 Crc32(gpt->secondary_entries, TOTAL_ENTRIES_SIZE); |
| 569 } | 577 } |
| 570 if (gpt->modified & GPT_MODIFIED_HEADER1) { | 578 if (gpt->modified & GPT_MODIFIED_HEADER1) { |
| 571 primary_header->header_crc32 = 0; | 579 primary_header->header_crc32 = 0; |
| 572 primary_header->header_crc32 = Crc32( | 580 primary_header->header_crc32 = Crc32( |
| 573 (const uint8_t *)primary_header, primary_header->size); | 581 (const uint8_t *)primary_header, sizeof(GptHeader)); |
| 574 } | 582 } |
| 575 if (gpt->modified & GPT_MODIFIED_HEADER2) { | 583 if (gpt->modified & GPT_MODIFIED_HEADER2) { |
| 576 secondary_header->header_crc32 = 0; | 584 secondary_header->header_crc32 = 0; |
| 577 secondary_header->header_crc32 = Crc32( | 585 secondary_header->header_crc32 = Crc32( |
| 578 (const uint8_t *)secondary_header, secondary_header->size); | 586 (const uint8_t *)secondary_header, sizeof(GptHeader)); |
| 579 } | 587 } |
| 580 } | 588 } |
| 581 /* Two headers are NOT bitwise identical. For example, my_lba pointers to header | 589 /* Two headers are NOT bitwise identical. For example, my_lba pointers to header |
| 582 * itself so that my_lba in primary and secondary is definitely different. | 590 * itself so that my_lba in primary and secondary is definitely different. |
| 583 * Only the following fields should be identical. | 591 * Only the following fields should be identical. |
| 584 * | 592 * |
| 585 * first_usable_lba | 593 * first_usable_lba |
| 586 * last_usable_lba | 594 * last_usable_lba |
| 587 * number_of_entries | 595 * number_of_entries |
| 588 * size_of_entry | 596 * size_of_entry |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 655 | 663 |
| 656 primary_header = (GptHeader*)gpt->primary_header; | 664 primary_header = (GptHeader*)gpt->primary_header; |
| 657 secondary_header = (GptHeader*)gpt->secondary_header; | 665 secondary_header = (GptHeader*)gpt->secondary_header; |
| 658 | 666 |
| 659 if (valid_headers == MASK_BOTH) { | 667 if (valid_headers == MASK_BOTH) { |
| 660 if (!IsSynonymous(primary_header, secondary_header)) { | 668 if (!IsSynonymous(primary_header, secondary_header)) { |
| 661 CopySynonymousParts(secondary_header, primary_header); | 669 CopySynonymousParts(secondary_header, primary_header); |
| 662 return GPT_MODIFIED_HEADER2; | 670 return GPT_MODIFIED_HEADER2; |
| 663 } | 671 } |
| 664 } else if (valid_headers == MASK_PRIMARY) { | 672 } else if (valid_headers == MASK_PRIMARY) { |
| 665 memcpy(secondary_header, primary_header, primary_header->size); | 673 memcpy(secondary_header, primary_header, sizeof(GptHeader)); |
| 666 secondary_header->my_lba = gpt->drive_sectors - 1; /* the last sector */ | 674 secondary_header->my_lba = gpt->drive_sectors - 1; /* the last sector */ |
| 667 secondary_header->alternate_lba = primary_header->my_lba; | 675 secondary_header->alternate_lba = primary_header->my_lba; |
| 668 secondary_header->entries_lba = secondary_header->my_lba - | 676 secondary_header->entries_lba = secondary_header->my_lba - |
| 669 GPT_ENTRIES_SECTORS; | 677 GPT_ENTRIES_SECTORS; |
| 670 return GPT_MODIFIED_HEADER2; | 678 return GPT_MODIFIED_HEADER2; |
| 671 } else if (valid_headers == MASK_SECONDARY) { | 679 } else if (valid_headers == MASK_SECONDARY) { |
| 672 memcpy(primary_header, secondary_header, secondary_header->size); | 680 memcpy(primary_header, secondary_header, sizeof(GptHeader)); |
| 673 primary_header->my_lba = GPT_PMBR_SECTOR; /* the second sector on drive */ | 681 primary_header->my_lba = GPT_PMBR_SECTOR; /* the second sector on drive */ |
| 674 primary_header->alternate_lba = secondary_header->my_lba; | 682 primary_header->alternate_lba = secondary_header->my_lba; |
| 675 primary_header->entries_lba = primary_header->my_lba + GPT_HEADER_SECTOR; | 683 primary_header->entries_lba = primary_header->my_lba + GPT_HEADER_SECTOR; |
| 676 return GPT_MODIFIED_HEADER1; | 684 return GPT_MODIFIED_HEADER1; |
| 677 } | 685 } |
| 678 | 686 |
| 679 return 0; | 687 return 0; |
| 680 } | 688 } |
| 681 | 689 |
| 682 | 690 |
| 683 int IsZero(const Guid *gp) { | 691 int IsZero(const Guid *gp) { |
| 684 return (0 == memcmp(gp, &guid_unused, sizeof(Guid))); | 692 return (0 == memcmp(gp, &guid_unused, sizeof(Guid))); |
| 685 } | 693 } |
| 686 | 694 |
| 687 void PMBRToStr(struct pmbr *pmbr, char *str, unsigned int buflen) { | 695 void PMBRToStr(struct pmbr *pmbr, char *str, unsigned int buflen) { |
| 688 char buf[GUID_STRLEN]; | 696 char buf[GUID_STRLEN]; |
| 689 if (IsZero(&pmbr->boot_guid)) { | 697 if (IsZero(&pmbr->boot_guid)) { |
| 690 require(snprintf(str, buflen, "PMBR") < buflen); | 698 require(snprintf(str, buflen, "PMBR") < buflen); |
| 691 } else { | 699 } else { |
| 692 GuidToStr(&pmbr->boot_guid, buf, sizeof(buf)); | 700 GuidToStr(&pmbr->boot_guid, buf, sizeof(buf)); |
| 693 require(snprintf(str, buflen, "PMBR (Boot GUID: %s)", buf) < buflen); | 701 require(snprintf(str, buflen, "PMBR (Boot GUID: %s)", buf) < buflen); |
| 694 } | 702 } |
| 695 } | 703 } |
| 696 | |
| OLD | NEW |