OLD | NEW |
1 /* Copyright (c) 2011 The Chromium OS Authors. All rights reserved. | 1 /* Copyright (c) 2011 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 /* Non-volatile storage routines. | 6 /* Non-volatile storage routines. |
7 */ | 7 */ |
8 | 8 |
9 #include "utility.h" | 9 #include "utility.h" |
10 #include "vboot_common.h" | 10 #include "vboot_common.h" |
(...skipping 11 matching lines...) Expand all Loading... |
22 #define BOOT_OFFSET 1 | 22 #define BOOT_OFFSET 1 |
23 #define BOOT_DEBUG_RESET_MODE 0x80 | 23 #define BOOT_DEBUG_RESET_MODE 0x80 |
24 #define BOOT_TRY_B_COUNT_MASK 0x0F | 24 #define BOOT_TRY_B_COUNT_MASK 0x0F |
25 | 25 |
26 #define RECOVERY_OFFSET 2 | 26 #define RECOVERY_OFFSET 2 |
27 #define LOCALIZATION_OFFSET 3 | 27 #define LOCALIZATION_OFFSET 3 |
28 | 28 |
29 #define FIRMWARE_FLAGS_OFFSET 5 | 29 #define FIRMWARE_FLAGS_OFFSET 5 |
30 #define FIRMWARE_TRIED_FIRMWARE_B 0x80 | 30 #define FIRMWARE_TRIED_FIRMWARE_B 0x80 |
31 #define FIRMWARE_FW_VERIFIED_KERNEL_KEY 0x40 | 31 #define FIRMWARE_FW_VERIFIED_KERNEL_KEY 0x40 |
| 32 #define FIRMWARE_TEST_ERR_FUNC_MASK 0x38 |
| 33 #define FIRMWARE_TEST_ERR_FUNC_SHIFT 3 |
| 34 #define FIRMWARE_TEST_ERR_NUM_MASK 0x07 |
32 | 35 |
33 #define KERNEL_FIELD_OFFSET 11 | 36 #define KERNEL_FIELD_OFFSET 11 |
34 #define CRC_OFFSET 15 | 37 #define CRC_OFFSET 15 |
35 | 38 |
36 | 39 |
37 /* Return CRC-8 of the data, using x^8 + x^2 + x + 1 polynomial. A | 40 /* Return CRC-8 of the data, using x^8 + x^2 + x + 1 polynomial. A |
38 * table-based algorithm would be faster, but for only 15 bytes isn't | 41 * table-based algorithm would be faster, but for only 15 bytes isn't |
39 * worth the code size. */ | 42 * worth the code size. */ |
40 static uint8_t Crc8(const uint8_t* data, int len) { | 43 static uint8_t Crc8(const uint8_t* data, int len) { |
41 unsigned crc = 0; | 44 unsigned crc = 0; |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 | 130 |
128 case VBNV_TRIED_FIRMWARE_B: | 131 case VBNV_TRIED_FIRMWARE_B: |
129 *dest = (raw[FIRMWARE_FLAGS_OFFSET] & FIRMWARE_TRIED_FIRMWARE_B ? 1 : 0); | 132 *dest = (raw[FIRMWARE_FLAGS_OFFSET] & FIRMWARE_TRIED_FIRMWARE_B ? 1 : 0); |
130 return 0; | 133 return 0; |
131 | 134 |
132 case VBNV_FW_VERIFIED_KERNEL_KEY: | 135 case VBNV_FW_VERIFIED_KERNEL_KEY: |
133 *dest = (raw[FIRMWARE_FLAGS_OFFSET] & FIRMWARE_FW_VERIFIED_KERNEL_KEY ? | 136 *dest = (raw[FIRMWARE_FLAGS_OFFSET] & FIRMWARE_FW_VERIFIED_KERNEL_KEY ? |
134 1 : 0); | 137 1 : 0); |
135 return 0; | 138 return 0; |
136 | 139 |
| 140 case VBNV_TEST_ERROR_FUNC: |
| 141 *dest = (raw[FIRMWARE_FLAGS_OFFSET] & FIRMWARE_TEST_ERR_FUNC_MASK) |
| 142 >> FIRMWARE_TEST_ERR_FUNC_SHIFT; |
| 143 return 0; |
| 144 |
| 145 case VBNV_TEST_ERROR_NUM: |
| 146 *dest = raw[FIRMWARE_FLAGS_OFFSET] & FIRMWARE_TEST_ERR_NUM_MASK; |
| 147 return 0; |
| 148 |
137 default: | 149 default: |
138 return 1; | 150 return 1; |
139 } | 151 } |
140 } | 152 } |
141 | 153 |
142 | 154 |
143 int VbNvSet(VbNvContext* context, VbNvParam param, uint32_t value) { | 155 int VbNvSet(VbNvContext* context, VbNvParam param, uint32_t value) { |
144 uint8_t* raw = context->raw; | 156 uint8_t* raw = context->raw; |
145 uint32_t current; | 157 uint32_t current; |
146 | 158 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 raw[FIRMWARE_FLAGS_OFFSET] &= ~FIRMWARE_TRIED_FIRMWARE_B; | 220 raw[FIRMWARE_FLAGS_OFFSET] &= ~FIRMWARE_TRIED_FIRMWARE_B; |
209 break; | 221 break; |
210 | 222 |
211 case VBNV_FW_VERIFIED_KERNEL_KEY: | 223 case VBNV_FW_VERIFIED_KERNEL_KEY: |
212 if (value) | 224 if (value) |
213 raw[FIRMWARE_FLAGS_OFFSET] |= FIRMWARE_FW_VERIFIED_KERNEL_KEY; | 225 raw[FIRMWARE_FLAGS_OFFSET] |= FIRMWARE_FW_VERIFIED_KERNEL_KEY; |
214 else | 226 else |
215 raw[FIRMWARE_FLAGS_OFFSET] &= ~FIRMWARE_FW_VERIFIED_KERNEL_KEY; | 227 raw[FIRMWARE_FLAGS_OFFSET] &= ~FIRMWARE_FW_VERIFIED_KERNEL_KEY; |
216 break; | 228 break; |
217 | 229 |
| 230 case VBNV_TEST_ERROR_FUNC: |
| 231 raw[FIRMWARE_FLAGS_OFFSET] &= ~FIRMWARE_TEST_ERR_FUNC_MASK; |
| 232 raw[FIRMWARE_FLAGS_OFFSET] |= (value << FIRMWARE_TEST_ERR_FUNC_SHIFT) |
| 233 & FIRMWARE_TEST_ERR_FUNC_MASK; |
| 234 break; |
| 235 |
| 236 case VBNV_TEST_ERROR_NUM: |
| 237 raw[FIRMWARE_FLAGS_OFFSET] &= ~FIRMWARE_TEST_ERR_NUM_MASK; |
| 238 raw[FIRMWARE_FLAGS_OFFSET] |= (value & FIRMWARE_TEST_ERR_NUM_MASK); |
| 239 break; |
| 240 |
218 default: | 241 default: |
219 return 1; | 242 return 1; |
220 } | 243 } |
221 | 244 |
222 /* Need to regenerate CRC, since the value changed. */ | 245 /* Need to regenerate CRC, since the value changed. */ |
223 context->regenerate_crc = 1; | 246 context->regenerate_crc = 1; |
224 return 0; | 247 return 0; |
225 } | 248 } |
OLD | NEW |