Index: common/cmd_cros_bootstub.c |
diff --git a/common/cmd_cros_bootstub.c b/common/cmd_cros_bootstub.c |
index 576bf59f884fa6da78e856ad9710fcac7715ef40..31278c0470a97da6b3c087724cc66bdf6f0e8b2f 100644 |
--- a/common/cmd_cros_bootstub.c |
+++ b/common/cmd_cros_bootstub.c |
@@ -35,11 +35,30 @@ |
#define FIRMWARE_A 1 |
#define FIRMWARE_B 2 |
-int do_cros_bootstub(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
+typedef struct { |
+ int firmware_index; |
sjg
2011/03/02 02:05:23
Comments, if you haven't done it in another CL.
Che-Liang Chiou
2011/03/02 10:39:32
Done.
|
+ uint8_t *firmware_body[2]; |
+} verified_firmware_t; |
+ |
+int load_firmware(int primary_firmware, int boot_flags, |
sjg
2011/03/02 02:05:23
params comment
Che-Liang Chiou
2011/03/02 10:39:32
Done. Copied and edited from later CL.
|
+ void *kernel_sign_key_blob, uint64_t kernel_sign_key_size, |
+ verified_firmware_t *verified_firmware) |
{ |
- int firmware_index, primary_firmware; |
+ return LOAD_FIRMWARE_RECOVERY; |
+} |
- /* Boot Stub ******************************************************** */ |
+void jump_to_firmware(void (*rwfw_entry_point)(void)) |
+{ |
+ debug(PREFIX "jump to firmware %p\n", rwfw_entry_point); |
+} |
+ |
+int do_cros_bootstub(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
sjg
2011/03/02 02:05:23
I think you did tell me where the comment was for
Che-Liang Chiou
2011/03/02 10:39:32
I guess it's in a later CL.
|
+{ |
+ int status = LOAD_FIRMWARE_RECOVERY; |
+ int primary_firmware, boot_flags = 0; |
+ verified_firmware_t vf; |
+ uint8_t *kernel_sign_key_blob = (uint8_t *) CONFIG_KERNEL_SIGN_KEY_BLOB; |
+ uint64_t kernel_sign_key_size = CONFIG_KERNEL_SIGN_KEY_SIZE; |
/* TODO Start initializing chipset */ |
@@ -56,33 +75,38 @@ int do_cros_bootstub(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
if (is_recovery_mode_gpio_asserted() || |
is_recovery_mode_field_containing_cookie()) { |
- firmware_index = FIRMWARE_RECOVERY; |
+ debug(PREFIX "boot recovery firmware\n"); |
} else { |
if (is_try_firmware_b_field_containing_cookie()) |
primary_firmware = FIRMWARE_B; |
else |
primary_firmware = FIRMWARE_A; |
- /* TODO call LoadFirmware */ |
- } |
+ if (is_developer_mode_gpio_asserted()) |
+ boot_flags |= BOOT_FLAG_DEVELOPER; |
- debug(PREFIX "load firmware of index %d\n", firmware_index); |
+ status = load_firmware(primary_firmware, boot_flags, |
+ kernel_sign_key_blob, kernel_sign_key_size, |
+ &vf); |
+ } |
WARN_ON_FAILURE(lock_tpm_rewritable_firmware_index()); |
- if (firmware_index == FIRMWARE_A) { |
- /* TODO Jump to firmware A and should never return */ |
- } |
+ if (status == LOAD_FIRMWARE_SUCCESS) { |
+ debug(PREFIX "jump to rewritable firmware %d " |
+ "and never return\n", |
+ vf.firmware_index); |
+ jump_to_firmware((void (*)(void)) |
sjg
2011/03/02 02:05:23
This is pretty ugly - since you are probably going
Che-Liang Chiou
2011/03/02 10:39:32
I will think about it.
|
+ vf.firmware_body[vf.firmware_index]); |
- if (firmware_index == FIRMWARE_B) { |
- /* TODO Jump to firmware B and should never return */ |
+ debug(PREFIX "error: should never reach here! " |
+ "jump to recovery firmware\n"); |
} |
- /* assert(firmware_index == FIRMWARE_RECOVERY); */ |
- |
- /* Recovery Firmware ************************************************ */ |
+ /* TODO Jump to recovery firmware and never return */ |
- return 0; |
+ debug(PREFIX "error: should never reach here!\n"); |
+ return 1; |
sjg
2011/03/02 02:05:23
-1?
Che-Liang Chiou
2011/03/02 10:39:32
u-boot command's error code uses positive values.
|
} |
U_BOOT_CMD(cros_bootstub, 1, 1, do_cros_bootstub, NULL, NULL); |