OLD | NEW |
1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 # Copyright (c) 2010 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 import glob, hashlib, logging, os, pprint, re, sys | 5 import glob, hashlib, logging, os, pprint, re, sys |
6 from autotest_lib.client.bin import test, utils | 6 from autotest_lib.client.bin import test, utils |
7 from autotest_lib.client.common_lib import error | 7 from autotest_lib.client.common_lib import error |
8 from autotest_lib.client.common_lib import flashrom_util | 8 from autotest_lib.client.common_lib import flashrom_util |
9 from autotest_lib.client.common_lib import site_vblock | 9 from autotest_lib.client.common_lib import site_vblock |
10 | 10 |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 Returns a hash of Read Only firmware parts, | 232 Returns a hash of Read Only firmware parts, |
233 to confirm we have proper keys / boot code / recovery image installed. | 233 to confirm we have proper keys / boot code / recovery image installed. |
234 """ | 234 """ |
235 # hash_ro_list: RO section to be hashed | 235 # hash_ro_list: RO section to be hashed |
236 hash_ro_list = ['FV_BSTUB', 'FV_GBB', 'FVDEV'] | 236 hash_ro_list = ['FV_BSTUB', 'FV_GBB', 'FVDEV'] |
237 flashrom = flashrom_util.flashrom_util() | 237 flashrom = flashrom_util.flashrom_util() |
238 if not flashrom.select_bios_flashrom(): | 238 if not flashrom.select_bios_flashrom(): |
239 raise error.TestError('Cannot select BIOS flashrom') | 239 raise error.TestError('Cannot select BIOS flashrom') |
240 base_img = flashrom.read_whole() | 240 base_img = flashrom.read_whole() |
241 flashrom_size = len(base_img) | 241 flashrom_size = len(base_img) |
242 layout = flashrom.detect_chromeos_bios_layout(flashrom_size) | 242 # XXX we can NOT trust base image here for layout, otherwise firmware |
| 243 # can provide fake (non-used) GBB/BSTUB in garbage area. |
| 244 layout = flashrom.detect_chromeos_bios_layout(flashrom_size, None) |
243 if not layout: | 245 if not layout: |
244 raise error.TestError('Cannot detect ChromeOS flashrom laout') | 246 raise error.TestError('Cannot detect ChromeOS flashrom laout') |
245 hash_src = '' | 247 hash_src = '' |
246 for section in hash_ro_list: | 248 for section in hash_ro_list: |
247 src = flashrom.get_section(base_img, layout, section) | 249 src = flashrom.get_section(base_img, layout, section) |
248 if not src: | 250 if not src: |
249 raise error.TestError('Cannot get section [%s] from flashrom' % | 251 raise error.TestError('Cannot get section [%s] from flashrom' % |
250 section) | 252 section) |
251 hash_src = hash_src + src | 253 hash_src = hash_src + src |
252 if not hash_src: | 254 if not hash_src: |
253 raise error.TestError('Invalid hash source from flashrom.') | 255 raise error.TestError('Invalid hash source from flashrom.') |
254 return hashlib.sha256(hash_src).hexdigest() | 256 return hashlib.sha256(hash_src).hexdigest() |
255 | 257 |
256 | 258 |
257 def get_version_rw_firmware(self): | 259 def get_version_rw_firmware(self): |
258 """ | 260 """ |
259 Returns the version of Read-Write (writable) firmware from VBOOT | 261 Returns the version of Read-Write (writable) firmware from VBOOT |
260 section. If A/B has different version, that means this system | 262 section. If A/B has different version, that means this system |
261 needs a reboot + firmwar update so return value is a "error report" | 263 needs a reboot + firmwar update so return value is a "error report" |
262 in the form "A=x, B=y". | 264 in the form "A=x, B=y". |
263 """ | 265 """ |
264 versions = [None, None] | 266 versions = [None, None] |
265 section_names = ['VBOOTA', 'VBOOTB'] | 267 section_names = ['VBOOTA', 'VBOOTB'] |
266 flashrom = flashrom_util.flashrom_util() | 268 flashrom = flashrom_util.flashrom_util() |
267 if not flashrom.select_bios_flashrom(): | 269 if not flashrom.select_bios_flashrom(): |
268 raise error.TestError('Cannot select BIOS flashrom') | 270 raise error.TestError('Cannot select BIOS flashrom') |
269 base_img = flashrom.read_whole() | 271 base_img = flashrom.read_whole() |
270 flashrom_size = len(base_img) | 272 flashrom_size = len(base_img) |
271 layout = flashrom.detect_chromeos_bios_layout(flashrom_size) | 273 # we can trust base image for layout, since it's only RW. |
| 274 layout = flashrom.detect_chromeos_bios_layout(flashrom_size, base_imge) |
272 if not layout: | 275 if not layout: |
273 raise error.TestError('Cannot detect ChromeOS flashrom laout') | 276 raise error.TestError('Cannot detect ChromeOS flashrom laout') |
274 for index, name in enumerate(section_names): | 277 for index, name in enumerate(section_names): |
275 data = flashrom.get_section(base_img, layout, name) | 278 data = flashrom.get_section(base_img, layout, name) |
276 block = site_vblock.unpack_verification_block(data) | 279 block = site_vblock.unpack_verification_block(data) |
277 ver = block['VbFirmwarePreambleHeader']['firmware_version'] | 280 ver = block['VbFirmwarePreambleHeader']['firmware_version'] |
278 versions[index] = ver | 281 versions[index] = ver |
279 # we embed error reports in return value. | 282 # we embed error reports in return value. |
280 assert len(versions) == 2 | 283 assert len(versions) == 2 |
281 if versions[0] != versions[1]: | 284 if versions[0] != versions[1]: |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 if self._failures: | 344 if self._failures: |
342 all_failures += 'Approved DB: %s' % db | 345 all_failures += 'Approved DB: %s' % db |
343 all_failures += self.pformat(self._failures) | 346 all_failures += self.pformat(self._failures) |
344 else: | 347 else: |
345 # If one of DBs is matched, record the hwqual_id and exit. | 348 # If one of DBs is matched, record the hwqual_id and exit. |
346 self.write_test_keyval( | 349 self.write_test_keyval( |
347 {'hwqual_id': self._approved['part_id_hwqual'][0]}) | 350 {'hwqual_id': self._approved['part_id_hwqual'][0]}) |
348 return | 351 return |
349 | 352 |
350 raise error.TestFail(all_failures) | 353 raise error.TestFail(all_failures) |
OLD | NEW |