1 // Copyright 2017 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <gpt/cros.h>
6
7 #include <gpt/gpt.h>
8 #include <string.h>
9
10 namespace libgpt {
11
12 namespace {
13 constexpr uint8_t kPriorityShift = 48;
14 constexpr uint64_t kPriorityMask = 15ull << kPriorityShift;
15
16 constexpr uint8_t kTriesShift = 52;
17 constexpr uint64_t kTriesMask = 15ull << kTriesShift;
18
19 constexpr uint8_t kSuccessfulShift = 56;
20 constexpr uint64_t kSuccessfulMask = 1ull << kSuccessfulShift;
21 } // namespace
22
23 __BEGIN_CDECLS
gpt_cros_is_kernel_guid(const uint8_t * guid,size_t len)24 bool gpt_cros_is_kernel_guid(const uint8_t* guid, size_t len) {
25 static const uint8_t kernel_guid[GPT_GUID_LEN] = GUID_CROS_KERNEL_VALUE;
26 return len == GPT_GUID_LEN && !memcmp(guid, kernel_guid, GPT_GUID_LEN);
27 }
28
gpt_cros_attr_get_successful(uint64_t flags)29 bool gpt_cros_attr_get_successful(uint64_t flags) {
30 return flags & kSuccessfulMask;
31 }
32
gpt_cros_attr_set_successful(uint64_t * flags,bool successful)33 void gpt_cros_attr_set_successful(uint64_t* flags, bool successful) {
34 *flags = (*flags & ~kSuccessfulMask) | ((uint64_t)successful << kSuccessfulShift);
35 }
36
gpt_cros_attr_get_tries(uint64_t flags)37 uint8_t gpt_cros_attr_get_tries(uint64_t flags) {
38 return (flags & kTriesMask) >> kTriesShift;
39 }
40
gpt_cros_attr_set_tries(uint64_t * flags,uint8_t tries)41 int gpt_cros_attr_set_tries(uint64_t* flags, uint8_t tries) {
42 if (tries >= 16) {
43 return -1;
44 }
45
46 *flags = (*flags & ~kTriesMask) | ((uint64_t)tries << kTriesShift);
47 return 0;
48 }
49
gpt_cros_attr_get_priority(uint64_t flags)50 uint8_t gpt_cros_attr_get_priority(uint64_t flags) {
51 return (flags & kPriorityMask) >> kPriorityShift;
52 }
53
gpt_cros_attr_set_priority(uint64_t * flags,uint8_t priority)54 int gpt_cros_attr_set_priority(uint64_t* flags, uint8_t priority) {
55 if (priority >= 16) {
56 return -1;
57 }
58
59 *flags = (*flags & ~kPriorityMask) | ((uint64_t)priority << kPriorityShift);
60 return 0;
61 }
62
63 __END_CDECLS
64 } // namespace libgpt
65