Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: src/platform/vboot_reference/cgptlib/cgptlib.c

Issue 2082015: add cgpt framework and attribute support. (Closed) Base URL: ssh://git@chromiumos-git/chromeos
Patch Set: Created 10 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 5
6 #include "cgptlib.h" 6 #include "cgptlib.h"
7 #include <string.h> 7 #include <string.h>
8 #include "cgptlib_internal.h" 8 #include "cgptlib_internal.h"
9 #include "crc32.h" 9 #include "crc32.h"
10 #include "gpt.h" 10 #include "gpt.h"
11 #include "quick_sort.h" 11 #include "quick_sort.h"
12 #include "utility.h" 12 #include "utility.h"
13 13
14 /* Macro to invalidate a GPT header/entries */ 14 /* Macro to invalidate a GPT header/entries */
15 #define INVALIDATE_HEADER(valid_headers, index) \ 15 #define INVALIDATE_HEADER(valid_headers, index) \
16 do { \ 16 do { \
17 debug("- INVALIDATE_HEADER() at %s():%d\n", __FUNCTION__, __LINE__); \
17 valid_headers &= ~(1<<index); \ 18 valid_headers &= ~(1<<index); \
18 } while (0) 19 } while (0)
19 #define INVALIDATE_ENTRIES(valid_entries, index) \ 20 #define INVALIDATE_ENTRIES(valid_entries, index) \
20 do { \ 21 do { \
22 debug("- INVALIDATE_ENTRIES() at %s():%d\n", __FUNCTION__, __LINE__); \
21 valid_entries &= ~(1<<index); \ 23 valid_entries &= ~(1<<index); \
22 } while (0) 24 } while (0)
23 25
26 const char *GptError(int errno) {
27 const char *error_string[] = {
28 /* GPT_SUCCESS */ "Success",
29 /* GPT_ERROR_NO_VALID_KERNEL */ "No valid kernel entry",
30 /* GPT_ERROR_INVALID_HEADERS */ "Invalid headers",
31 /* GPT_ERROR_INVALID_ENTRIES */ "Invalid entries",
32 /* GPT_ERROR_INVALID_SECTOR_SIZE */ "Invalid sector size",
33 /* GPT_ERROR_INVALID_SECTOR_NUMBER */ "Invalid sector number",
34 /* GPT_ERROR_INVALID_UPDATE_TYPE */ "Invalid update type",
35 };
36 return error_string[errno];
37 }
38
24 /* Checks if sector_bytes and drive_sectors are valid values. */ 39 /* Checks if sector_bytes and drive_sectors are valid values. */
25 int CheckParameters(GptData *gpt) { 40 int CheckParameters(GptData *gpt) {
26 /* Currently, we only support 512-byte sector. In the future, we may support 41 /* Currently, we only support 512-byte sector. In the future, we may support
27 * larger sector. */ 42 * larger sector. */
28 if (gpt->sector_bytes != 512) 43 if (gpt->sector_bytes != 512)
29 return GPT_ERROR_INVALID_SECTOR_SIZE; 44 return GPT_ERROR_INVALID_SECTOR_SIZE;
30 45
31 /* The sector number of a drive should be reasonable. If the given value is 46 /* The sector number of a drive should be reasonable. If the given value is
32 * too small to contain basic GPT structure (PMBR + Headers + Entries), 47 * too small to contain basic GPT structure (PMBR + Headers + Entries),
33 * the value is wrong. */ 48 * the value is wrong. */
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 entry->attributes |= (uint64_t)tries << CGPT_ATTRIBUTE_TRIES_OFFSET; 614 entry->attributes |= (uint64_t)tries << CGPT_ATTRIBUTE_TRIES_OFFSET;
600 } 615 }
601 616
602 int GetTries(GptData *gpt, int secondary, int entry_index) { 617 int GetTries(GptData *gpt, int secondary, int entry_index) {
603 GptEntry *entry; 618 GptEntry *entry;
604 entry = GetEntry(gpt, secondary, entry_index); 619 entry = GetEntry(gpt, secondary, entry_index);
605 return (entry->attributes & CGPT_ATTRIBUTE_TRIES_MASK) >> 620 return (entry->attributes & CGPT_ATTRIBUTE_TRIES_MASK) >>
606 CGPT_ATTRIBUTE_TRIES_OFFSET; 621 CGPT_ATTRIBUTE_TRIES_OFFSET;
607 } 622 }
608 623
609 void SetSuccess(GptData *gpt, int secondary, int entry_index, int success) { 624 void SetSuccessful(GptData *gpt, int secondary, int entry_index, int success) {
610 GptEntry *entry; 625 GptEntry *entry;
611 entry = GetEntry(gpt, secondary, entry_index); 626 entry = GetEntry(gpt, secondary, entry_index);
612 627
613 assert(success >= 0 && success <= CGPT_ATTRIBUTE_MAX_SUCCESS); 628 assert(success >= 0 && success <= CGPT_ATTRIBUTE_MAX_SUCCESSFUL);
614 entry->attributes &= ~CGPT_ATTRIBUTE_SUCCESS_MASK; 629 entry->attributes &= ~CGPT_ATTRIBUTE_SUCCESSFUL_MASK;
615 entry->attributes |= (uint64_t)success << CGPT_ATTRIBUTE_SUCCESS_OFFSET; 630 entry->attributes |= (uint64_t)success << CGPT_ATTRIBUTE_SUCCESSFUL_OFFSET;
616 } 631 }
617 632
618 int GetSuccess(GptData *gpt, int secondary, int entry_index) { 633 int GetSuccessful(GptData *gpt, int secondary, int entry_index) {
619 GptEntry *entry; 634 GptEntry *entry;
620 entry = GetEntry(gpt, secondary, entry_index); 635 entry = GetEntry(gpt, secondary, entry_index);
621 return (entry->attributes & CGPT_ATTRIBUTE_SUCCESS_MASK) >> 636 return (entry->attributes & CGPT_ATTRIBUTE_SUCCESSFUL_MASK) >>
622 CGPT_ATTRIBUTE_SUCCESS_OFFSET; 637 CGPT_ATTRIBUTE_SUCCESSFUL_OFFSET;
623 } 638 }
624 639
640 uint32_t GetNumberOfEntries(const GptData *gpt) {
641 GptHeader *header;
642 header = (GptHeader*)gpt->primary_header;
643 return header->number_of_entries;
644 }
645
646
625 /* Compare two priority values. Actually it is a circular priority, which is: 647 /* Compare two priority values. Actually it is a circular priority, which is:
626 * 3 > 2 > 1 > 0, but 0 > 3. (-1 means very low, and anyone is higher than -1) 648 * 3 > 2 > 1 > 0, but 0 > 3. (-1 means very low, and anyone is higher than -1)
627 * 649 *
628 * Return 1 if 'a' has higher priority than 'b'. 650 * Return 1 if 'a' has higher priority than 'b'.
629 */ 651 */
630 int IsHigherPriority(int a, int b) { 652 int IsHigherPriority(int a, int b) {
631 if ((a == 0) && (b == CGPT_ATTRIBUTE_MAX_PRIORITY)) 653 if ((a == 0) && (b == CGPT_ATTRIBUTE_MAX_PRIORITY))
632 return 1; 654 return 1;
633 else if ((a == CGPT_ATTRIBUTE_MAX_PRIORITY) && (b == 0)) 655 else if ((a == CGPT_ATTRIBUTE_MAX_PRIORITY) && (b == 0))
634 return 0; 656 return 0;
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 RepairEntries(gpt, MASK_PRIMARY); 759 RepairEntries(gpt, MASK_PRIMARY);
738 /* Actually two entries are dirty now. 760 /* Actually two entries are dirty now.
739 * Also two headers are dirty because entries_crc32 has been updated. */ 761 * Also two headers are dirty because entries_crc32 has been updated. */
740 gpt->modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 | 762 gpt->modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 |
741 GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES2); 763 GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES2);
742 UpdateCrc(gpt); 764 UpdateCrc(gpt);
743 } 765 }
744 766
745 return GPT_SUCCESS; 767 return GPT_SUCCESS;
746 } 768 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698