OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. | 2 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 * | 5 * |
6 * Alternatively, this software may be distributed under the terms of the | 6 * Alternatively, this software may be distributed under the terms of the |
7 * GNU General Public License ("GPL") version 2 as published by the Free | 7 * GNU General Public License ("GPL") version 2 as published by the Free |
8 * Software Foundation. | 8 * Software Foundation. |
9 */ | 9 */ |
10 | 10 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 "display <gbbaddr> <screen#> - display the screen\n" | 66 "display <gbbaddr> <screen#> - display the screen\n" |
67 "bmpblk info <gbbaddr> <screen#> - print the screen info\n"), | 67 "bmpblk info <gbbaddr> <screen#> - print the screen info\n"), |
68 #endif /* CONFIG_CHROMEOS_BMPBLK */ | 68 #endif /* CONFIG_CHROMEOS_BMPBLK */ |
69 U_BOOT_CMD_MKENT(fmap, 2, 1, do_fmap, | 69 U_BOOT_CMD_MKENT(fmap, 2, 1, do_fmap, |
70 "Find and print flash map", | 70 "Find and print flash map", |
71 "addr len\n - Find and print flash map " | 71 "addr len\n - Find and print flash map " |
72 "in memory[addr, addr+len]\n"), | 72 "in memory[addr, addr+len]\n"), |
73 U_BOOT_CMD_MKENT(load_fw, 3, 1, do_load_fw, | 73 U_BOOT_CMD_MKENT(load_fw, 3, 1, do_load_fw, |
74 "Load firmware from memory " | 74 "Load firmware from memory " |
75 "(you have to download the image before running this)", | 75 "(you have to download the image before running this)", |
76 » » "addr len kkey\n - Wrapper of LoadFirmware." | 76 » » "addr len shdata\n - Wrapper of LoadFirmware." |
77 "Load firmware from [addr, addr+len] and " | 77 "Load firmware from [addr, addr+len] and " |
78 » » "store loaded kernel key at kkey\n"), | 78 » » "store shared data at shdata\n"), |
79 U_BOOT_CMD_MKENT(load_k, 3, 1, do_load_k, | 79 U_BOOT_CMD_MKENT(load_k, 3, 1, do_load_k, |
80 "Load kernel from the boot device", | 80 "Load kernel from the boot device", |
81 » » "addr len kkey\n - Load kernel to [addr, addr+len]\n"), | 81 » » "addr len shdata\n - Load kernel to [addr, addr+len] and\n" |
| 82 » » "modify shared data at shdata\n"), |
82 U_BOOT_CMD_MKENT(help, 1, 1, do_cros_help, | 83 U_BOOT_CMD_MKENT(help, 1, 1, do_cros_help, |
83 "show this message", | 84 "show this message", |
84 "[action]") | 85 "[action]") |
85 }; | 86 }; |
86 | 87 |
87 int do_cros(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) | 88 int do_cros(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
88 { | 89 { |
89 cmd_tbl_t *c; | 90 cmd_tbl_t *c; |
90 | 91 |
91 if (argc < 2) | 92 if (argc < 2) |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 cxt->cur += count; | 379 cxt->cur += count; |
379 | 380 |
380 return count; | 381 return count; |
381 } | 382 } |
382 | 383 |
383 int do_load_fw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) | 384 int do_load_fw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
384 { | 385 { |
385 LoadFirmwareParams params; | 386 LoadFirmwareParams params; |
386 VbNvContext vnc; | 387 VbNvContext vnc; |
387 struct context_t context; | 388 struct context_t context; |
388 » void *gbb, *block[2]; | 389 » void *block[2]; |
389 » GoogleBinaryBlockHeader *gbbh; | |
390 uint64_t *psize[2]; | 390 uint64_t *psize[2]; |
391 VbKeyBlockHeader *kbh; | 391 VbKeyBlockHeader *kbh; |
392 VbFirmwarePreambleHeader *fph; | 392 VbFirmwarePreambleHeader *fph; |
393 int i, status; | 393 int i, status; |
394 firmware_storage_t f = { | 394 firmware_storage_t f = { |
395 .seek = mem_seek, | 395 .seek = mem_seek, |
396 .read = mem_read, | 396 .read = mem_read, |
397 .context = (void *) &context | 397 .context = (void *) &context |
398 }; | 398 }; |
399 | 399 |
400 if (argc != 4) | 400 if (argc != 4) |
401 USAGE(1, cmdtp, "Wrong number of arguments\n"); | 401 USAGE(1, cmdtp, "Wrong number of arguments\n"); |
402 | 402 |
403 context.begin = (void *) simple_strtoul(argv[1], NULL, 16); | 403 context.begin = (void *) simple_strtoul(argv[1], NULL, 16); |
404 context.cur = context.begin; | 404 context.cur = context.begin; |
405 context.end = context.begin + simple_strtoul(argv[2], NULL, 16); | 405 context.end = context.begin + simple_strtoul(argv[2], NULL, 16); |
406 | 406 |
407 GetFirmwareBody_setup(&f, CONFIG_OFFSET_FW_A_DATA, | 407 GetFirmwareBody_setup(&f, CONFIG_OFFSET_FW_A_DATA, |
408 CONFIG_OFFSET_FW_B_DATA); | 408 CONFIG_OFFSET_FW_B_DATA); |
409 | 409 |
410 » gbb = context.begin + CONFIG_OFFSET_GBB; | 410 » params.gbb_data = context.begin + CONFIG_OFFSET_GBB; |
411 » gbbh = (GoogleBinaryBlockHeader *) gbb; | 411 » params.gbb_size = CONFIG_LENGTH_GBB; |
412 » params.firmware_root_key_blob = gbb + gbbh->rootkey_offset; | |
413 | 412 |
414 debug("do_load_fw: params.firmware_root_key_blob:\t%p\n", | 413 debug("do_load_fw: params.firmware_root_key_blob:\t%p\n", |
415 params.firmware_root_key_blob); | 414 params.firmware_root_key_blob); |
416 | 415 |
417 params.verification_block_0 = context.begin + CONFIG_OFFSET_FW_A_KEY; | 416 params.verification_block_0 = context.begin + CONFIG_OFFSET_FW_A_KEY; |
418 params.verification_block_1 = context.begin + CONFIG_OFFSET_FW_B_KEY; | 417 params.verification_block_1 = context.begin + CONFIG_OFFSET_FW_B_KEY; |
419 | 418 |
420 block[0] = params.verification_block_0; | 419 block[0] = params.verification_block_0; |
421 block[1] = params.verification_block_1; | 420 block[1] = params.verification_block_1; |
422 psize[0] = ¶ms.verification_size_0; | 421 psize[0] = ¶ms.verification_size_0; |
423 psize[1] = ¶ms.verification_size_1; | 422 psize[1] = ¶ms.verification_size_1; |
424 for (i = 0; i < 2; i++) { | 423 for (i = 0; i < 2; i++) { |
425 kbh = (VbKeyBlockHeader *) block[i]; | 424 kbh = (VbKeyBlockHeader *) block[i]; |
426 fph = (VbFirmwarePreambleHeader *) | 425 fph = (VbFirmwarePreambleHeader *) |
427 (block[i] + kbh->key_block_size); | 426 (block[i] + kbh->key_block_size); |
428 | 427 |
429 *psize[i] = kbh->key_block_size + fph->preamble_size; | 428 *psize[i] = kbh->key_block_size + fph->preamble_size; |
430 | 429 |
431 debug("do_load_fw: params.verification_block_%d:\t%p\n", | 430 debug("do_load_fw: params.verification_block_%d:\t%p\n", |
432 i, block[i]); | 431 i, block[i]); |
433 debug("do_load_fw: params.verification_size_%d:\t%08llx\n", | 432 debug("do_load_fw: params.verification_size_%d:\t%08llx\n", |
434 i, *psize[i]); | 433 i, *psize[i]); |
435 } | 434 } |
436 | 435 |
437 » params.kernel_sign_key_blob = | 436 » params.shared_data_blob = |
438 (uint8_t *) simple_strtoul(argv[3], NULL, 16); | 437 (uint8_t *) simple_strtoul(argv[3], NULL, 16); |
439 » params.kernel_sign_key_size = LOAD_FIRMWARE_KEY_BLOB_REC_SIZE; | 438 » params.shared_data_size = VB_SHARED_DATA_REC_SIZE; |
440 | 439 |
441 » debug("do_load_fw: params.kernel_sign_key_blob:\t%p\n", | 440 » debug("do_load_fw: params.shared_data_blob:\t%p\n", |
442 » » » params.kernel_sign_key_blob); | 441 » » » params.shared_data_blob); |
443 » debug("do_load_fw: params.kernel_sign_key_size:\t%08llx\n", | 442 » debug("do_load_fw: params.shared_data_size:\t%08llx\n", |
444 » » » params.kernel_sign_key_size); | 443 » » » params.shared_data_size); |
445 | 444 |
446 params.caller_internal = &f; | 445 params.caller_internal = &f; |
447 | 446 |
448 params.boot_flags = 0; | 447 params.boot_flags = 0; |
449 | 448 |
450 /* TODO: load vnc.raw from NV storage */ | 449 /* TODO: load vnc.raw from NV storage */ |
451 params.nv_context = &vnc; | 450 params.nv_context = &vnc; |
452 | 451 |
453 status = LoadFirmware(¶ms); | 452 status = LoadFirmware(¶ms); |
454 | 453 |
(...skipping 30 matching lines...) Expand all Loading... |
485 VbNvContext vnc; | 484 VbNvContext vnc; |
486 block_dev_desc_t *dev_desc; | 485 block_dev_desc_t *dev_desc; |
487 int i, status; | 486 int i, status; |
488 | 487 |
489 if (argc != 4) | 488 if (argc != 4) |
490 USAGE(1, cmdtp, "Wrong number of arguments\n"); | 489 USAGE(1, cmdtp, "Wrong number of arguments\n"); |
491 | 490 |
492 if ((dev_desc = get_bootdev()) == NULL) | 491 if ((dev_desc = get_bootdev()) == NULL) |
493 USAGE(1, cmdtp, "No boot device set yet\n"); | 492 USAGE(1, cmdtp, "No boot device set yet\n"); |
494 | 493 |
495 » par.header_sign_key_blob = | 494 » par.shared_data_blob = |
496 (uint8_t *) simple_strtoul(argv[3], NULL, 16); | 495 (uint8_t *) simple_strtoul(argv[3], NULL, 16); |
| 496 par.shared_data_size = VB_SHARED_DATA_REC_SIZE; |
| 497 |
497 par.bytes_per_lba = (uint64_t) dev_desc->blksz; | 498 par.bytes_per_lba = (uint64_t) dev_desc->blksz; |
498 par.ending_lba = (uint64_t) get_limit() - 1; | 499 par.ending_lba = (uint64_t) get_limit() - 1; |
499 par.kernel_buffer = (void *) simple_strtoul(argv[1], NULL, 16); | 500 par.kernel_buffer = (void *) simple_strtoul(argv[1], NULL, 16); |
500 par.kernel_buffer_size = (uint64_t) simple_strtoul(argv[2], NULL, 16); | 501 par.kernel_buffer_size = (uint64_t) simple_strtoul(argv[2], NULL, 16); |
501 par.boot_flags = BOOT_FLAG_DEVELOPER | BOOT_FLAG_SKIP_ADDR_CHECK; | 502 par.boot_flags = BOOT_FLAG_DEVELOPER | BOOT_FLAG_SKIP_ADDR_CHECK; |
502 | 503 |
| 504 /* TODO: load GBB; see do_load_fw() */ |
| 505 par.gbb_data = NULL; |
| 506 par.gbb_size = 0; |
| 507 |
503 /* TODO: load vnc.raw from NV storage */ | 508 /* TODO: load vnc.raw from NV storage */ |
504 par.nv_context = &vnc; | 509 par.nv_context = &vnc; |
505 | 510 |
506 status = LoadKernel(&par); | 511 status = LoadKernel(&par); |
507 | 512 |
508 if (vnc.raw_changed) { | 513 if (vnc.raw_changed) { |
509 /* TODO: save vnc.raw to NV storage */ | 514 /* TODO: save vnc.raw to NV storage */ |
510 } | 515 } |
511 | 516 |
512 switch (status) { | 517 switch (status) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 return _do_help(&cmd_cros_sub[0], ARRAY_SIZE(cmd_cros_sub), | 556 return _do_help(&cmd_cros_sub[0], ARRAY_SIZE(cmd_cros_sub), |
552 cmdtp, flag, argc, argv); | 557 cmdtp, flag, argc, argv); |
553 | 558 |
554 c = find_cmd_tbl(argv[1], &cmd_cros_sub[0], ARRAY_SIZE(cmd_cros_sub)); | 559 c = find_cmd_tbl(argv[1], &cmd_cros_sub[0], ARRAY_SIZE(cmd_cros_sub)); |
555 if (!c) | 560 if (!c) |
556 USAGE(1, cmdtp, "Unrecognized action: %s\n", argv[1]); | 561 USAGE(1, cmdtp, "Unrecognized action: %s\n", argv[1]); |
557 | 562 |
558 cmd_usage(c); | 563 cmd_usage(c); |
559 return 0; | 564 return 0; |
560 } | 565 } |
OLD | NEW |