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#define PRIORITY_SHIFT 48
11#define PRIORITY_MASK (15ull << PRIORITY_SHIFT)
12
13#define TRIES_SHIFT 52
14#define TRIES_MASK (15ull << TRIES_SHIFT)
15
16#define SUCCESSFUL_SHIFT 56
17#define SUCCESSFUL_MASK (1ull << SUCCESSFUL_SHIFT)
18
19bool gpt_cros_is_kernel_guid(const uint8_t* guid, size_t len) {
20    static const uint8_t kernel_guid[GPT_GUID_LEN] = GUID_CROS_KERNEL_VALUE;
21    return len == GPT_GUID_LEN && !memcmp(guid, kernel_guid, GPT_GUID_LEN);
22}
23
24bool gpt_cros_attr_get_successful(uint64_t flags) {
25    return flags & SUCCESSFUL_MASK;
26}
27
28void gpt_cros_attr_set_successful(uint64_t* flags, bool successful) {
29    *flags = (*flags & ~SUCCESSFUL_MASK) | ((uint64_t)successful << SUCCESSFUL_SHIFT);
30}
31
32uint8_t gpt_cros_attr_get_tries(uint64_t flags) {
33    return (flags & TRIES_MASK) >> TRIES_SHIFT;
34}
35
36int gpt_cros_attr_set_tries(uint64_t* flags, uint8_t tries) {
37    if (tries >= 16) {
38        return -1;
39    }
40
41    *flags = (*flags & ~TRIES_MASK) | ((uint64_t)tries << TRIES_SHIFT);
42    return 0;
43}
44
45uint8_t gpt_cros_attr_get_priority(uint64_t flags) {
46    return (flags & PRIORITY_MASK) >> PRIORITY_SHIFT;
47}
48
49int gpt_cros_attr_set_priority(uint64_t* flags, uint8_t priority) {
50    if (priority >= 16) {
51        return -1;
52    }
53
54    *flags = (*flags & ~PRIORITY_MASK) | ((uint64_t)priority << PRIORITY_SHIFT);
55    return 0;
56}
57