| 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 |