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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 | 54 |
55 /* Nothing has changed yet. */ | 55 /* Nothing has changed yet. */ |
56 context->raw_changed = 0; | 56 context->raw_changed = 0; |
57 context->regenerate_crc = 0; | 57 context->regenerate_crc = 0; |
58 | 58 |
59 /* Check data for consistency */ | 59 /* Check data for consistency */ |
60 if ((HEADER_SIGNATURE != (raw[HEADER_OFFSET] & HEADER_MASK)) | 60 if ((HEADER_SIGNATURE != (raw[HEADER_OFFSET] & HEADER_MASK)) |
61 || (Crc8(raw, CRC_OFFSET) != raw[CRC_OFFSET])) { | 61 || (Crc8(raw, CRC_OFFSET) != raw[CRC_OFFSET])) { |
62 | 62 |
63 /* Data is inconsistent (bad CRC or header), so reset defaults */ | 63 /* Data is inconsistent (bad CRC or header), so reset defaults */ |
64 Memset(raw, 0, NV_BLOCK_SIZE); | 64 Memset(raw, 0, VBNV_BLOCK_SIZE); |
65 raw[HEADER_OFFSET] = (HEADER_SIGNATURE | HEADER_FIRMWARE_SETTINGS_RESET | | 65 raw[HEADER_OFFSET] = (HEADER_SIGNATURE | HEADER_FIRMWARE_SETTINGS_RESET | |
66 HEADER_KERNEL_SETTINGS_RESET); | 66 HEADER_KERNEL_SETTINGS_RESET); |
67 | 67 |
68 /* Regenerate CRC on exit */ | 68 /* Regenerate CRC on exit */ |
69 context->regenerate_crc = 1; | 69 context->regenerate_crc = 1; |
70 } | 70 } |
71 | 71 |
72 return 0; | 72 return 0; |
73 } | 73 } |
74 | 74 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 if (value) | 146 if (value) |
147 raw[HEADER_OFFSET] |= HEADER_KERNEL_SETTINGS_RESET; | 147 raw[HEADER_OFFSET] |= HEADER_KERNEL_SETTINGS_RESET; |
148 else | 148 else |
149 raw[HEADER_OFFSET] &= ~HEADER_KERNEL_SETTINGS_RESET; | 149 raw[HEADER_OFFSET] &= ~HEADER_KERNEL_SETTINGS_RESET; |
150 break; | 150 break; |
151 | 151 |
152 case VBNV_DEBUG_RESET_MODE: | 152 case VBNV_DEBUG_RESET_MODE: |
153 if (value) | 153 if (value) |
154 raw[BOOT_OFFSET] |= BOOT_DEBUG_RESET_MODE; | 154 raw[BOOT_OFFSET] |= BOOT_DEBUG_RESET_MODE; |
155 else | 155 else |
156 raw[BOOT_OFFSET] &= BOOT_DEBUG_RESET_MODE; | 156 raw[BOOT_OFFSET] &= ~BOOT_DEBUG_RESET_MODE; |
157 break; | 157 break; |
158 | 158 |
159 case VBNV_TRY_B_COUNT: | 159 case VBNV_TRY_B_COUNT: |
| 160 /* Clip to valid range. */ |
| 161 if (value > BOOT_TRY_B_COUNT) |
| 162 value = BOOT_TRY_B_COUNT - 1; |
| 163 |
160 raw[BOOT_OFFSET] &= ~BOOT_TRY_B_COUNT; | 164 raw[BOOT_OFFSET] &= ~BOOT_TRY_B_COUNT; |
161 raw[BOOT_OFFSET] |= (uint8_t)(value & BOOT_TRY_B_COUNT); | 165 raw[BOOT_OFFSET] |= (uint8_t)value; |
162 break; | 166 break; |
163 | 167 |
164 case VBNV_RECOVERY_REQUEST: | 168 case VBNV_RECOVERY_REQUEST: |
| 169 /* Map values outside the valid range to the legacy reason, since we |
| 170 * can't determine if we're called from kernel or user mode. */ |
| 171 if (value > 0xFF) |
| 172 value = VBNV_RECOVERY_LEGACY; |
165 raw[RECOVERY_OFFSET] = (uint8_t)value; | 173 raw[RECOVERY_OFFSET] = (uint8_t)value; |
166 break; | 174 break; |
167 | 175 |
168 case VBNV_LOCALIZATION_INDEX: | 176 case VBNV_LOCALIZATION_INDEX: |
| 177 /* Map values outside the valid range to the default index. */ |
| 178 if (value > 0xFF) |
| 179 value = 0; |
169 raw[LOCALIZATION_OFFSET] = (uint8_t)value; | 180 raw[LOCALIZATION_OFFSET] = (uint8_t)value; |
170 break; | 181 break; |
171 | 182 |
172 case VBNV_KERNEL_FIELD: | 183 case VBNV_KERNEL_FIELD: |
173 raw[KERNEL_FIELD_OFFSET] = (uint8_t)(value); | 184 raw[KERNEL_FIELD_OFFSET] = (uint8_t)(value); |
174 raw[KERNEL_FIELD_OFFSET + 1] = (uint8_t)(value >> 8); | 185 raw[KERNEL_FIELD_OFFSET + 1] = (uint8_t)(value >> 8); |
175 raw[KERNEL_FIELD_OFFSET + 2] = (uint8_t)(value >> 16); | 186 raw[KERNEL_FIELD_OFFSET + 2] = (uint8_t)(value >> 16); |
176 raw[KERNEL_FIELD_OFFSET + 3] = (uint8_t)(value >> 24); | 187 raw[KERNEL_FIELD_OFFSET + 3] = (uint8_t)(value >> 24); |
177 break; | 188 break; |
178 | 189 |
179 default: | 190 default: |
180 return 1; | 191 return 1; |
181 } | 192 } |
182 | 193 |
183 /* Need to regenerate CRC, since the value changed. */ | 194 /* Need to regenerate CRC, since the value changed. */ |
184 context->regenerate_crc = 1; | 195 context->regenerate_crc = 1; |
185 return 0; | 196 return 0; |
186 } | 197 } |
OLD | NEW |